which included commits to RCS files with non-trunk default branches.
--- /dev/null
+Twoja Era:d=8,o=6,s=N,b=160,l=0:g5,c,g,2f,2e,2p,p,g5,c,g,2f,2e,2p,4p,h5,g5,2d.5,4p,2p,p,g5,c,g,2f,2e,2p,p,g5,c,g,2f,2e,2p,4p,h5,g5,2d.5,4p
\ No newline at end of file
--- /dev/null
+In subdirs there are original ringtones and SMS tones
+from various Nokia phones. They're saved in special
+binary format used in phone's firmware. You can download them to your phone,
+if it has downloadable ringtone(s) - use
+"gnokii --setbinringtone file [location]". I tested Nokia 6150 5.22 and it was
+OK. I hope, that Nokia will not change this format and you will be able to
+use it with new phones too (update: 3310 seems to have different format).
+
+I also noticed, that with Nokia 6150 some ringtones required small changes
+(inserting space (0x20 char) after name displayed in phone's menu).
+Maximal length of names for this phone is 12 chars (that's why "Moon & clouds"
+is only "Moon & cloud", "Mexican Hat Dance" -> "Mexican Dance",
+"Piano concerto" -> "Piano concer", "WalzeBrillant" -> "WalzeBrilla")
+
+I wasn't also to restore Badinerie, Tchaikovsky,
+Entertainer, Valkyrie, Four seasons, Auld lang syne, Bumblebee,
+Brave Scotland, Liszt, Hungarian, Left Hand
+(I had it in the file - it was no problem to save
+it), because it was too long (ringtones in phone's firmware in flash
+can be infinitely long, downloadable not - frame can be 317 chars long
+only)... I had to short name in "Swan Lake" to "Swan" because of it...
+
+In Get_Cool,Sunny_Walks,Tick tick ringtones there is and error - small
+"pyk" on the end. It's not my fault, it was made by Nokia...
+
+Similiary Hopping-down seems to cut (next Nokia fault ?)...
+
+PS. I didn't compared many of these ringtones with original phones.
+If there are differences, please let me know (my files could be broken too)
+
+PS2. I tried to understand this format, but I didn't make it at all (too small
+free time, etc.). Here are some observations:
+
+Format is used by 0x40/0x9e and 0x40/0xa0 frames. General format is:
+
+0x00,0x01,0xa0(0x9e),location,0x00,0xc1,0x01,?,name,0x00,0x00,0x02,
+commands and tones?each probably in two bytes?,0x0b
+
+where: location=0x00,0x01,etc.
+ name=name in ASCII displayed in menu
+
+If phone doesn't find 0xc1,0x01,? bytes in 7,8,9 byte, don't display ringtone
+name and treat them (if there are next) as ringtone contenst
+
+Marcin-Wiacek@Topnet.PL
\ No newline at end of file
--- /dev/null
+http://www.gsmcity.de/cgi-bin/ultimatebb.cgi?ubb=get_topic&f=1&t=001084&counterhit=yes
+03.09.2001 19:00
+
+ can i change the original ringtones on 5110? i've heard that
+ with datasuite u can change the ringtones. pls let me know
+ regards
+ --------------------
+ ---I'M UNIQUE AND SO IS MY PHONE---
+ -- sms,logos,soft,ringtones and many more free --
+
+
+ Posts: 247 | From: Bucharest,Romania | Registered: May 2001 |
+ IP:
+
+ azywerks
+ Newbie
+
+ posted 09 June 2001 18:58
+
+ No.
+ You can add/change 1 ringtone (Received tone) for a 61XX phone
+ using Datasuite though.
+
+ aCe
+
+
+ IP:
+
+ mrENigma
+ Moderator
+
+ Member # 4409
+ Member Rated:
+ posted 09 June 2001 19:01
+
+
+ TOO BAD!!!!
+ IS ANY WAY TO DO THIS? ON ANY NOKIA HANDY???
+ --------------------
+ ---I'M UNIQUE AND SO IS MY PHONE---
+ -- sms,logos,soft,ringtones and many more free --
+
+
+ Posts: 247 | From: Bucharest,Romania | Registered: May 2001 |
+ IP:
+
+ azywerks
+ Newbie
+
+ posted 09 June 2001 19:48
+
+ Except for the downloaded ringtones which is available to most
+ nokia phones(GSM) except 5110, no.
+ Maybe if you can understand the two byte(i guess, or was it
+ four) sequence for the tones notation in the PPM section and
+ have it manually changed to a tone of your desire then your
+ probably half way there.
+ The other half would then be spent on how to get your phone to
+ accept the new PPM package you've just made without causing
+ any problems like Contact Service, sim locks, and Network
+ Access. Heck, I can't even change just the simple "Insert"
+ from "Insert SIM Card" to tresnI without causing my phone to
+ display Contact Service. Must have some security data
+ elsewhere.
+
+ Anyway, we'll keep on trying.
+
+ aCe
+
+
+ IP:
+
+ zizo
+ Freak Poster
+
+ Member # 2631
+ Member Rated:
+ posted 10 June 2001 00:32
+
+ Hi mrENigma!
+ U can not change a ringtone on your phone, U have only I think
+ 2 byte free memory there u can recive one ringtone on it.
+ Good luck!
+ --------------------
+ /Z
+
+
+ Posts: 102 | From: Sweden | Registered: Nov 2000 | IP:
+
+ mrENigma
+ Moderator
+
+ Member # 4409
+ Member Rated:
+ posted 10 June 2001 20:44
+
+ even if i erase some of them? 10 originals for one of mine
+ it's kind a stupid can't do this....
+ --------------------
+ ---I'M UNIQUE AND SO IS MY PHONE---
+ -- sms,logos,soft,ringtones and many more free --
+
+
+ Posts: 247 | From: Bucharest,Romania | Registered: May 2001 |
+ IP:
+
+ Ice Dragon
+ Freak Poster
+
+ Member # 3365
+ Member Rated:
+ posted 14 June 2001 03:23
+
+
+ quote:
+
+ Originally posted by mrENigma:
+ even if i erase some of them? 10 originals for one of mine
+ it's kind a stupid can't do this....
+
+
+ Well, I have a post of this a while (months) ago.
+ It's not possible to ADD TONES to the Nokia 5110 but it is
+ possible to CHANGE TONES on the Nokia 5110.
+ Well, changing RING TONES is a bit hard but changing ALERT
+ TONES is relatively easier to do.
+ Of course us all Nokia users can add ring tones to phone like
+ the 61xx, 6210, 3210, 33xx, etc. but I bet most of our alert
+ tones are all the same.
+ The beep, the standard (which is a dit-dit tone), the special
+ (which is a dit-dit-dit-dat-dat-dit-dit-dit, which is actually
+ a Morse code for "SMS"), and the ascending (which is actualy a
+ Morse code for "connecting people") are the same to all Nokia
+ phones unless there is one I don't know about.
+ Anyway, have any of you once experienced when on a crowd when
+ a SMS message came and most people around you have Nokia
+ phones (riding a bus for example or on a bar).
+ Some of us would check their phone if it was for them, like I
+ did.
+ So I changed my standard tone which is a dit-dit to dit-dat to
+ sound differently. And my special tone from
+ dit-dit-dit-dat-dat-dit-dit-dit to
+ dat-dit-dit-dit-dat-dit-dit-dit (which sounds like "Who let
+ the dogs out" with dit-dit-dit at the end). So when I myself
+ received a message, I know that it's for me coz I only have to
+ take note of the tone.
+ Too bad, Viper stopped his research with the NFREE project. I
+ have been inquiring about the checksums but he's no longer
+ responding. So I guess I have to do this on my own.
+ I'm coming up with a software to change the ringtone on the
+ 5110, just like I came up with the soft for changing the alert
+ tone on my 5110. Imagine, we have 30 changeable ringtones on
+ our Nokia, not just the 5110 but also with the 3210, 33xx,
+ 51xx, 61xx, 62xx, 7110, 82xx, 88xx, etc.
+ The info about this is not for free of course. Anyone
+ experimenting with his Nokia can come with a way to change the
+ fixed ringtones and alert tones on his phone.
+ BTW, the ringtones can be found on the PPM part of the phone.
+ Regards...
+ [ 15 June 2001 06:43: Message edited 1 time, lastly by Ice
+ Dragon ]
+ --------------------
+ "Keyboard not found. Press F1 to continue."
+ ICQ#:97427188
+ -------------------
+ Send me private messages if any, no kinky stuff though. :-)
+
+
+ Posts: 171 | From: Bacolod, Philippines | Registered: Feb 2001
+ | IP:
+
+ azywerks
+ Newbie
+
+ posted 14 June 2001 18:05
+
+ Yo Ice! Could you share with me the search values for the SMS
+ tones. Pleazzee.
+ BTW, have you tried changing the words in our PPM package (i.e
+ "Insert" in Insert SIM card to something else). I've tried
+ even simply reversing Insert to tresnI so as not to get any
+ checksum problems but still I get the CS.
+ Maybe their using a different method of calculation (CRC
+ perhaps) or they have a compare module elsewhere?
+ Just wondering,
+ aCe
+
+
+ IP:
+
+ Leeloo
+ Major Poster
+
+ Member # 2809
+ Rate Member posted 16 June 2001 13:31
+
+ If the ringtones are saved in the ppm pack, and you get cs
+ when trying to change places of some letters in ppm.....what
+ happens in the phon when you download a new ringtone ?
+ does it recalculate the cs for ppm itself ?
+ I thought these ringtones where saved in a area without any cs
+ check.
+ /Leeloo
+
+
+ Posts: 46 | From: Sweden | Registered: Dec 2000 | IP:
+
+ azywerks
+ Newbie
+
+ posted 17 June 2001 20:27
+
+ The downloaded tones aren't stored in your PPM, they are
+ stored in your EEPROM. It is in the EEPROM where checksum
+ recalculation takes place.
+ The tones that are in the PPM are the static tones (i.e Ring
+ Ring, Mosquito).
+ The SMS alert tones on the other hand (according to ICE
+ DRAGON) are located at the MCU portion of your flash.
+ Hope this clears up the confusion.
+ Regards,
+ aCe
+
+
+ IP:
+
+ Ice Dragon
+ Freak Poster
+
+ Member # 3365
+ Member Rated:
+ posted 03 July 2001 04:11
+
+
+ quote:
+
+ Originally posted by aZyWeRks:
+ Yo Ice! Could you share with me the search values for the
+ SMS tones. Pleazzee.
+ BTW, have you tried changing the words in our PPM package
+ (i.e "Insert" in Insert SIM card to something else). I've
+ tried even simply reversing Insert to tresnI so as not to
+ get any checksum problems but still I get the CS.
+ Maybe their using a different method of calculation (CRC
+ perhaps) or they have a compare module elsewhere?
+ Just wondering,
+ aCe
+
+
+
+ Yo aCe! Here's the hex values particularly for the Special and
+ Ascending alerts tones.
+ Using flash from a 5110v5.30C:
+ For Special (morse code for "SMS"):
+ 5A0C,400C,5A0C,400C,0AFE,5A0C,
+ 4025,0A01,5A25,400C,5A25,4025,
+ 0AFE,5A0C,400C,5A0C,400C,5A0C
+ So it sounds like:
+ dit-dit-dit dat-dat dit-dit-dit
+ "5A0C" is a "dit" with a duration of 0C
+ "5A25" is a "dat" with a duration of 25
+ "400C" is a pause with a duration of 0C
+ "4025" is a pause with a duration of 25
+ "0AFE" is.... I don't know what this means, let me know
+ For Ascending (morse code for "connecting people"):
+ 5A25,400C,5A0C,0AFE,400C,5A25,400C,5A0C,4025,0A01,
+ 5A25,400C,5A25,0AFE,400C,5A25,4025,
+ 5A25,400C,5A0C,4025,
+ 5A25,400C,5A0C,4025,
+ 5A0C,4025,
+ 5A25,400C,5A0C,400C,5A25,400C,5A0C,4025,
+ 5A25,4025,
+ 5A0C,400C,5A0C,4025,
+ 5A25,400C,5A0C,4025,
+ 5A25,400C,5A25,400C,5A0C,4064
+ 5A0C,400C,5A25,400C,5A25,400C,5A0C,4025
+ 5A0C,4025
+ 5A25,400C,5A25,400C,5A25,4025
+ 5A0C,400C,5A25,400C,5A25,400C,5A0C,4025
+ 5A0C,400C,5A25,400C,5A0C,400C,5A0C,4025
+ 5A0C,4025
+ So it sounds like:
+ dat-dit-dat-dit dat-dat-dat dat-dit dat-dit dit
+ dat-dit-dat-dit dat dit-dit dat-dit dat-dat-dit
+ dit-dat-dat-dit dit dat-dat-dat dit-dat-dat-dit
+ dit-dat-dit-dit dit
+ Again:
+ "5A0C" is a "dit" with a duration of 0C
+ "5A25" is a "dat" with a duration of 25
+ "400C" is a pause with a duration of 0C
+ "4025" is a pause with a duration of 25
+ "4064" is a pause with a duration of 64 (long pause)
+ "0A01" and "0AFE" are.... I don't know what these means, let
+ me know
+ Correct me if I'm wrong, I think "0A01" and "0AEF" is a system
+ pause to let the user interrupt the beeping. for sure, it's
+ not a checksum.
+ On other phone models:
+ Read a full flash from any model of Nokia phone (from 3210,
+ 33xx, 51xx, 61xx, 62xx, 7110, 82xx, 88xx) and use these search
+ strings on a hex editor (I use HexWorks):
+ For alert tones: 8005020A01
+ Following hex values after these hex are actual alert tones
+ For ringtones: 0905020A01 or 0A05020A01
+ Hex values following after these hex are not necessarily ring
+ tones but you can see the names of the ring tones and
+ following them are their ringtone values. Just see for
+ yourself what I mean.
+ Can I ask one-thing? If any of you find these info
+ interesting, please rate me
+ Thanks and best regards...
+ P.S. Oh, about changing the "Insert" to "tresnI" in PPM won't
+ work.
+ You see, checksum calculation in PPM is not done by
+ byte-addition (byte added to another byte) but by
+ word-addition (two bytes added to the next two bytes).
+ Let's take "Insert" as an example:
+ Letter - Hex value - Decimal
+ I 49 73
+ n 6E 110
+ s 73 115
+ e 65 101
+ r 72 114
+ t 74 116
+ In a byte-to-byte addition, the resulting checksum should be:
+ hex 275, decimal 629
+ And it would be equal to the checksum of "tresnI"
+ But in a word-to-word addition, checksum is computed in
+ byte-pairs, therefore taking "In" as one word or hex
+ equivalent to 496E, decimal 18798
+ So if we are to add them in words:
+ Letters - Hex values - Decimal
+ In 496E 18798
+ se 7365 29541
+ rt 7274 29300
+ The checksum should be: hex 2F47 or decimal 12103.
+ Now with "tresnI", the first two letter pair would be "tr"
+ with a hex equivalent to 7472, decimal 29810.
+ So if we are to add them in words:
+ Letters - Hex values - Decimal
+ tr 7472 29810
+ es 6573 25971
+ nI 6E49 28233
+ The checksum should be: hex 482E or decimal 18478.
+ Therefore, changing "Insert" to "tresnI" would yield a
+ "Contact Service" error.
+ Again, I only ask one favor. If any of you find these info
+ interesting, please rate me
+ Cheers...
+ [ 03 July 2001 04:43: Message edited 1 time, lastly by Ice
+ Dragon ]
+ --------------------
+ "Keyboard not found. Press F1 to continue."
+ ICQ#:97427188
+ -------------------
+ Send me private messages if any, no kinky stuff though. :-)
+
+
+ Posts: 171 | From: Bacolod, Philippines | Registered: Feb 2001
+ | IP:
+
+ mrENigma
+ Moderator
+
+ Member # 4409
+ Member Rated:
+ posted 03 July 2001 08:06
+
+ i'm confuse a little bit, but i think that i learn something.
+ and when release software to do this pls let me know 'cause i
+ want to get ride off those stupid ringtones.
+ thx again and keep in touch.
+ --------------------
+ ---I'M UNIQUE AND SO IS MY PHONE---
+ -- sms,logos,soft,ringtones and many more free --
+
+
+ Posts: 247 | From: Bucharest,Romania | Registered: May 2001 |
+ IP:
+
+ qtboy
+ Major Poster
+
+ Member # 3427
+ Rate Member posted 03 July 2001 13:03
+
+ yo ice!!!
+ da bes ka gid migs bah!
+ pakopyahon mo na lang ko kung matapos na imo
+ program. hehehe
+
+
+ Posts: 46 | From: davao city, philippines | Registered: Feb
+ 2001 | IP:
+
+ mrENigma
+ Moderator
+
+ Member # 4409
+ Member Rated:
+ posted 03 July 2001 13:53
+
+ yo qtboy......... english pls
+ --------------------
+ ---I'M UNIQUE AND SO IS MY PHONE---
+ -- sms,logos,soft,ringtones and many more free --
+
+
+ Posts: 247 | From: Bucharest,Romania | Registered: May 2001 |
+ IP:
+
+ brittnee
+ Insane Poster
+
+ Member # 2085
+ Rate Member posted 03 July 2001 16:06
+
+ nice job, i would just like to ask if i should have the same
+ number of dits and dats as to avoid contact service?
+ salamat
+
+ Posts: 94 | Registered: Sep 2000 | IP:
+
+ Ice Dragon
+ Freak Poster
+
+ Member # 3365
+ Member Rated:
+ posted 04 July 2001 04:17
+
+
+ quote:
+
+ Originally posted by brittnee:
+ nice job, i would just like to ask if i should have the same
+ number of dits and dats as to avoid contact service?
+ salamat
+
+
+ Not necessarily.
+ Let's take the Standard alert tone (Morse code for "M") as an
+ example (using the 5110v5.30C flash):
+ 5519, 400A, 5519, 400A
+ So it sounds like "dat-dat"
+ 5519 - is a "dat" with a duration of 19
+ 400A - is a pause with a duration of 0C
+ We could change it to:
+ 550C, 400A, 5526, 400A
+ So it sounds like "dit-dat"
+ Take note that we subtracted hex 0D from the first 5519 and
+ added it to the second 5519 to compensate the values so we
+ wont have a contact service message.
+ Here's a more interesting one. Change the Standard alert tone
+ (5519,400A, 5519,400A) to something like this:
+ 5B19, 4005, 4F19, 400F
+ So it sounds like high-note-dat, low-note-dat
+ Or to something like:
+ 4C0C, 4005, 5E25, 400F
+ So it sounds like low-note-dit, high-note-dat
+ Notice that we subtracted duration values from the first pause
+ and add it to the next pause, and so with the first tone to
+ the second tone.
+ Sometimes I get an error when I subtract values from the pause
+ and add it to the tone. Or vice versa. It won't work.
+ So the following won't work in changing Special alert (morse
+ code for "SMS"):
+ 5A0C,400C,5A0C,400C,0AFE,5A0C,4025,
+ 0A01,5A25,400C,5A25,4025,0AFE,
+ 5A0C,400C,5A0C,400C,5A0C
+ That sounds like:
+ dit-dit-dit dat-dat dit-dit-dit
+ "5A0C" is a "dit" with a duration of 0C
+ "5A25" is a "dat" with a duration of 25
+ "400C" is a pause with a duration of 0C
+ "4025" is a pause with a duration of 25
+ "0AFE" is.... I don't know what this means, let me know
+ Into a variation of "Let's go":
+ 5A0C,4025,5A0C,4025,0AFE,
+ 5A0C,400C,0A01,5A0C,400C,5A0C,400C,0AFE,5A0C,4025,
+ 5A0C,4025,5A0C
+ That sounds like:
+ dit-dit dit-dit-dit-dit dit-dit
+ "5A0C" is a "dit" with a duration of 0C
+ "400C" is a pause with a duration of 0C
+ "4025" is a pause with a duration of 25
+ "0AFE" is.... I don't know what this means, let me know
+ It wont work because we subtract values from pause and add it
+ to the tone.
+ So that's that. I'm still studying the behaviour for the
+ default ringtones.
+ Sure I can change some values without incurring a "Contact
+ Service" but the tones won't make any sense.
+ Anyway, I would know who reads this forum in my area when I
+ start hearing a different alert tone around here.
+ P.S. If you find some info here to be interesting, I only ask
+ one thing: please rate me
+ BR
+ --------------------
+ "Keyboard not found. Press F1 to continue."
+ ICQ#:97427188
+ -------------------
+ Send me private messages if any, no kinky stuff though. :-)
+
+
+ Posts: 171 | From: Bacolod, Philippines | Registered: Feb 2001
+ | IP:
+
+ brittnee
+ Insane Poster
+
+ Member # 2085
+ Rate Member posted 04 July 2001 17:16
+
+ very nice indeed, i've change the alert tone of my 6210, still
+ looking for the standard tone, but i found the special tone
+ which is the one i change, thanks a lot!!!!
+
+ Posts: 94 | Registered: Sep 2000 | IP:
+
+ Ice Dragon
+ Freak Poster
+
+ Member # 3365
+ Member Rated:
+ posted 05 July 2001 03:50
+
+
+ quote:
+
+ Originally posted by brittnee:
+ very nice indeed, i've change the alert tone of my 6210,
+ still looking for the standard tone, but i found the special
+ tone which is the one i change, thanks a lot!!!!
+
+
+
+ On a 6210:
+ As always, before tinkering with your phone flash, make a full
+ backup of your phone flash if you haven't yet.
+ Let's assume you don't have a full backup of your phone flash.
+ 1. Read the flash address 00200000 to 00600000.
+ 2. Copy the \flasher\flash.out to \nk_files\6210full.fls
+ 3. Use a hex editor (I suggest Hexworks), open the
+ \nk_files\6210full.fls and do the following to obtain a full
+ flash without the EEPROM:
+ WARNING: If you notice the file contains FF00,FF00 from
+ beginning to end, DO NOT PROCEED because this is a bad read
+ flash.
+ 3.1 Go to address 3FC000 (this is equivalent to flash address
+ 005FC000)
+ 3.2 Press Shift-Ctrl-Home. This will highlight the data from
+ offset 00000000 to 003FC000. Release the keys.
+ 3.3 Press Ctrl-C. This will copy the highlighted data to the
+ clipboard or memory.
+ 3.4 Press Ctrl-N. This will create an empty file.
+ 3.5 Press Ctrl-V. you will be asked "Are you sure you want to
+ insert?", select "Ok".
+ This will copy the previously highlighted data to the new
+ file.
+ 3.6 Save the file as "my6210.fls"
+ 4. Make a copy of the flash that contains the alert tones.
+ 4.1 Still using the hex editor, open the file "my6210.fls"
+ 4.2 Go to offset 350000. Press Shift-Ctrl-Home. This will
+ highlight the data from offset 00000000 to 003FC000. Release
+ the keys.
+ 4.3 Press Del. You will be asked "Are you sure you want to
+ delete?". Press "Ok". This will delete the data from 0 to
+ 350000.
+ 4.4 Go to offset 10000. Press Shift-Ctrl-End. This will
+ highlight the data from offset 10000 to the end of file.
+ 4.5 Press Del. You will be asked "Are you sure you want to
+ delete?". Press "Ok". This will leave you a 64k data from 0 to
+ 10000 (which is equivalent to flash address 00550000 to
+ 00560000).
+ 4.6 Save the file as \nk_files\6210al.fls
+ 5. Copy \nk_files\6210al.fls to \nk_files\alert.fls
+ 6. Open the \nk_files\alert.fls with a hex editor (I use
+ Hexworks).
+ 7. Use the search string "8005020A01".
+ First stop should be the Special alert tone.
+ You will notice that there's "SMSS.......S.p.e.c.i.a.l" before
+ it.
+ Pressing F3 will take you to the next found string. This is
+ the Standard alert. You will notice that there's
+ "SMS.......S.t.a.n.d.a.r.d" before it.
+ Again pressing F3 will take you to the next found string. This
+ is the Ascending alert. You will notice that there's
+ "SMSL.......L.o.n.g. .l.o.u.d" before it.
+ Don't forget when you flash it back, you should use alert.fls
+ as source and the address should be 00550000.
+ Assuming you have flashed it back to the correct address and
+ it shows a "Contact Service", you may have incorrectly
+ modified your alert tone. If this happens, proceed to number 5.
+ If you want to flash it back to its original alert tones,
+ flash it back with 6210al.fls at address 00550000.
+ But if it still has a Contact Service, flash it back with a
+ my6210.fls starting from address 00200000. This should restore
+ your original flash without the EEPROM part.
+ This procedure is a little bit for advanced flasher users. If
+ you don't know what you're doing, don't try it out. You have
+ yourself to blame if something pukes up.
+ Hmmm... I guess few people are interested in what I'm posting
+ here. Out of more than 100 readers since my first posting in
+ this thread, only 2 person rated me.
+ Oh well, all I'm asking is: rate me please
+ -----------------
+ Misqouted qoutes:
+ "Don't judge the book without its cover"
+ "Birds flock together on the same feather"
+ "Don't cross the bridge when you get there"
+ "There's no water under the bridge"
+ --------------------
+ "Keyboard not found. Press F1 to continue."
+ ICQ#:97427188
+ -------------------
+ Send me private messages if any, no kinky stuff though. :-)
+
+
+ Posts: 171 | From: Bacolod, Philippines | Registered: Feb 2001
+ | IP:
+
+ nuggie
+ Junior Member
+
+ Member # 3304
+ Member Rated:
+ posted 05 July 2001 13:34
+
+ I've tryed to do this like that :
+ 1.make a full backup 002 to 006 (6210)
+ 2.edit with hexworkshop and change the SMS alert
+ 3.try to correct checksums with NK1.2 to avoid Contact Service
+ 4.put flash back to phone
+ 5.works fine
+ Ice Dragon: does point 3 make any sense?
+ [ 05 July 2001 13:38: Message edited 3 times, lastly by nuggie ]
+
+
+ Posts: 27 | From: Westcoast, Poland | Registered: Feb 2001 |
+ IP:
+
+ Ice Dragon
+ Freak Poster
+
+ Member # 3365
+ Member Rated:
+ posted 06 July 2001 03:07
+
+
+ quote:
+
+ Originally posted by nuggie:
+ I've tryed to do this like that :
+ 1.make a full backup 002 to 006 (6210)
+ 2.edit with hexworkshop and change the SMS alert
+ 3.try to correct checksums with NK1.2 to avoid Contact
+ Service
+ 4.put flash back to phone
+ 5.works fine
+ Ice Dragon: does point 3 make any sense?
+
+
+
+ Not only "sense" (cents), but also dollars... heh..heh...heh...
+ I did that already but it always take a long wait to write the
+ whole modified flash back to the phone.
+ With a 5110v530C flash, I also tried cutting the first part of
+ the modified flash (flash address 00200000-00210000), write it
+ back to the phone, then cut the last part of the modified
+ flash (002F0000-00300000) back to the phone so it would take a
+ much lesser time.
+ The one I posted earlier is also to let our members reader
+ learn a little bit about the alert and ring tones in the
+ flash, and the possibility of changing them. Although I
+ believe that our members here know more than I do.
+ Cheers to you... and best regards to all
+ [ 06 July 2001 03:10: Message edited 1 time, lastly by Ice
+ Dragon ]
+ --------------------
+ "Keyboard not found. Press F1 to continue."
+ ICQ#:97427188
+ -------------------
+ Send me private messages if any, no kinky stuff though. :-)
+
+
+ Posts: 171 | From: Bacolod, Philippines | Registered: Feb 2001
+ | IP:
+
+ aZyWeRks
+ Freak Poster
+
+ Member # 3170
+ Member Rated:
+ posted 06 July 2001 15:56
+
+ Man, thanks a lot for the values. I'll try it.
+ And about the word addition information. I'll try to make a
+ workaround on this if I have enough time. I've been off the
+ internet for a time.
+ Thanks a lot man. You're great.
+
+ Regards,
+ aCe
+ --------------------
+ http://getit.at/azywerks
+
+
+ Posts: 131 | From: I.C., R.P. | Registered: Jan 2001 | IP:
+
+ koloksky
+ Freak Poster
+
+ Member # 718 posted 07 July 2001 00:26
+
+ hi,
+ That is really cool!! thanks IceDragon!
+ u deserve a
+ regards
+
+
+ Posts: 156 | Registered: Nov 1999 | IP:
+
+ nuggie
+ Junior Member
+
+ Member # 3304
+ Member Rated:
+ posted 14 July 2001 20:23
+
+ Ice Dragon:
+ Look here at the ringtone info.
+ web page
+ [ 14 July 2001 20:26: Message edited 2 times, lastly by nuggie
+ ]
+
+
+ Posts: 27 | From: Westcoast, Poland | Registered: Feb 2001 |
+ IP:
+
+ Rayborg
+ Newbie
+
+ Member # 5357
+ Rate Member posted 19 July 2001 14:37
+
+ How does it works with a Nokia 3310?
+ I think there are other HexValues, but I´m not able to find
+ them! Please help me!
+
+ Posts: 8 | From: Germany | Registered: Jul 2001 | IP:
+
+ Ice Dragon
+ Freak Poster
+
+ Member # 3365
+ Member Rated:
+ posted 23 July 2001 03:32
+
+
+ quote:
+
+ Originally posted by Rayborg:
+ How does it works with a Nokia 3310?
+ I think there are other HexValues, but I´m not able to find
+ them! Please help me!
+
+
+ Still use the search string: "8005020A01".
+ First stop should be the Special alert tone.
+ You will notice that previously the tones have 5A0C, 400C,
+ 5A25, 400C values. With the 3310, it uses the 5B0C, 400C,
+ 5A25, 400c values.
+ "5B0C" is a "dit" with a duration of 0C
+ "5B25" is a "dat" with a duration of 25
+ "400C" is a pause with a duration of 0C
+ "4025" is a pause with a duration of 25
+ Pressing F3 will take you to the next found string. This is
+ the Standard alert. It uses the 5619, 400A, 5618, 400A values.
+ "5619" is a "dit" with a duration of 19
+ "400A" is a pause with a duration of 0A
+ Again pressing F3 will take you to the next found string. This
+ is the Ascending alert. It uses the 5B0C, 400C, 5B25, 400C
+ values.
+ "5B0C" is a "dit" with a duration of 0C
+ "5B25" is a "dat" with a duration of 25
+ "400C" is a pause with a duration of 0C
+ "4025" is a pause with a duration of 25
+ The alert tones on the 3310 reside in the MCU part of the full
+ flash.
+ Best regards and cheers...
+ [ 23 July 2001 03:45: Message edited 1 time, lastly by Ice
+ Dragon ]
+ --------------------
+ "Keyboard not found. Press F1 to continue."
+ ICQ#:97427188
+ -------------------
+ Send me private messages if any, no kinky stuff though. :-)
+
+
--- /dev/null
+
+ Linux kernel coding style
+
+This is a short document describing the preferred coding style for the
+linux kernel. Coding style is very personal, and I won't _force_ my
+views on anybody, but this is what goes for anything that I have to be
+able to maintain, and I'd prefer it for most other things too. Please
+at least consider the points made here.
+
+First off, I'd suggest printing out a copy of the GNU coding standards,
+and NOT read it. Burn them, it's a great symbolic gesture.
+
+Anyway, here goes:
+
+
+ Chapter 1: Indentation
+
+Tabs are 8 characters, and thus indentations are also 8 characters.
+There are heretic movements that try to make indentations 4 (or even 2!)
+characters deep, and that is akin to trying to define the value of PI to
+be 3.
+
+Rationale: The whole idea behind indentation is to clearly define where
+a block of control starts and ends. Especially when you've been looking
+at your screen for 20 straight hours, you'll find it a lot easier to see
+how the indentation works if you have large indentations.
+
+Now, some people will claim that having 8-character indentations makes
+the code move too far to the right, and makes it hard to read on a
+80-character terminal screen. The answer to that is that if you need
+more than 3 levels of indentation, you're screwed anyway, and should fix
+your program.
+
+In short, 8-char indents make things easier to read, and have the added
+benefit of warning you when you're nesting your functions too deep.
+Heed that warning.
+
+
+ Chapter 2: Placing Braces
+
+The other issue that always comes up in C styling is the placement of
+braces. Unlike the indent size, there are few technical reasons to
+choose one placement strategy over the other, but the preferred way, as
+shown to us by the prophets Kernighan and Ritchie, is to put the opening
+brace last on the line, and put the closing brace first, thusly:
+
+ if (x is true) {
+ we do y
+ }
+
+However, there is one special case, namely functions: they have the
+opening brace at the beginning of the next line, thus:
+
+ int function(int x)
+ {
+ body of function
+ }
+
+Heretic people all over the world have claimed that this inconsistency
+is ... well ... inconsistent, but all right-thinking people know that
+(a) K&R are _right_ and (b) K&R are right. Besides, functions are
+special anyway (you can't nest them in C).
+
+Note that the closing brace is empty on a line of its own, _except_ in
+the cases where it is followed by a continuation of the same statement,
+ie a "while" in a do-statement or an "else" in an if-statement, like
+this:
+
+ do {
+ body of do-loop
+ } while (condition);
+
+and
+
+ if (x == y) {
+ ..
+ } else if (x > y) {
+ ...
+ } else {
+ ....
+ }
+
+Rationale: K&R.
+
+Also, note that this brace-placement also minimizes the number of empty
+(or almost empty) lines, without any loss of readability. Thus, as the
+supply of new-lines on your screen is not a renewable resource (think
+25-line terminal screens here), you have more empty lines to put
+comments on.
+
+
+ Chapter 3: Naming
+
+C is a Spartan language, and so should your naming be. Unlike Modula-2
+and Pascal programmers, C programmers do not use cute names like
+ThisVariableIsATemporaryCounter. A C programmer would call that
+variable "tmp", which is much easier to write, and not the least more
+difficult to understand.
+
+HOWEVER, while mixed-case names are frowned upon, descriptive names for
+global variables are a must. To call a global function "foo" is a
+shooting offense.
+
+GLOBAL variables (to be used only if you _really_ need them) need to
+have descriptive names, as do global functions. If you have a function
+that counts the number of active users, you should call that
+"count_active_users()" or similar, you should _not_ call it "cntusr()".
+
+Encoding the type of a function into the name (so-called Hungarian
+notation) is brain damaged - the compiler knows the types anyway and can
+check those, and it only confuses the programmer. No wonder MicroSoft
+makes buggy programs.
+
+LOCAL variable names should be short, and to the point. If you have
+some random integer loop counter, it should probably be called "i".
+Calling it "loop_counter" is non-productive, if there is no chance of it
+being mis-understood. Similarly, "tmp" can be just about any type of
+variable that is used to hold a temporary value.
+
+If you are afraid to mix up your local variable names, you have another
+problem, which is called the function-growth-hormone-imbalance syndrome.
+See next chapter.
+
+
+ Chapter 4: Functions
+
+Functions should be short and sweet, and do just one thing. They should
+fit on one or two screenfuls of text (the ISO/ANSI screen size is 80x24,
+as we all know), and do one thing and do that well.
+
+The maximum length of a function is inversely proportional to the
+complexity and indentation level of that function. So, if you have a
+conceptually simple function that is just one long (but simple)
+case-statement, where you have to do lots of small things for a lot of
+different cases, it's OK to have a longer function.
+
+However, if you have a complex function, and you suspect that a
+less-than-gifted first-year high-school student might not even
+understand what the function is all about, you should adhere to the
+maximum limits all the more closely. Use helper functions with
+descriptive names (you can ask the compiler to in-line them if you think
+it's performance-critical, and it will probably do a better job of it
+that you would have done).
+
+Another measure of the function is the number of local variables. They
+shouldn't exceed 5-10, or you're doing something wrong. Re-think the
+function, and split it into smaller pieces. A human brain can
+generally easily keep track of about 7 different things, anything more
+and it gets confused. You know you're brilliant, but maybe you'd like
+to understand what you did 2 weeks from now.
+
+
+ Chapter 5: Commenting
+
+Comments are good, but there is also a danger of over-commenting. NEVER
+try to explain HOW your code works in a comment: it's much better to
+write the code so that the _working_ is obvious, and it's a waste of
+time to explain badly written code.
+
+Generally, you want your comments to tell WHAT your code does, not HOW.
+Also, try to avoid putting comments inside a function body: if the
+function is so complex that you need to separately comment parts of it,
+you should probably go back to chapter 4 for a while. You can make
+small comments to note or warn about something particularly clever (or
+ugly), but try to avoid excess. Instead, put the comments at the head
+of the function, telling people what it does, and possibly WHY it does
+it.
+
+
+ Chapter 6: You've made a mess of it
+
+That's OK, we all do. You've probably been told by your long-time Unix
+user helper that "GNU emacs" automatically formats the C sources for
+you, and you've noticed that yes, it does do that, but the defaults it
+uses are less than desirable (in fact, they are worse than random
+typing - a infinite number of monkeys typing into GNU emacs would never
+make a good program).
+
+So, you can either get rid of GNU emacs, or change it to use saner
+values. To do the latter, you can stick the following in your .emacs file:
+
+(defun linux-c-mode ()
+ "C mode with adjusted defaults for use with the Linux kernel."
+ (interactive)
+ (c-mode)
+ (c-set-style "K&R")
+ (setq c-basic-offset 8))
+
+This will define the M-x linux-c-mode command. When hacking on a
+module, if you put the string -*- linux-c -*- somewhere on the first
+two lines, this mode will be automatically invoked. Also, you may want
+to add
+
+(setq auto-mode-alist (cons '("/usr/src/linux.*/.*\\.[ch]$" . linux-c-mode)
+ auto-mode-alist))
+
+to your .emacs file if you want to have linux-c-mode switched on
+automagically when you edit source files under /usr/src/linux.
+
+But even if you fail in getting emacs to do sane formatting, not
+everything is lost: use "indent".
+
+Now, again, GNU indent has the same brain dead settings that GNU emacs
+has, which is why you need to give it a few command line options.
+However, that's not too bad, because even the makers of GNU indent
+recognize the authority of K&R (the GNU people aren't evil, they are
+just severely misguided in this matter), so you just give indent the
+options "-kr -i8" (stands for "K&R, 8 character indents").
+
+"indent" has a lot of options, and especially when it comes to comment
+re-formatting you may want to take a look at the manual page. But
+remember: "indent" is not a fix for bad programming.
+
+
+ Chapter 7: Configuration-files
+
+For configuration options (arch/xxx/config.in, and all the Config.in files),
+somewhat different indentation is used.
+
+An indention level of 3 is used in the code, while the text in the config-
+options should have an indention-level of 2 to indicate dependencies. The
+latter only applies to bool/tristate options. For other options, just use
+common sense. An example:
+
+if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
+ tristate 'Apply nitroglycerine inside the keyboard (DANGEROUS)' CONFIG_BOOM
+ if [ "$CONFIG_BOOM" != "n" ]; then
+ bool ' Output nice messages when you explode' CONFIG_CHEER
+ fi
+fi
+
+Generally, CONFIG_EXPERIMENTAL should surround all options not considered
+stable. All options that are known to trash data (experimental write-
+support for file-systems, for instance) should be denoted (DANGEROUS), other
+Experimental options should be denoted (EXPERIMENTAL).
--- /dev/null
+1. What do I need?
+
+- a reasonably recent version of GNU gettext (e.g. 0.10.35)
+ Check the version using e.g. msgfmt -V
+
+- autoconf
+
+- gnokii distribution :-)
+
+- if you have the variable LINGUAS in the environment
+ (most Red Hats have, no idea about other distributions),
+ unset it
+
+
+2. How to make gnokii.pot file?
+
+gnokii.pot file is a collection of all localizable strings
+in the gnokii package. It will be generated automagically
+and is included in the standard distribution package.
+
+If you need to regenerate it, goto "po" directory,
+remove gnokii.pot and say
+
+ make gnokii.pot
+
+
+3.1 How to start translating for a new language?
+
+First, you would like to contact the authors or write
+to the mailing list - maybe there already is someone
+working on this translation.
+
+If you get the OK from the maintainer, there are several
+steps to do:
+
+- add the code of your language to the ALL_LINGUAS line
+ in the configure.in file
+
+ Caution: the language code may differ from the country
+ code, e.g. czech language is cs, Czech Republic is cz
+
+- run autoconf to recreate configure script
+
+- reconfigure the package (./configure)
+
+- in the po directory, copy gnokii.pot to <country>.po
+
+- start translating
+
+
+3.2 How to merge existing translations with the updated gnokii.pot?
+
+This is simple. Rename the old file and use msgmerge to create
+an updated one:
+
+ mv cs.po cs.po.bak
+ msgmerge -o cs.po cs.po.bak gnokii.pot
+
+
+4. How to generate a .mo file
+
+When you say make in the po directory, all existing
+translations will be generated. The suffix will be .gmo.
+
+If you want to do this manually, use the msgfmt utility, e.g.
+
+ msgfmt -o cs.mo -v cs.po
+
+
+5. How to install the files
+
+Again, the makefile takes care of this. Simply use (as root)
+
+ make install
+
+in the po directory. If you want to do this manually (and/or
+for your language only), move the .mo file to
+/usr/share/locale/<your locale>/LC_MESSAGES/gnokii.mo
+
+
+I'm from Czech republic, so I did (well, I did not, but if you would
+like to localize gnokii, you should :-):
+
+ cd po
+ make gnokii.pot
+ cp gnokii.pot cs.po
+ <translating messages in cs.po>
+ <checking the translations using> msgfmt -o cs.mo -v cs.po
+ make
+ make install
+
+And now:
+
+SnowWhite:/tmp/gnokii$ export LC_MESSAGES=cs_CZ
+SnowWhite:/tmp/gnokii$ ./gnokii --version
+GNOKII Version 0.3.1 Copyright (C) Hugh Blemings 1999. <hugh@linuxcare.com>
+ Kompilace: 19:09:02 Mar 13 1999 pro model 6110 na portu /dev/ttyS0
+SnowWhite:/tmp/gnokii$
+
+The second line is in czech language :-) There are some problems - for
+example with "Mar" which is substitute by the C preprocessor.
+
--- /dev/null
+NOTE for command line gnokii:
+
+--netmonitordata
+
+ we have used two data structure, defined in gnokii.h :
+
+ PARAM_INFO_MON wich is a single linked recursive list of pointers,
+ each pointers contain the complete description of one netmonitor param.
+
+ ///////////////////////////////////////////////////////////////////////
+ // start->next->next->next-> ...->next->NULL
+ // | | | |
+ // V V V V
+ // par0 par1 par2 parN
+ ///////////////////////////////////////////////////////////////////////
+
+ OUT_INFO_MON, contains parameters as specified
+ from the command line and an array of data pointers requested by user,
+ each one point to a single PARAM_INFO_MON
+ for optimization reason, also we filled in one array of required screen.
+
+
+ this the block diagram of program:
+
+ PARAM_INFO_MON *info:
+ OUT_INFO_MON *out:
+
+ netmonitordata()
+
+ check for -S option, assign filename
+
+ check for -I option, assign filename
+
+ autodetect_phonemodel_phone_version() This is TO DO
+
+ info = get_min_param_info() // nedeed here, so later we can check args param
+
+ // here we check command line arguments
+ if -I option
+
+ for each line
+ do
+ parse_check(f_argc, f_argv, info, file, line)
+ done
+ else
+ parse_check(argc, argv, info, NULL, 0)
+ fi
+
+
+ // HERE, ALL IS CHECKED
+
+ // here we make OUT_INFO_MON
+ if -I option
+
+ for each line
+ do
+ out = parse_process(f_argc, f_argv, info, file, line)
+
+ nmd_output(out)
+
+ free(out)
+ done
+ else
+ out = parse_process(argc, argv, info, NULL, 0)
+
+ nmd_output(out)
+
+ free(out)
+ fi
--- /dev/null
+
+ Common information:
+
+ For more install/compilation information see the INSTALL file.
+
+ (!) Makefiles support make install prefix=<your_directory>
+ for package building. You can use it example in for .spec:
+
+ ./configure --prefix=/usr
+ make install prefix=$RPM_BUILD_ROOT/usr
+
+ (You not need create any dirs - all make make install.)
+
+ For a installation procedure is used 'make install' or
+ 'make install prefix=', and all outputs from this routine must be
+ correct. Please, not make any correction in your package specific
+ build system (example use 'cp' in package routines - .spec -
+ it is job for Makefiles). Write more different routines for
+ instalation is good way to hell...
+
+ 'make install' not install documentation, because for this use
+ any distribution itself routines. If you want install docs via
+ Makefile you must type 'make install-docs'
+
+ Debian:
+
+ 1/ Add new lines to Debian/changelog and set corect verion in this
+ file.
+
+ 2/ Check files: rules, menu, docs
+
+ 3/ Well, because gnokii's debian directory is in subdirectory
+ 'packaging' and it is total non-standard for Debian package
+ building system, you must firstly type in top directory:
+
+ # ln -s packaging/Debian debian
+
+ 3/ In source type:
+
+ # debian/rules binary
+ # debian/rules clean
+
+ 4/ Delete symlink
+
+ # rm debian
+
+
+
+ FreeBSD:
+
+
+
+ RedHat:
+
+
+
+
+
+ Win32:
+
\ No newline at end of file
--- /dev/null
+Subject: RE: Xgnokii in win32 ?
+Date: Mon, 29 Nov 1999 08:45:31 +0100
+From: Acquadro Daniele <acquadro.daniele@logicasiel.it>
+To: marcinw0@poczta.onet.pl
+CC: gnokii <gnokii@net.lut.ac.uk>
+
+Hi ,
+gtk for windows can be donloaded from www.gtk.org. On the left there's a
+link to GTK+ on win32 (on the bottom of the page).
+
+To compile xGnokii, using VC ide, you have to create a new win32 CONSOLE
+application (NOT a win32 application) and then add the libraries.
+TO COMPILE you need those libraries
+gdk-1.3.lib
+gtk-1.3.lib
+glib-1.3.lib
+
+ bye
+ Daniele
+> -----Original Message-----
+> From: Marcin Wiacek [SMTP:marcinw0@poczta.onet.pl]
+> Sent: domenica 28 novembre 1999 22.50
+> To: GNU Nokia mailing List
+> Subject: Xgnokii in win32 ?
+>
+>
+> Hi,
+>
+> I want to know only, where can I get GTK libraries for win32 (they're
+> required for compiling xgnokii) from ?
+>
+> Or maybe somebody will write on the list/some WWW page, what to do to
+> compile xgnokii in win32 (how to replace GTK libraries with win procedures
+> -
+> I think, it will be better) ?
+>
+> ...maybe I shouldn't ask for it, but it isn't written in gnokii source...
+>
+> Regards,
+>
+> Marcin
+>
--- /dev/null
+Do: Markus Plail
+Temat: RE: RE:
+
+
+Hi,
+
+> Sorry for the confusion. I wrote the subject (getsms for 6210) in
+> the CC field.
+No problem :-)
+
+> So this is what I want to try, in linux btw. U wrote that u can
+> give some information on that topic.
+OK. Good.
+
+First of all, you HAVE to understand, how/where are created all phone functions. Look into n7110.c for N7110_Functions. This is our structure for each function - getting SMS, etc. You have pointers to each function sending request.
+
+Example: N6110_NetMonitor for netmonitor function.
+
+If each function (let's say N6110_NetMonitor) you send frame for phone:
+-----------------------------
+ unsigned char req[] = { 0x00, 0x01, 0x7e, 0x00 };
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ CurrentNetmonitor=Screen;
+
+ req[3]=mode;
+
+ return N6110_SendMessageSequence
+ (20, &CurrentNetmonitorError, 4, 0x40, req);
+---------------------------
+In req you prepare it (see 6110.txt/7110.txt for frame for netmonitor and compare it with req).
+
+First (this is specific for netmonitor and some other) need to send something, we call EnableExtendedCommands - we must send special frame and wait for answer. And ONLY after it phone will answer with 0x40 frames. For SMS in 6210 it's not required.
+
+After it we set pointer to structure given by user (pointers are declared in gsm-api.c & gsm-api.h): CurrentNetmonitor=Screen;
+
+Prepare frame send to phone...
+
+And use N6110_SendMessageSequence -> first is, how long we can wait for phone answer (20), next: what variable is used to see, if phone answered (I will later describe more - variable created in gsm-api.c & gsm-api.h), how many bytes in req, frame type and req.
+
+That's all here.
+
+All answers are handled in N7110_DispatchMessage
+
+In example look for:
+
+ fprintf(stdout, _("Message: Netmonitor menu %d received:\n"), MessageBuffer[3]);
+
+You copy formatted answer to structure pointed by CurrentNetmonitor (in example) and set CurrentNetmonitorError to GE_NONE (it makes, that N6110_SendMessageSequence returns: NO error). That's all.
+--------------------
+If you understand, let's start:
+
+1.need to make new N7110_GetSMSFolders similiar to N6110_GetSMSFolders (send frame - it's described in 7110.txt: "Get folder names", wait for answer and return it) and set N7110_Functions to point on it (in line 127).
+
+After it we will be able to make "real" getsms...
+
+Any questions ?
+
+Pozdrowienia/Best Regards
+--
+Marcin Wiacek -> mailto:marcinwiacek@topnet.pl http://marcin-wiacek.topnet.pl (http://www.fkn.pl/marcinw) -> netmonitor, firmware, mygnokii (GSM & Nokia)
+http://www.mds.mdh.se/~cel95eig/mygnokii/ & http://grumble.zereau.com/gnokii/ & http://reinhold.bachrain.de/ -> mygnokii mirrors
\ No newline at end of file
--- /dev/null
+//SCKL1584
+BODY:
+IA:
+OPER ariel
+Link up
+N
+
+M SMS
++6421XXXXXX/+6421YYYYYY
+6:LINKUP
+--
+IA:
+OPER ariel
+Link down
+N
+
+M SMS
++6421XXXXXX/+6421YYYYYY
+8:LINKDOWN
--- /dev/null
+
+1.see Smart Messaging 2.0 for info, what the DMCP is
+
+2.I didn't have success in changing menus via cable (without sending SMS).
+ Here is example foogle funtion. You will see only "Nokia service update failed"
+------------------------------------
+int foogle(char *argv[])
+{
+ GSM_NetworkInfo NetworkInfo;
+ int i;
+
+ char buffer[100]= { 0x0c, 0x01,
+ 0x06, /* User Data Header Length */
+ 0x05, /* IEI: application port addressing scheme, 16 bit address */
+ 0x04, /* IEDL (IED length ?) */
+ 0x15, /* destination address: high byte */
+ 0x84, /* destination address: low byte */
+ 0x00, /* originator address: high byte */
+ 0x00}; /* originator address: low byte */
+
+ int MSGLEN=9;
+
+ /* Initialise the code for the GSM interface. */
+
+ fbusinit(NULL);
+
+ buffer[MSGLEN++]='B';
+ buffer[MSGLEN++]='O';
+ buffer[MSGLEN++]='D';
+ buffer[MSGLEN++]='Y';
+ buffer[MSGLEN++]=':';
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]='I';
+ buffer[MSGLEN++]='A';
+ buffer[MSGLEN++]=':';
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]='O';
+ buffer[MSGLEN++]='P';
+ buffer[MSGLEN++]='E';
+ buffer[MSGLEN++]='R';
+ buffer[MSGLEN++]=' ';
+ buffer[MSGLEN++]='a';
+ buffer[MSGLEN++]='l';
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]='L';
+ buffer[MSGLEN++]='i';
+ buffer[MSGLEN++]='n';
+ buffer[MSGLEN++]='k';
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]='N';
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]='M';
+ buffer[MSGLEN++]=' ';
+ buffer[MSGLEN++]='S';
+ buffer[MSGLEN++]='M';
+ buffer[MSGLEN++]='S';
+ buffer[MSGLEN++]=10;
+ buffer[MSGLEN++]='+';
+ buffer[MSGLEN++]='4';
+ buffer[MSGLEN++]='8';
+ buffer[MSGLEN++]='6';
+ buffer[MSGLEN++]='0';
+ buffer[MSGLEN++]='2';
+ buffer[MSGLEN++]='9';
+ buffer[MSGLEN++]='5';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='/';
+ buffer[MSGLEN++]='+';
+ buffer[MSGLEN++]='4';
+ buffer[MSGLEN++]='8';
+ buffer[MSGLEN++]='6';
+ buffer[MSGLEN++]='0';
+ buffer[MSGLEN++]='2';
+ buffer[MSGLEN++]='9';
+ buffer[MSGLEN++]='5';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='1';
+ buffer[MSGLEN++]='1';
+
+ for (i=0;i<MSGLEN;i++) {
+ fprintf(stdout,_("%c"),buffer[i]);
+ }
+
+ Protocol->SendMessage(MSGLEN, 0x12, buffer);
+ GSM->GetNetworkInfo(&NetworkInfo); //need to make something
+
+
+ GSM->Terminate();
+
+ return 0;
+}
+-----------------------------------
+3.to change via SMS - read parts of email sent by Martin Lucina [mato@kotelna.sk]
+-----------------------------------
+
+1. First of all, use the OPER (Operator) services rather than the Nokia
+ services. There's probably no reason why you couldn't use either but
+ there may be extra hooks in the phone firmware regarding Nokia
+ services that I don't know about.
+
+2. Make sure that "Operator access number 1" and "Operator access number
+ 2" are set correctly in the services menu. The former should be set
+ to the SMS centre the messages you send are going to come from
+ (important, send yourself a test message and check it's details, some
+ operators set the sending SMSC number to one different from the one
+ you originally sent the message to). The latter should be the number
+ of the MS you are sending the SMS from.
+
+3. Don't send the messages as binary NBS messsages using the UDH. I
+ haven't been able to get this method to work and besides, the //SCK
+ compatibility header works just fine.
+
+ Also, while I haven't seen this, it's possible that if you send a
+ message in binary format, the destination MS will reply in binary
+ format. This makes the reply useless if you are sending from another
+ NBS-aware phone, since the NBS router will most likely silently
+ discard it (or try to forward it to the phones TTML/DMCP server,
+ which won't help either).
+
+ If you send the messages as text, the replies I've seen also come
+ back as text so you can retrieve them from the phone in the normal
+ fashion.
+
+One caveat I've noticed with sending NBS messages using the //SCK
+compatibility header is that the NBS grammar in the Nokia SM spec
+version 2 contradicts the grammar in the original Intel NBS spec. Nokia
+says you can using either a newline or space as the delimiter after
+"//SCK", it turns out that you _must_ use a space (as stated in the
+Intel spec). Of course you can still stick a newline in afterwards.
+
+I have attached a test file that will add two menu items that send SMS
+messages to your services menu. I send this to the phone using
+
+$ sendsms +6421XXXXXX < addsms
+
+[...]
+
+Cheers,
+
+--
+Martin Lucina http://www.kotelna.sk/mato/ Wellington, New Zealand
+I've always been mad I know I've been mad like the most of us are
+Pretty hard to explain why you're a madman even if you're not mad
--- /dev/null
+//SCKL1584
+BODY:
+IR:
+OPER ariel
+Link up
--- /dev/null
+Subject: Ringtones
+Date: Wed, 2 Feb 2000 13:32:47 -0000
+From: "Mike Bradley" <mike@trumpington.st>
+To: "GNU Nokia mailing List" <gnokii@net.lut.ac.uk>
+
+Does anyone know anything about the ringtone IDs in the group info? It
+seems that all the various handsets have different ID codes and different
+sets of tones. Is there any order to all this? Here's what I've got:
+
+RINGTONEDESC
+eNam
+100
+
+ 0x10, "Preset",
+ 0x11, "Custom",
+ 0x12, "Ring ring", //
+ 0x13, "Low", //
+ 0x14, "Fly",
+ 0x15, "Mosquito", //
+ 0x16, "Bee", //
+ 0x17, "Intro",
+ 0x18, "Etude",
+ 0x19, "Hunt",
+ 0x1a, "Going up",
+ 0x1b, "City bird", //
+ 0x1e, "Chase",
+ 0x20, "Scifi",
+ 0x23, "Do-mi-so", //
+ 0x24, "Robo N1X",
+ 0x27, "Playground",
+ 0x2b, "That's It!",
+ 0x2f, "Grande valse", //
+ 0x30, "Helan",
+ 0x31, "Fuga",
+ 0x32, "Menuet",
+ 0x33, "Ode to Joy",
+ 0x34, "Elise", //
+ 0x35, "Mozart 40", //
+ 0x36, "Piano Concerto", //
+ 0x37, "William Tell",
+ 0x38, "Badinerie", //
+ 0x39, "Polka",
+ 0x3a, "Attraction", //
+ 0x3c, "Polite",
+ 0x3d, "Persuasion",//
+ 0x43, "Tick tick",//
+ 0x44, "Samba",//
+ 0x46, "Orient",//
+ 0x47, "Charleston",//
+ 0x49, "Jumping",//
+
+ 0x00, "??"
+};
+
+// the following are also on the 8850
+//Trio
+//Knock knock
+//Cicada
+//Kick
+//Dawn
+//Buffoon
+//Barn dance
+//Basic rock
+//Groovy blue
+//Frantic
+//Baroque
+//Entertainer
+//Indifference
+//Swan Lake
+//Tchaikovsky
+//Liszt
+//Bounce
+
+RINGTONEDESC
+eNam
+100
+
+ 0xff, "Default",
+ 0x2c, "That's It!",
+ 0x2d, "Siren",
+ 0x2e, "Tripod",
+ 0x2f, "Ring ring",
+ 0x30, "Low",
+ 0x31, "Intro",
+ 0x32, "Bee",
+ 0x33, "Etude",
+ 0x34, "Polite",
+ 0x35, "Persuasion",
+ 0x36, "Attraction",
+ 0x37, "Bumblebee",
+ 0x38, "Menuet",
+ 0x39, "Grande valse",
+ 0x3a, "Ode to Joy",
+ 0x3b, "Mozart 40",
+ 0x3c, "Elise",
+ 0x3d, "William Tell",
+ 0x3e, "Charleston",
+ 0x3f, "Helan",
+ 0x40, "Left Hand",
+ 0x41, "Right Hand",
+ 0x42, "Happy Birthday",
+ 0x43, "Playground",
+ 0x44, "Fuga",
+ 0x45, "Chase",
+ 0x46, "Classical",
+ 0x47, "Hungarian",
+ 0x48, "Valkyrie",
+ 0x49, "Badinerie",
+ 0x4a, "Bach #3",
+ 0x4b, "Swan Lake",
+ 0x4c, "Tchaikovsky",
+ 0x4d, "Samba",
+ 0x4e, "Mosquito",
+ 0x00, "??"
+};
--- /dev/null
+Od: owner-gnokii@net.lut.ac.uk w imieniu Bernhard Mähr [Bernhard.Maehr@GMX.at]
+Wysłano: 25 listopada 2000 17:06
+Do: gnokii@net.lut.ac.uk
+Temat: Telefonbucheditor 7110
+
+For everyone who trys to decode the 7110 FBUS protocol a tip:
+If in the Windows-Registry HKEY_LOCAL_MACHINE\SOFTWARE\moosy.development\TBE7110
+the String Data is replaced with a Binary with the name Data the program shows a
+error message at the begin but it also enables a option debug. This option
+displays a second window showing the trace of the FBUS. So it should be easier
+to decode the protocol. So it is possible to see the communiction while loading
+the phone numbers, adresses,... and also syncronizing the calendar.
+
+I know it is a little bit unfair, don't tell me that.
+
+I hope this is useful for someone
+
+Bernhard Mähr
+
--- /dev/null
+To irda sniffs use irda_intercept.tgz
+(http://www.dev-thomynet.de/nokworld/noktrace/index.html or tools directory
+- unpacked source is there) from Thomas Schneider
+
+how to use it:
+you MUST stop irda support ('rcirda stop' fur SUSE)
+to free the infrared tty port.
+just type irda_intercept and you should see
+irda packages of port /dv/ttyS1 (hardcoded in source).
+The tool writes also to file 'out.trc'.
+Use this file to decode: 'gnokii --decodefile out.trc'
+(mygnokii have to be compiled with debug)
--- /dev/null
+/*********************************************************************
+ *
+ * Filename: fcs.c
+ * Version: 0.1
+ * Description: fcs calculation routines
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Mon Aug 4 20:40:53 1997
+ * Modified at: Sat Jul 17 08:43:59 1999
+ * Modified by: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ * Sources: crc.h by Dag Brattli <dagb@cs.uit.no> in
+ * linux-irda-project,
+ * ppp.c by Michael Callahan <callahan@maths.ox.ac.uk>
+ * Al Longyear <longyear@netcom.com>
+ *
+ ********************************************************************/
+
+#include "fcs.h"
+
+__u16 irda_fcs16_table[256] =
+{
+ 0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf,
+ 0x8c48, 0x9dc1, 0xaf5a, 0xbed3, 0xca6c, 0xdbe5, 0xe97e, 0xf8f7,
+ 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,
+ 0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876,
+ 0x2102, 0x308b, 0x0210, 0x1399, 0x6726, 0x76af, 0x4434, 0x55bd,
+ 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,
+ 0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c,
+ 0xbdcb, 0xac42, 0x9ed9, 0x8f50, 0xfbef, 0xea66, 0xd8fd, 0xc974,
+ 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,
+ 0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3,
+ 0x5285, 0x430c, 0x7197, 0x601e, 0x14a1, 0x0528, 0x37b3, 0x263a,
+ 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,
+ 0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9,
+ 0xef4e, 0xfec7, 0xcc5c, 0xddd5, 0xa96a, 0xb8e3, 0x8a78, 0x9bf1,
+ 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,
+ 0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70,
+ 0x8408, 0x9581, 0xa71a, 0xb693, 0xc22c, 0xd3a5, 0xe13e, 0xf0b7,
+ 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,
+ 0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036,
+ 0x18c1, 0x0948, 0x3bd3, 0x2a5a, 0x5ee5, 0x4f6c, 0x7df7, 0x6c7e,
+ 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,
+ 0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd,
+ 0xb58b, 0xa402, 0x9699, 0x8710, 0xf3af, 0xe226, 0xd0bd, 0xc134,
+ 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,
+ 0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3,
+ 0x4a44, 0x5bcd, 0x6956, 0x78df, 0x0c60, 0x1de9, 0x2f72, 0x3efb,
+ 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,
+ 0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a,
+ 0xe70e, 0xf687, 0xc41c, 0xd595, 0xa12a, 0xb0a3, 0x8238, 0x93b1,
+ 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,
+ 0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330,
+ 0x7bc7, 0x6a4e, 0x58d5, 0x495c, 0x3de3, 0x2c6a, 0x1ef1, 0x0f78
+};
+
+unsigned short fcs_calc( __u16 oldfcs, __u8 *buf, int len) {
+ __u16 fcs = oldfcs;
+
+ while ( len--)
+ fcs = IR_FCS(fcs, *buf++);
+ return (fcs);
+}
--- /dev/null
+/*********************************************************************
+ *
+ * Filename: fcs.h
+ * Version:
+ * Description: fcs routines for irda
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Mon Aug 4 20:40:53 1997
+ * Modified at: Sat Jul 17 08:43:59 1999
+ * Modified by: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ * Sources: crc.h by Dag Brattli <dagb@cs.uit.no> in
+ * linux-irda-project
+ *
+ ********************************************************************/
+
+#ifndef FCS_H
+#define FCS_H
+
+#include <linux/types.h>
+
+#define INIT_FCS 0xffff /* Initial FCS value */
+#define GOOD_FCS 0xf0b8 /* Good final FCS value */
+
+#define IR_FCS(fcs, byte)((fcs >> 8)^irda_fcs16_table[ (fcs^byte) & 0xff])
+
+unsigned short fcs_calc( __u16 oldfcs, __u8 *buf, int len);
+
+extern __u16 irda_fcs16_table[];
+
+#endif
--- /dev/null
+/*********************************************************************
+ *
+ * Filename: irda.h
+ * Version:
+ * Description: irda-specific defines
+ * Status: Experimental.
+ * Author: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ * Created at:
+ * Modified at:
+ * Modified by: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ *
+ * Copyright (c) 1999 Thomas Schneider, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * IN NO EVENT SHALL THOMAS SCHNEIDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THOMAS SCHNEIDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THOMAS SCHNEIDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER
+ * IS ON AN "AS IS" BASIS, AND THOMAS SCHNEIDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+ * MODIFICATIONS.
+ *
+ * This material is provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+#ifndef __NOKTRACE_IRDA_H
+#define __NOKTRACE_IRDA_H
+
+#include <glib.h>
+
+
+/*
+ * service hints
+ * -------------
+ * - first byte
+ */
+#define PNP_COMP 0x00
+#define PDA_PALM 0x01
+#define COMPUTER 0x02
+#define PRINTER 0x03
+#define MODEM 0x04
+#define FAX 0x05
+#define LAN 0x06
+#define EXTENS 0x07
+
+
+/*
+ * output-defines
+ * --------------
+ */
+#define OUT_ALL 0x01
+#define OUT_IRLAP 0x02
+#define OUT_IRLMP 0x03
+#define OUT_HIGH_LEVEL 0x04
+
+#define OUT_FORM_LINE 0x01
+#define OUT_FORM_STEP 0x02
+
+#define OUT_SCREEN 0x01
+#define OUT_FILE 0x02
+
+/*
+ * some types
+ */
+typedef unsigned char BYTE;
+typedef unsigned char U8 ;
+typedef unsigned short U16 ;
+typedef unsigned int U32 ;
+
+/*
+ * some structs
+ */
+typedef struct
+{
+ U16 length;
+ U16 a_offset;
+ BYTE buf[4096];
+} RAW_FRAME;
+
+typedef struct
+{
+ U16 bof_length;
+ BYTE * bof;
+ BYTE a;
+ BYTE c;
+ U16 info_length;
+ BYTE * info;
+ U32 fcs; /* must be U32 because escaped fcs */
+ BYTE eof_length;
+ BYTE * eof;
+ BYTE esc_nr; /* all ce's - include also esc_fcs */
+ BYTE esc_fcs; /* nr of ce's in fcs */
+ U16 computed_fcs;
+} IRLAP_FRAME;
+
+typedef struct
+{
+ U16 bof_length;
+ BYTE * bof;
+ BYTE a;
+ BYTE c;
+ U16 info_length;
+ BYTE * info;
+ U32 fcs; /* must be U32 because escaped fcs */
+ BYTE eof_length;
+ BYTE * eof;
+ BYTE esc_nr; /* all ce's - include also esc_fcs */
+ BYTE esc_fcs; /* nr of ce's in fcs */
+ U16 computed_fcs;
+} IRLAP_RAW_FRAME;
+
+typedef struct
+{
+ U8 cmd;
+ U8 dlsap_sel;
+ U8 slsap_sel;
+ U16 info_length;
+ U8 * info;
+} IRLMP_FRAME;
+
+typedef struct
+{
+ BYTE baud_rate_master;
+ BYTE baud_rate_client;
+ BYTE baut_rate_connection;
+ BYTE state;
+} NEGOTATION_PARAM;
+
+typedef struct
+{
+ BYTE irlap_state;
+ BYTE irlmp_state;
+ U32 p_src_adr; /* primary - source address */
+ U32 s_src_adr; /* secondary - source address */
+ U8 conn_adr; /* connection address */
+} CONNECTION;
+
+typedef struct
+{
+ U32 prim_nr_bytes; /* bytes from primary station */
+ U32 sec_nr_bytes ; /* bytes from secomdary station */
+ U32 prim_fcs_errors; /* nr of fcs-errors from prim. */
+ U32 sec_fcs_errors; /* nr of fcs-errors from sec. */
+ U32 prim_frames; /* frames from primary */
+ U32 sec_frames; /* frames from secondary */
+ U32 prim_esc_nr; /* nr of ecsapes from primary */
+ U32 sec_esc_nr; /* nr of escapes from secondary */
+} CONNECT_STATISTIC;
+
+typedef struct
+{
+ BYTE deep; /* deep of output (L2, L3, ... */
+ BYTE form; /* kind of output (line, steps) */
+ BYTE bit_output; /* if output as bits */
+ BYTE dest; /* file, screen */
+ FILE input_fd; /* input FILE */
+ GString infile_name; /* name of input-file */
+ FILE output_file; /* output FILE */
+ GString outfile_name; /* name of input-file */
+} OUTPUT_PARAMS;
+
+
+#endif /* __NOKTRACE_IRDA_H */
+
--- /dev/null
+/*********************************************************************
+ *
+ * Filename: irlap.h
+ * Version:
+ * Description: in this file you can only find define´s for parts
+ * of the irlap-layer. If you want read the typedef´s
+ * for struct´s look into irda.h
+ * Status: Experimental.
+ * Author: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ * Created at:
+ * Modified at:
+ * Modified by: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ *
+ * Copyright (c) 1999 Thomas Schneider, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * IN NO EVENT SHALL THOMAS SCHNEIDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THOMAS SCHNEIDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THOMAS SCHNEIDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER
+ * IS ON AN "AS IS" BASIS, AND THOMAS SCHNEIDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+ * MODIFICATIONS.
+ *
+ * This material is provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+/*
+ * in this file you can only find define´s for parts
+ * of the irlap-layer. If you want read the typedef´s
+ * for struct´s look into irda.h
+ */
+
+#ifndef __IRLAP_H
+#define __IRLAP_H
+
+#include <glib.h>
+
+
+#define IRDA_XBOF 0xFF
+#define IRDA_BOF 0xC0
+#define IRDA_EOF 0xC1
+
+/*
+ * IrLAP-OFFSETS
+ * -------------
+ */
+#define IRLAP_A_OFF 0x00
+#define IRLAP_C_OFF 0x01
+#define IRLAP_I_OFF 0x02
+
+/*
+ * IrLAP-DEFINES
+ * -------------
+ */
+#define IRLAP_XBOF 0xFF
+#define IRLAP_BOF 0xC0
+#define IRLAP_EOF 0xC1
+#define IRLAP_CE 0x7D
+#define IRLAP_ESC IRLAP_CE
+
+#define IRLAP_ESC_MASK (~0xDF)
+
+#define IRLAP_A_LENGTH 1
+#define IRLAP_C_LENGTH 1
+#define IRLAP_FCS_LENGTH 2
+#define IRLAP_EOF_LENGTH 1
+
+#define IRLAP_C_MASK 0x03
+#define IRLAP_U_FRAME 0x03
+#define IRLAP_S_FRAME 0x01
+#define IRLAP_PF_BIT_MASK (~0xEF)
+#define IRLAP_PF_BIT_CLR_MASK (~0x10)
+#define IRLAP_Nr_CLR_MASK 0x1F
+
+/*
+ * IRLAP U cmd/response
+ * --------------------
+ * - all defines use a cleared P/F-Bit
+ * (irlap_frame -> c & IRLAP_PF_BIT_CLR_MASK)
+ * - page 26 in IrLAP-spec
+ * - if no _CMD or _RSP name is _CMD_RSP (e.g. 0x83)
+ */
+#define IRLAP_SNRM_RNRM 0x83
+#define IRLAP_DISC_RD 0x43
+#define IRLAP_UI_UI 0x03
+#define IRLAP_XID_CMD 0x2F
+#define IRLAP_TEST_TEST 0xE3
+#define IRLAP_UA_RSP 0x63
+#define IRLAP_FRMR_RSP 0x87
+#define IRLAP_DM_RSP 0x0F
+#define IRLAP_XID_RSP 0xAF
+
+/*
+ * IRLAP S cmd/response
+ * --------------------
+ * - all defines use a cleared P/F-Bit and cleared Nr
+ * (irlap_frame -> c & IRLAP_PF_BIT_CLR_MASK & IRLAP_Nr_CLR_MASK)
+ * - page 32 in IrLAP-spec
+ * - for both (cmd and response) the same mask is defined
+ */
+#define IRLAP_RR 0x01
+#define IRLAP_RNR 0x05
+#define IRLAP_REJ 0x09
+#define IRLAP_SREJ 0x0D
+
+
+/*
+ * irlap-connection-states
+ * -----------------------
+ * - negotation defines are also conn-states
+ */
+#define IRLAP_DISC 0x00 /* disconnected */
+#define IRLAP_NDM 0x01 /* normaldisconnect mode */
+#define IRLAP_NRM 0x02 /* normal response mode */
+
+/*
+ * negotation-defines
+ * ------------------
+ */
+/* negotation-states */
+#define NEG_SNRM_OK 0x01
+#define NEG_WAIT_FOR_UA 0x02
+#define NEG_UA_OK 0x03
+#define NEG_COMPLETE 0x04
+
+#define B576000 576000
+#define B1152000 1152000
+
+#define IRLAP_SNRM_SRC_ADR 0x00 /* src in SNRM */
+#define IRLAP_SNRM_DEST_ADR 0x04 /* dest in SNRM */
+#define IRLAP_SNRM_CONN_ADR 0x08 /* connection-adr in SNRM */
+#define IRLAP_UA_SRC_ADR 0x00 /* src in UA */
+#define IRLAP_UA_DEST_ADR 0x04 /* dest in UA */
+#define IRLAP_NEG_SNRM_PARAM_OFF 0x09 /* src(U32) dest(U32) adr(8) */
+#define IRLAP_NEG_UA_PARAM_OFF 0x08 /* src(U32) dest(U32) */
+#define IRLAP_NEG_BPS_PI 0x01 /* IrLAP page 39 */
+#define IRLAP_PI_LENGTH 1 /* no more longer used */
+#define IRLAP_PL_LENGTH 1 /* no more longer used */
+
+/*
+ * defines for decode xid-cmd
+ * --------------------------
+ */
+#define XID_C_FI_OFFSET 0x00 /* offset for format identifier (U8) */
+#define XID_C_SRC_ADR_OFF 0x01 /* offset for source address (U32) */
+#define XID_C_DEST_ADR_OFF 0x05 /* offset for dest address (U32) */
+#define XID_C_DISC_F_OFF 0x09 /* offset for discovery flags (U8) */
+#define XID_C_SLOT_NR_OFF 0x0A /* offset for slot number (U8) */
+#define XID_C_VERSION_OFF 0x0B /* offset for version (U8) */
+#define XID_C_DISC_I_OFF 0x0C /* offset for discovery information */
+#define XID_C_FLAG_TRUE 0x01 /* flags in cmd only if FI == 0x01 */
+#define XID_C_F_SLOT_MASK 0x03 /* mask for slot numbers in di-flag */
+#define XID_C_F_NEW_ADR_M 0x04 /* mask for new device-address-gen. */
+#define XID_C_LAST_SLOT 0xFF /* nr. for last slot in xid-cmd */
+#define XID_C_DISC_I_M_L 0x20 /* max length of discovery info */
+#define XID_C_DI_S_H_OFF 0x0C /* 1. service hint offset in disc-inf */
+#define XID_C_DI_S_H_EX_M 0x07 /* serv.hint extent. mask in disc_inf */
+
+/*
+ * defines for decode xid-rsp
+ * --------------------------
+ */
+#define XID_R_FI_OFFSET 0x00 /* offset for format identifier (U8) */
+#define XID_R_SRC_ADR_OFF 0x01 /* offset for source address (U32) */
+#define XID_R_DEST_ADR_OFF 0x05 /* offset for dest address (U32) */
+#define XID_R_DISC_F_OFF 0x09 /* offset for discovery flags (U8) */
+#define XID_R_SLOT_NR_OFF 0x0A /* offset for slot number (U8) */
+#define XID_R_VERSION_OFF 0x0B /* offset for version (U8) */
+#define XID_R_DISC_I_OFF 0x0C /* offset for discovery information */
+#define XID_R_FLAG_TRUE 0x01 /* flags in rsp only if FI == 0x01 */
+#define XID_R_F_SLOT_MASK 0x03 /* mask for slot numbers in di-flag */
+#define XID_R_F_NEW_ADR_M 0x04 /* mask for new device-address-gen. */
+#define XID_R_LAST_SLOT 0xFF /* nr. for last slot in xid-cmd/rsp */
+#define XID_R_DISC_I_M_L 0x20 /* max length of discovery info */
+#define XID_R_DI_S_H_OFF 0x0C /* 1. service hint offset in disc-inf */
+#define XID_R_DI_S_H_EX_M 0x07 /* serv.hint extent. mask in disc_inf */
+#define XID_R_SNIFF_FRAME 0xFFFFFFFF /* dest address for sniffing */
+
+/*
+ * defines for snrm-cmd
+ * --------------------
+ */
+#define SNRM_CMD_RESET_LEN 0x00 /* no i-field is present */
+#define SNRM_EST_CONNECT_ADR 0xFF /* conn.adr. in case con.establish */
+#define SNRM_C_SRC_ADR_OFF 0x00 /* offset for source address (U32) */
+#define SNRM_C_DEST_ADR_OFF 0x04 /* offset for dest address (U32) */
+#define SNRM_C_N_C_ADR_OFF 0x08 /* new conn. adr. offset (U8) */
+#define SNRM_C_NEG_OFF 0x09 /* negotation-fields offset */
+#define SNRM_BPS_PI 0x01 /* bps-pi */
+#define SNRM_MAX_TAT_PI 0x82 /* max. turn around time pi */
+#define SNRM_DATA_SIZE_PI 0x83 /* data size pi */
+#define SNRM_WIN_SIZE_PI 0x84 /* window size pi */
+#define SNRM_ADD_BOF_PI 0x85 /* addition BOFs pi */
+#define SNRM_MIN_TAT_PI 0x86 /* min. turn around time pi */
+#define SNRM_LD_TT_PI 0x08 /* link disc./threshold time pi */
+
+/*
+ * defines for ua-rsp-frame
+ * ------------------------
+ */
+#define UA_CONNECT_MIN_LENGTH 0x0E /* 14 are min length to use the frame
+ * for response to snrm used to
+ * establish a connection - look at
+ * page 39 - negotation: type 0 params
+ * must be negotiated at both stations
+ * bps and link disc/threshold time -
+ * in this case also src and dest are
+ * used ( 4 + 4 + 3 + 3), page 31 */
+#define UA_WITH_SRC_DST_LEN 0x08 /* ua len with src and dest */
+#define UA_SRC_ADR_OFF 0x00 /* offset for source address (U32) */
+#define UA_DEST_ADR_OFF 0x04 /* offset for dest address (U32) */
+#define UA_NEG_OFF 0x08 /* negotation-fields offset */
+#define UA_BPS_PI 0x01 /* bps-pi */
+#define UA_MAX_TAT_PI 0x82 /* max. turn around time pi */
+#define UA_DATA_SIZE_PI 0x83 /* data size pi */
+#define UA_WIN_SIZE_PI 0x84 /* window size pi */
+#define UA_ADD_BOF_PI 0x85 /* addition BOFs pi */
+#define UA_MIN_TAT_PI 0x86 /* min. turn around time pi */
+#define UA_LD_TT_PI 0x08 /* link disc./threshold time pi */
+
+
+#endif /* __IRLAP_H */
+
--- /dev/null
+#
+#/*********************************************************************
+# *
+# * Filename: Makefile
+# * Version:
+# * Description: Makefile for irda_intercept
+# * Status: Experimental.
+# * Author: Thomas Schneider
+# * Created at: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+# * Modified at: Sun Jul 18 12:03:03 1999
+# * Modified by: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+# *
+# * Copyright (c) 1999 Thomas Schneider, All Rights Reserved.
+# *
+# * This program is free software; you can redistribute it and/or
+# * modify it under the terms of the GNU General Public License as
+# * published by the Free Software Foundation; either version 2 of
+# * the License, or (at your option) any later version.
+# *
+# * This program is distributed in the hope that it will be useful, but
+# * WITHOUT ANY WARRANTY; without even the implied warranty of
+# * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# * General Public License for more details.
+# *
+# * You should have received a copy of the GNU General Public License
+# * along with this program; if not, write to the Free Software
+# * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# *
+# * IN NO EVENT SHALL THOMAS SCHNEIDER BE LIABLE TO ANY PARTY FOR
+# * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+# * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+# * IF THOMAS SCHNEIDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+# * DAMAGE.
+# *
+# * THOMAS SCHNEIDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+# * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+# * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER
+# * IS ON AN "AS IS" BASIS, AND THOMAS SCHNEIDER HAS NO OBLIGATION TO
+# * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+# * MODIFICATIONS.
+# *
+# * This material is provided "AS-IS" and at no charge.
+# *
+# ********************************************************************/
+
+#
+# Serial port for communication
+#
+
+MODEMDEVICE=-DMODEMDEVICE="\"/dev/ttyS1\""
+
+COMMON=-Wall -O2 \
+ ${MODEMDEVICE}
+
+all: irda_intercept
+
+
+irda_intercept: irda_intercept.o ../fcs/fcs.o
+ cc ${COMMON} \
+ `gtk-config --cflags` `gtk-config --libs`\
+ irda_intercept.o ../fcs/fcs.o\
+ -o irda_intercept
+
+irda_intercept.o: irda_intercept.c ../include/irda.h ../include/irlap.h
+ cc ${COMMON} \
+ `gtk-config --cflags` \
+ -c irda_intercept.c
+
+../fcs/fcs.o: ../fcs/fcs.c ../fcs/fcs.h
+ cc ${COMMON} \
+ `gtk-config --cflags` \
+ -c $*.c -o $@
--- /dev/null
+/*********************************************************************
+ *
+ * Filename: irda_intercept.c
+ * Version:
+ * Description: intercept irda-traffic incl. negotation and write
+ * output to a file
+ * Status: Experimental.
+ * Author: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ * Created at:
+ * Modified at:
+ * Modified by: Thomas Schneider <nok-trace-men@dev-thomynet.de>
+ *
+ * Copyright (c) 1999 Thomas Schneider, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ * IN NO EVENT SHALL THOMAS SCHNEIDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THOMAS SCHNEIDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THOMAS SCHNEIDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER
+ * IS ON AN "AS IS" BASIS, AND THOMAS SCHNEIDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR
+ * MODIFICATIONS.
+ *
+ * This material is provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+#include <sys/time.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <termios.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <string.h>
+#include <signal.h>
+#include <glib.h>
+#include "../include/irda.h"
+#include "../include/irlap.h"
+#include "../fcs/fcs.h"
+
+#define INIT_BAUDRATE B9600
+
+#define _POSIX_SOURCE 1 /* POSIX compliant source */
+
+#define INITIAL_TIMEOUT 15
+#define DEFAULT_TIMEOUT 5
+
+#define OUTFILE_SUFFIX ".trc"
+#define DEFAULT_OUTFILE "out"OUTFILE_SUFFIX
+
+static int initfdflags = -1; /* Initial file descriptor flags */
+static struct termios old_port_sets; /* old port-termios for restore */
+
+int port_fd;
+
+NEGOTATION_PARAM negotation_param;
+CONNECTION connection;
+
+static speed_t speed_list[8] = { B2400, B9600, B19200, B38400,
+ B57600, B115200, B576000, B1152000 };
+static const char *speed_name[] = { "2400", "9600", "19200", "38400",
+ "57600", "115200", "576000", "1152000"};
+
+/*
+ * negotation
+ * ----------
+ * - in negotation set new device speed
+ */
+void negotation ( IRLAP_FRAME * irlap_frame )
+{
+ BYTE cmd = irlap_frame -> a & 0x01;
+ speed_t new_speed = 0;
+ int i = 0;
+ int m = 0;
+ struct termios set;
+ BYTE tmp = 0;
+
+ /*
+ * snrm-frame
+ * ----------
+ * - 4 src
+ * - 4 dest
+ * - 1 new connection address
+ * - 1 pi
+ * - 1 pl
+ * - [pl] pv
+ * ua-frame
+ * --------
+ * - 4 src
+ * - 4 dest
+ * - 1 pi
+ * - 1 pl
+ * - [pl] pv
+ */
+
+ if ( cmd ) {
+ /*
+ * SNRM - CMD
+ * ----------
+ * - in IrLAP (V. 1.1) page 27
+ * - U32 : src-dev-adr
+ * - U32 : dest-dev-adr
+ * - U8 : connection address
+ * - start of neg. params
+ */
+ if ( irlap_frame -> info_length < ( IRLAP_NEG_SNRM_PARAM_OFF +3 ) ) {
+ printf ("\t==> IrLAP: in SNRM-CMD no Info! <==\n");
+ } else {
+ memcpy ( &connection.p_src_adr,
+ &(irlap_frame -> info[IRLAP_SNRM_SRC_ADR]),
+ sizeof(connection.p_src_adr));
+ memcpy ( &connection.s_src_adr,
+ &(irlap_frame -> info[IRLAP_SNRM_DEST_ADR]),
+ sizeof(connection.s_src_adr));
+ connection.conn_adr = irlap_frame -> info[IRLAP_SNRM_CONN_ADR];
+ if ( irlap_frame -> info[IRLAP_NEG_SNRM_PARAM_OFF] ==
+ IRLAP_NEG_BPS_PI ) {
+ /* really bps-parameter-identifier */
+ if ( irlap_frame -> info[IRLAP_NEG_SNRM_PARAM_OFF + 1] == 1 ) {
+ negotation_param.baud_rate_master =
+ irlap_frame -> info [IRLAP_NEG_SNRM_PARAM_OFF + 2];
+ negotation_param.state = NEG_WAIT_FOR_UA;
+ } else {
+ printf ("\t==> IrLAP: SNRM-CMD: speed in 2 bytes! <==\n");
+ printf ("\t\t==> IrLAP: my max. speed is 115.2 kbps! <==\n");
+ negotation_param.baud_rate_master =
+ irlap_frame -> info [IRLAP_NEG_SNRM_PARAM_OFF + 3];
+ }
+ } else {
+ printf ("\t==> IrLAP: SNRM-CMD: "
+ "No baud rate dictate in 1. byte! <==\n");
+ }
+ }
+ } else {
+ /* UA -rsp */
+ negotation_param.baud_rate_client = irlap_frame -> info [10];
+ negotation_param.state = NEG_UA_OK;
+
+ /* now compute the new speed */
+ tmp =
+ negotation_param.baud_rate_master & negotation_param.baud_rate_client;
+ if ( tmp & 0x01 ) {
+ new_speed = speed_list[i];
+ m = 0;
+ }
+ for ( i=1; i < 7; i++) {
+ tmp = tmp >> 1;
+ if ( tmp & 0x01 ) {
+ new_speed = speed_list[i];
+ m = i;
+ }
+ }
+ if ( m > 5 ) {
+ /* not defined as B... on my system */
+ printf ("Sorry: Required speed (%s baud) not supported!\n",
+ speed_name[m]);
+ } else {
+ printf ("New speed is: %s\n", speed_name[m]);
+ /* now set the new speed */
+ tcgetattr (port_fd, &set);
+ cfsetospeed(&set, new_speed);
+ cfsetispeed(&set, new_speed);
+ tcsetattr(port_fd, TCSANOW, &set);
+ tcgetattr(port_fd, &set);
+ if ( (cfgetospeed(&set) != new_speed) ||
+ (cfgetispeed(&set) != new_speed) ) {
+ printf ("New speed is not set!\n");
+ }
+ }
+ }
+}
+
+/*
+ * decode_irlap_frame
+ * ------------------
+ * - decode the irlap-c-field
+ */
+void decode_irlap_frame ( IRLAP_FRAME * irlap_frame)
+{
+ BYTE cmd = irlap_frame -> a & 0x01;
+ BYTE poll = irlap_frame -> c & (IRLAP_PF_BIT_MASK);
+ BYTE adr = (irlap_frame -> a) >> 1;
+
+ switch ( irlap_frame -> c & IRLAP_C_MASK ) {
+ case IRLAP_U_FRAME:
+ printf ("U-Frame:\tAdr: %02X Nr: %02X ", adr,
+ (irlap_frame -> c & 0xE0) >> 5);
+ printf ("P/F: %X \t\t", poll >> 4);
+ switch (irlap_frame -> c & IRLAP_PF_BIT_CLR_MASK ) {
+ case IRLAP_SNRM_RNRM:
+ /* SNRM cmd/RNRM response */
+ if ( cmd ) {
+ printf ("SNRM cmd\n");
+ switch (connection.irlap_state) {
+ case IRLAP_DISC:
+ printf ("\t==> IrLAP in DISC but SNRM-CMD? <==\n");
+ break;
+ case IRLAP_NDM:
+ printf ("\t==> Start IrLAP - negotation <==\n");
+ negotation ( irlap_frame );
+ break;
+ case IRLAP_NRM:
+ printf ("\t==> IrLAP in NRM but SNRM-CMD? <==\n");
+ break;
+ default:
+ printf ("\t==> IrLAP in not defined state but SNRM-CMD? <==\n");
+ }
+ } else {
+ printf ("RNRM response\n");
+ }
+ break;
+ case IRLAP_DISC_RD:
+ /* DISC cmd/RD response */
+ if ( cmd ) {
+ printf ("DISC cmd\n");
+ } else {
+ printf ("RD response\n");
+ }
+ break;
+ case IRLAP_UI_UI:
+ /* UI cmd/UI response */
+ if ( cmd ) {
+ printf ("UI cmd\n");
+ } else {
+ printf ("UI response\n");
+ }
+ break;
+ case IRLAP_XID_CMD:
+ /* XID cmd */
+ printf ("XID cmd\n");
+ if ( connection.irlap_state == IRLAP_DISC ) {
+ connection.irlap_state = IRLAP_NDM;
+ printf ("\t==> Set IrLAP-state to:"
+ "NDM (normal disconnected mode) <==\n");
+ }
+ break;
+ case IRLAP_TEST_TEST:
+ /* Test cmd/response */
+ if ( cmd ) {
+ printf ("TEST cmd\n");
+ } else {
+ printf ("TEST response\n");
+ }
+ break;
+ case IRLAP_UA_RSP:
+ /* UA response */
+ printf ("UA response\n");
+ switch (connection.irlap_state) {
+ case IRLAP_DISC:
+ printf ("\t==> IrLAP in DISC but UA-RESPONSE? <==\n");
+ break;
+ case IRLAP_NDM:
+ if ( negotation_param.state == NEG_WAIT_FOR_UA ) {
+ printf ("\t==> Continue IrLAP - negotation! <==\n");
+ negotation ( irlap_frame );
+ } else {
+ printf ("\t==> IrLAP in NDM but not wait for negotation! <==\n");
+ }
+ break;
+ case IRLAP_NRM:
+ printf ("\t==> UA: IrLAP was/is in NRM ... <==\n");
+ break;
+ default:
+ printf ("\t==> IrLAP in not defined state but UA-RESPONSE? <==\n");
+ }
+ break;
+ case IRLAP_FRMR_RSP:
+ /* FRMR response */
+ printf ("FRMR response\n");
+ break;
+ case IRLAP_DM_RSP:
+ /* DM response */
+ printf ("DM response\n");
+ break;
+ case IRLAP_XID_RSP:
+ /* XID response */
+ printf ("XID response\n");
+ break;
+ default:
+ /* unknown cmd/response */
+ printf ("Unknown IrLAP-U-Frame\n");
+ } /* end of irlap-u-frames */
+ break;
+ case IRLAP_S_FRAME:
+ printf ("S-Frame:\tAdr: %02X Nr: %02X ", adr,
+ (irlap_frame -> c & 0xE0) >> 5);
+ printf ("P/F: %X \t\t", poll >> 4);
+ switch ( irlap_frame -> c &
+ (IRLAP_PF_BIT_CLR_MASK & IRLAP_Nr_CLR_MASK) ) {
+ case IRLAP_RR:
+ /* RR command/response */
+ if ( cmd ) {
+ printf ("RR cmd\n");
+ } else {
+ printf ("RR response\n");
+ }
+ break;
+ case IRLAP_RNR:
+ /* RNR cmd/response */
+ printf ("RNR cmd/response\n");
+ break;
+ case IRLAP_REJ:
+ /* REJ cmd/response */
+ printf ("REJ cmd/response\n");
+ break;
+ case IRLAP_SREJ:
+ /* SREJ cmd/response */
+ printf ("SREJ cmd/response\n");
+ break;
+ default:
+ /* unknown cmd/response */
+ printf ("Unknown IrLAP-S-Frame\n");
+ } /* end of irlap-s-frames */
+ break;
+ default:
+ printf ("I-Frame:\tAdr: %02X Nr: %02X ", adr,
+ (irlap_frame -> c & 0xE0) >> 5);
+ printf ("\tP/F: %X\t", poll >> 4);
+ printf ("Ns: %02X \t", (irlap_frame -> c & 0x0E) >> 1);
+ printf ("Information\n");
+ }
+}
+
+/* unwrap_raw_frame
+ * ----------------
+ * - put raw-frame-datas in irlap-frame
+ */
+void unwrap_raw_frame ( RAW_FRAME * raw_frame )
+{
+ IRLAP_FRAME irlap_frame;
+ BYTE * info_ptr;
+
+ bzero ( &irlap_frame, sizeof(irlap_frame) );
+
+ irlap_frame.a = raw_frame -> buf[IRLAP_A_OFF];
+ irlap_frame.c = raw_frame -> buf[IRLAP_C_OFF];
+ irlap_frame.fcs = raw_frame -> buf [(raw_frame -> length) -2] << 8;
+ irlap_frame.fcs |= raw_frame -> buf [(raw_frame -> length) -1];
+
+ irlap_frame.info_length = raw_frame -> length -
+ IRLAP_A_LENGTH - IRLAP_C_LENGTH - IRLAP_FCS_LENGTH;
+
+ info_ptr = g_malloc ( irlap_frame.info_length * sizeof (BYTE) );
+ memcpy ( info_ptr, &(raw_frame -> buf[IRLAP_I_OFF]),
+ irlap_frame.info_length);
+ irlap_frame.info = info_ptr;
+ decode_irlap_frame ( &irlap_frame );
+ g_free(info_ptr);
+
+ printf ("IrLAP: FCS: %04X \n\n", irlap_frame.fcs );
+
+}
+
+/*
+ * cleanup_termios
+ * ---------------
+ * - call on some signals from signalhandler
+ * - before end set the original setting
+ */
+void cleanup_termios ( int signal )
+{
+ tcsetattr(port_fd, TCSANOW, &old_port_sets);
+ exit (0);
+}
+
+/*
+ * init_port
+ * ---------
+ * - get original port-settings and store it
+ * - set new port-settings
+ */
+void init_port ( void )
+{
+ struct termios new_port_sets;
+
+ /* get the original settings and store it for restore */
+ tcgetattr( port_fd, &old_port_sets);
+
+ /* init new settings */
+ bzero(&new_port_sets, sizeof(new_port_sets));
+ new_port_sets.c_cflag = INIT_BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD;
+ new_port_sets.c_iflag = IGNBRK | IGNPAR;
+ new_port_sets.c_oflag = 0;
+
+ /* set input mode (non-canonical, no echo,...) */
+ new_port_sets.c_lflag = 0;
+
+ /* inter-character timer unused x0.1s */
+ new_port_sets.c_cc[VTIME] = 0;
+ /* blocking read until 5 chars received */
+ new_port_sets.c_cc[VMIN] = 1;
+
+ /* set the port now */
+ tcflush(port_fd, TCIFLUSH);
+ tcsetattr(port_fd, TCSANOW, &new_port_sets);
+}
+
+/*
+ * main
+ * ----
+ * - output-file and port open
+ * - get/set port settings
+ * - dataread-loop
+ */
+int main( int argc, char * argv[] )
+{
+ struct sigaction sact; /* signalhandle */
+ GString *outfile_name = g_string_new(DEFAULT_OUTFILE); /* outfile name */
+ FILE *outfile; /* outfile FILE */
+ fd_set ready; /* for select */
+ struct timeval timeout; /* select-timeout */
+ int no_timeout = 1; /* timeout reached */
+ int nr_read = 0; /* byte readed */
+ unsigned char in_buffer[255]; /* temp. buffer */
+ RAW_FRAME raw_frame; /* a raw frame */
+ int is_inframe = FALSE; /* loop in frame */
+ int frame_complete = FALSE; /* frame complete */
+ int done = 0; /* loop control */
+ int i = 0; /* for-index */
+ int nr_of_bytes = 0; /* total bytes */
+ int nr_of_frames = 0; /* total frames */
+ int irlap_bytes = 0; /* w/o BOF etc. */
+ BYTE must_escaped = FALSE; /* after CE = 0x07 */
+ U16 fcsrx = INIT_FCS; /* for fcs-comput. */
+ BYTE nr_esc = 0; /* nr of CE's */
+//CONNECT_STATISTIC statistic; /* statistic */
+//OUTPUT_PARAMS output_params; /* output-control */
+
+ /*
+ * Open the serial device
+ */
+ if ( (port_fd = open( MODEMDEVICE, O_NONBLOCK | O_RDWR)) < 0 ) {
+ printf ( "Failed to open %s!\n", MODEMDEVICE);
+ exit(1);
+ }
+
+ /*
+ * get/set device fd flags
+ */
+ if ( (initfdflags = fcntl( port_fd, F_GETFL)) == -1 ) {
+ printf ( "Couldn't get device fd flags for: %s!", MODEMDEVICE);
+ exit(1);
+ }
+ initfdflags &= ~O_NONBLOCK;
+ fcntl( port_fd, F_SETFL, initfdflags);
+
+ init_port();
+
+ /*
+ * set signal-handler
+ */
+ sact.sa_handler = cleanup_termios;
+ sigaction( SIGHUP, &sact, NULL);
+ sigaction( SIGINT, &sact, NULL);
+ sigaction( SIGPIPE, &sact, NULL);
+ sigaction( SIGTERM, &sact, NULL);
+
+ /*
+ * Set device for non-blocking reads.
+ */
+ if ( fcntl( port_fd, F_SETFL, initfdflags | O_NONBLOCK) == -1) {
+ printf ("Couldn't set device to non-blocking mode (%s)!\n", MODEMDEVICE);
+ exit(1);
+ }
+
+ /*
+ * output-file-handling
+ */
+ if ( argc < 2 ) {
+ printf ("Use default OutPutFile: %s\n", outfile_name -> str);
+ } else {
+ g_string_assign(outfile_name, argv[1]);
+ g_string_append(outfile_name, OUTFILE_SUFFIX);
+ printf ("Use OutPutFile: %s\n", outfile_name -> str);
+ }
+ if ( (outfile = fopen( outfile_name -> str, "wb")) == NULL ) {
+ printf ("Failed to open OutPutFile: %s\n", outfile_name -> str);
+ exit (1);
+ }
+
+ /*
+ * initial timeout
+ * ---------------
+ * - wait 15 seconds
+ */
+ timeout.tv_sec = INITIAL_TIMEOUT;
+ timeout.tv_usec = 0;
+
+ /*
+ * init raw-frame, negotation-struct, connection
+ */
+ bzero(&raw_frame, sizeof(raw_frame));
+ bzero(&negotation_param, sizeof(negotation_param));
+ bzero(&connection, sizeof(connection));
+
+ /* hope we have no irda traffic in moment */
+ connection.irlap_state = IRLAP_DISC;
+
+ /*
+ * now make the data-read-loop
+ */
+ do {
+ FD_ZERO(&ready);
+ FD_SET(port_fd, &ready);
+ no_timeout = select(port_fd + 1, &ready, NULL, NULL, &timeout);
+ if ( FD_ISSET(port_fd, &ready) ) {
+ /* data on port - returns after 16 chars have been input */
+ nr_read = read(port_fd, in_buffer, 16);
+ nr_of_bytes = nr_of_bytes + nr_read;
+ if ( nr_read >= 1 ) {
+ /* write all readed bytes to file */
+ fwrite( in_buffer, 1, nr_read, outfile);
+ /* process every single byte */
+ for (i=0; i < nr_read; i++) {
+ if (raw_frame.length < (4096-1) ) {
+ switch ( in_buffer[i] ) {
+ case IRLAP_XBOF:
+ if ( is_inframe ) {
+ /*
+ * no - its not a XBOF we are inside a frame
+ * broadcast in xid for example
+ */
+ irlap_bytes++;
+ fcsrx = IR_FCS(fcsrx, in_buffer[i]);
+ is_inframe = TRUE;
+ raw_frame.buf[raw_frame.length] = in_buffer[i];
+ }
+ break;
+ case IRLAP_BOF:
+ is_inframe = TRUE;
+ break;
+ case IRLAP_EOF:
+ frame_complete = TRUE;
+ is_inframe = FALSE;
+ break;
+ case IRLAP_CE:
+ must_escaped = TRUE;
+ is_inframe = TRUE;
+ nr_esc++;
+ break;
+ default:
+ is_inframe = TRUE;
+ if ( must_escaped ) {
+ fcsrx = IR_FCS(fcsrx, (in_buffer[i] ^ IRLAP_ESC_MASK) );
+ raw_frame.buf[raw_frame.length] =
+ (in_buffer[i]^IRLAP_ESC_MASK);
+ must_escaped = FALSE;
+ } else {
+ fcsrx = IR_FCS(fcsrx, in_buffer[i]);
+ raw_frame.buf[raw_frame.length] = in_buffer[i];
+ }
+ irlap_bytes++;
+ }
+ raw_frame.length = irlap_bytes;
+ if ( frame_complete ) {
+ /* now raw-frame is complete */
+ if ( fcsrx != GOOD_FCS ) {
+ printf (" **** !!! FCS-ERROR !!! ****\n");
+ } else {
+ unwrap_raw_frame ( &raw_frame );
+ }
+ nr_of_frames++;
+ /* reset all to defaults */
+ raw_frame.length = 0;
+ raw_frame.a_offset = 0;
+ frame_complete = FALSE;
+ fcsrx = INIT_FCS;
+ nr_esc = 0;
+ irlap_bytes = 0;
+ }
+ }
+ }
+ } else {
+ printf ("No data to read - why?\n");
+ done = 1;
+ }
+ }
+ /*
+ * reset timeout - wait 5 seconds
+ */
+ timeout.tv_sec = DEFAULT_TIMEOUT;
+ timeout.tv_usec = 0;
+ if ( ! no_timeout ) {
+ printf ("TimeOut!\nConnection summary:\n-------------------\n");
+ printf ("Total nr of received bytes : %i\n", nr_of_bytes);
+ printf ("Total nr of received frames: %i\n", nr_of_frames);
+ done = 1;
+ }
+ } while ( ! done );
+
+ g_string_free(outfile_name, TRUE);
+ fclose (outfile);
+ tcsetattr(port_fd, TCSANOW, &old_port_sets);
+ exit(0);
+}
--- /dev/null
+
+All this software was created from observating other programs - what they
+send to/from phone. There two methods to dump transmission:
+
+1.hardware
+
+ You have to connect RxD (or TxD) and GND pin from the COM port, you use with
+ phone, to the second COM port. Then you run soft, which will show, what is
+ received by second port (now in win32 with enabled debug it can be
+ "gnokii --sniff port")
+
+ TIP: if you want to sniff MBUS, connect RxD (everything, what goes from
+ TxD is repeated on RxD)
+
+2.software
+
+ You run emulator of OS, where program work. Then using emulator functions
+ see, what is send (emulator is between phone and program, isn't it ?).
+
+When you have transmission, try to find some identical sequences. If you will
+have them, try to find each frame format...
\ No newline at end of file
--- /dev/null
+
+Last update 23.02.2002
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Assembled by
+ Balazs Nagy (js@lsc.hu)
+ Harri Yli-Torkko (hyt@surfeu.fi)
+ Alfred R. Nurnberger <arnu@flosys.com>
+ Hugh Blemings <Hugh.Blemings@vsb.com.au>
+ Mike Bradley <mike@trumpington.st>
+ Odinokov Serge <serge@takas.lt>
+ Pavel Janik <Pavel@Janik.cz>
+ BORBELY Zoltan (bozo@andrews.hu)
+ Pawel Kot <pkot@linuxnews.pl>
+ Marcin Wiacek (Marcin-Wiacek@TOPNET.PL)
+ ... and other members of gnokii mailing list
+ and authors of some WWW pages.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+NOTE: this information isn't (and can't be) complete. If you know anything
+about features not listed here or you noticed a bug in this list, please
+notify us via e-mail. Thank you.
+
+Document describing frames used in
+GSM/PCN Nokia 6110 and derivatives (Nokia 6130, 6150, 6190, 5110, 5130, 5150,
+5190, 3210, 3310)
+Correct format is FBUS version 2/Direct IRDA/MBUS version 2
+(see nokia.txt for protocol details):
+
+ List:
+
+0x00: Monitoring values
+ r monitoring value {+0x01, 0x01, block... }
+ where block: 0x5e, 0x05, 0x7a(?), 0xd0(?), 0x85(?), 0x02, percentHI, percentLO
+ Battery percent level
+ 0x5e, 0x0c, 0x52(?), 0x4b(?), 0x6f(?), 0x02, voltageHI, voltageLO
+ Battery standby voltage
+ ............
+0x01: Call Information
+ s Make call { 0x0001, "number", type, block }
+ where type:
+ 0x01 - data call
+ 0x05 - voice call
+ block:
+ data call (non digital lines):
+ 0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
+ 0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00
+ data call (digital lines):
+ 0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
+ 0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
+ 0x88,0x90,0x21,0x48,0x40,0xbb
+ voice call:
+ 0x01, 0x01, 0x05, 0x81/0x00, sendnum, 0x00, 0x00, 0x01
+ where:
+ sendnum (own number sending):
+ 0x01: preset (depends on network)
+ 0x03: on
+ 0x02: off
+ r Call going msg { 0x0002 }
+ r Call in progress { 0x0003, seqnr }
+ r Remote end hang up { 0x0004, seqnr, ?, error (like in netmon in 39) }
+ r incoming call alert { 0x0005, seqnr, numlen, "number", namelen, "name" }
+ s Answer call part 2 { 0x0006, seqnr, 0x00 }
+ r answered call { 0x0007, seqnr }
+ s Hang up { 0x0008, seqnr, 0x85 }
+ r terminated call { 0x0009, seqnr }
+ r call msg { 0x000a, seqnr }
+ r call held { 0x0023, seqnr, 0x01 }
+ r call resumed { 0x0025, seqnr, 0x01 }
+ r Send DTMF/voice call { 0x0040}
+ s Answer call part 1 { 0x0042,0x05,0x01,0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80 }
+ s Sent after issuing { 0x0042,0x05,0x81,0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
+ data call 0x88,0x90,0x21,0x48,0x40,0xbb,0x07,0xa3,
+ (digital lines) 0xb8,0x81,0x20,0x15,0x63,0x80 }
+ s Sent after issuing { 0x0042,0x05,0x01,0x07,0xa2,0xc8,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ data call 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80,
+ (non digital lines) 0x01,0x60 }
+ s Send DTMF { 0x0050, length, {ascii codes for DTMF}, 0x01 }
+
+ Note:
+ to make data call (non digital lines):
+ 1.send "Make call" for non digital lines
+ 2.send "Sent after issuing data call (non digital lines)"
+ to make data call (digital lines):
+ 1.send "Answer call part 1"
+ 2.send "Sent after issuing data call (digital lines)"
+ 3.send "Make call" for digital lines
+ to answer call:
+ 1.send "Answer call part 1"
+ 2.send "Answer call part 2"
+
+0x02: SMS handling
+ s Send SMS message { 0x0001, 0x02, 0x00 (SEND REQUEST), ... }
+ r Message sent { 0x0002 }
+ r Send failed { 0x0003, ?, ?, error (like in netmon in 65)}
+ s Get SMS message { 0x0007, 0x02, location, 0x01, 0x64 }
+ s Initiate connection { 0x000d, 0x00, 0x00, 0x02 }
+ r Initiate ACK { 0x000e, 0x01 }
+ r SMS message received { 0x0010, ...... } (whole message)
+ s Set CellBroadcast { 0x0020, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01 }
+ for enable cell broadcast ?
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+ for disable cell broadcast ?
+ r Set CellBroadcast OK { 0x0021, 0x01 }
+ r Read CellBroadcast { 0x0023, ?, ?, ?, channel, ?, message... } ?
+ s Set SMS center { 0x0030, 0x64, priority, checksum? ,0?, format,
+ validity, {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00}
+ where tel.no.[12]: {len, type, {number(BCD)}}
+ type: 0x81: normal
+ 0x91: + (international)
+ 0xd0: alphanumeric
+ format: 0x00: text
+ 0x22: fax
+ 0x24: voice
+ 0x25: ERMES
+ 0x26: paging
+ 0x31: X.400
+ 0x32: email
+ validity: 0x0b: 1 hour
+ 0x47: 6 hours
+ 0xa7: 24 hours
+ 0xa9: 72 hours
+ 0xad: 1 week
+ 0xff: max.time
+ r Set SMS center OK { 0x0031 }
+ r Set SMS center error { 0x0032, reason }
+ s Get SMS center { 0x0033, 0x64, priority }
+ r SMS center received { 0x0034, priority, checksum?, format, 0x00?,
+ validity, {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00}
+ tel.no[12]: {len, type, {number(BCD)}}
+ where priority, checksum, type, validity,
+ tel.no.[12]: see 0x02/0x0030
+ r SMS center error recv { 0x0035, reason }
+0x03: Phonebook functions
+ s Get mem location { 0x0001, memtype, location, 0 }
+ where memory:
+ 0x01: telephone and SIM phonebook (in one)
+ 0x02: telephone phonebook
+ 0x03: SIM phonebook
+ 0x04: SIM fixdialling-phonebook (?)
+ 0x05: Own numbers
+ 0x07: Dialled numbers
+ 0x08: Missed calls
+ 0x09: Received calls
+ 0x0b: voice mailbox (location not important)
+ r mem location recvd { 0x0002, 0x00,namelen,"name",numlen,"number",groupID, 0x01?, yearLO, yearHI, month, day, hour, minute, sec. }
+ Note: in 3310 all entries have null name ("feature" of bug ?)
+ r mem loc error recvd { 0x0003, errtype }
+ where errtype: 0x7d: invalid memory type
+ s Set mem location { 0x0004, memtype,location,namelen,"Name",numlen,"number",groupID }
+ r mem set OK { 0x0005 }
+ r mem set error { 0x0006, errtype }
+ where errtype: 0x7d: name is too long
+ s Mem status request { 0x0007, memtype }
+ r Mem status recvd { 0x0008, memtype, free, used }
+ r Mem status error recv { 0x0009, errtype }
+ where errtype: 0x6f: mem status error
+ 0x7d: invalid memory type
+ 0x8d: waiting for pin
+ s Get caller group data { 0x0010, groupID }
+ r Get caller group data { 0x0011, groupID, size, "Name", ringtoneID, graphic_on?1:0, lenHI, lenLO, OTABitmap (72x14 logo) }
+ r Get call.group error { 0x0012, reason }
+ where reason: 0x7d: invalid location
+ s Set caller group data { 0x0013, groupID, size, "Name", ringtoneID, graphic_on?1:0, lenHI, lenLO, OTABitmap (72x14 logo) }
+ r Set caller group OK { 0x0014 }
+ r Set call.group error { 0x0015, reason }
+ where reason: 0x7d: invalid location
+ s Get speed dial { 0x0016, index(1-9) }
+ r Get speed dial OK { 0x0017, mem.type, location }
+ where mem.type: 0x02: ME (== 0 if not stored)
+ 0x03: SIM
+ location: memory location (== 0 if not stored)
+ r Get speed dial error { 0x0018 }
+ s Set speed dial { 0x0019, index(1-9), mem.type, location }
+ r Set speed dial OK { 0x001a }
+ r Set speed dial error { 0x001b }
+0x04: Phone Status
+ s Phone status { 0x0001 }
+ r Phone status { 0x0002, mode, signal str, ???, pwr, batt.level }
+ where mode: 1: registered within the network
+ 2: call in progress
+ 3: waiting for pin
+ 4: powered off
+ pwr: 1: AC/DC
+ 2: battery
+ s Request Phone ID { 0x0003 }
+ r RequestPhone ID { 0x0004, 0x01,"NOKIA""imei", 0, "model", 0, "prod.code", 0, "HW", 0, "firmware", 0x00, 0x01 }
+0x05: Profile settings
+ s Set profile feature { 0x0010, 1, nr, feature, a, 1 }
+ where nr: see 0x05/0x0013
+ feature: see 0x05/0x0014
+ a: see 0x05/0x0014
+ r Set profile feat. OK { 0x0011, 1 }
+ s Get profile feature { 0x0013, 1, nr, feature, 1 }
+ where nr is profile number (general=0, silent, meeting, outdoor, pager, car, headset=6)
+ feature: see 0x05/0x0014
+ r Get profile feature { 0x0014, 1, nr, feature, 4, a, b, c, d, 1 }
+
+ Note: For Nokia 3330 settings num 0x00 .. 0x09 can be assigned
+ separately to each profile (0x00 .. 0x05), but rest are common
+ to all profiles.
+
+ Features and answers (in a, b, c, d form):
+ 0x00: keypad notes (in Nokia 33x0 feature 0x00)
+ xx, 1, 0, 2
+ xx: 0xff: off
+ 0x00: level 1
+ 0x01: level 2
+ 0x02: level 3
+ 0x01: lights (? only in car profile) (what number in Nokia 3310 ?)
+ xx, 0, 0, 1
+ xx: 0x00: off
+ 0x??: on (maybe 0x01)
+ 0x02: incoming call alert (in Nokia 33x0 feature 0x01)
+ xx, 1, 0, 7
+ xx: 1: ringing,
+ 2: beep once,
+ 3: unknown
+ 4: off
+ 5: ring once
+ 6: ascending
+ 7: caller groups (see feature #0x08)
+ 0x03: ringing tone (in Nokia 33x0 feature 0x02)
+ xx, 0, 0, 0
+ xx: 0x12: ring ring
+ 0x13: low
+ etc
+ 0x04: ringing volume (in Nokia 33x0 feature 0x03)
+ xx, 0, 0, 0
+ xx: level 1 (0x06) - level 5 (0x0a)
+ 0x05: message alert tone (in Nokia 33x0 feature 0x04)
+ xx, 1, 0, 4
+ xx: 0: no tone
+ 1: standard
+ 2: special
+ 3: beep once
+ 4: ascending
+ 0x06: vibration (in Nokia 33x0 feature 0x05)
+ xx: 0: off
+ 1: on
+ 2: Vibrate first
+ 0x07: warning and game tones (in Nokia 33x0 feature 0x06 called warning tones)
+ xx, 4, 0, 4
+ xx: 0xff: off
+ 0x04: on
+ 0x07: screen saver - Nokia 33x0
+ xx: 1: on
+ 0: off
+ 0x08: incoming caller groups (what number in Nokia 3310 ?)
+ xx, 0, 0, 0
+ xx: 1: family
+ 2: VIP
+ 4: friends
+ 8: collegues
+ 16: other
+ 0x08: Screen saver -> Timeout (Nokia 33xx):
+ 0x00 = 5 sec
+ 0x01 = 20 sec
+ ....
+
+ 0x09: automatic answer (what number in Nokia 3310 ?)
+ xx, 0, 0, 1
+ xx: 0x00: off
+ 0x01: on
+
+ 0x09: Screen saver -> Screen saver (Nokia 33xx):
+ 0x00 ... 0x0d = Number of picture image
+
+ 0x0a: ???:
+ ...: ???:
+ 0x15: ???: Read only?
+
+ 0x16: ???:
+ 0x00 = ???
+ 0x01 = ???
+
+ 0x17: Phone book -> Options -> Memory in use (Nokia 3330):
+ 0x00 = Phone
+ 0x01 = SIM card
+
+ 0x18: Settings -> Phone settings -> Network selection (Nokia 3330):
+ 0x00 = Automatic
+ 0x01 = Manual
+
+ 0x19 Settings -> Call settings -> Automatic redial(Nokia 3330):
+ 0x00 = Off
+ 0x01 = On
+
+ 0x1a: Settings -> Call settings -> Speed dialling (Nokia 3330):
+ 0x00 = Off
+ 0x01 = On
+
+ 0x1b: Settings -> Call settings -> Own number sending (Nokia 3330):
+ 0x00 = Set by network
+ 0x01 = On
+ 0x02 = Off
+
+ 0x1c: Settings -> Phone settings -> Cell info display (Nokia 3330):
+ 0x00 = Off
+
+ 0x1d: Phone book -> Options -> Type of view (Nokia 3330):
+ 0x00 = Name list
+ 0x01 = Name, number
+ 0x02 = Large font
+
+ 0x1e: Settings -> Phone settings -> Language (Nokia 3330):
+ 0x00 = English
+ 0x07 = Dansk
+ 0x08 = Svenska
+ 0x09 = Suomi
+ 0x0c = Turcke
+ 0x0e = Norsk
+ 0x10 = Automatic
+
+ 0x32 = Reboots ME (3330)
+
+ 0x1f: ???: Read only? (3330)
+
+ 0x20: Messages -> Message settings -> Common -> Reply via same centre (N3330):
+ 0x00 = No
+ 0x01 = Yes
+
+ 0x21: Messages -> Message settings -> Common -> Delivery reports (3330):
+ 0x00 = No
+ 0x01 = Yes
+
+ 0x22: Clock -> Clock settings -> Show/Hide clock (3330):
+ 0x00 = Show
+ 0x01 = Hide
+
+ 0x23: Clock -> Clock settings -> Time format (N3330):
+ 0x00 = 24-hour
+ 0x01 = 12-hour
+
+ 0x24: Select profile (N3330):
+ 0x00 = General
+ 0x01 ... 0x05 = rest of them
+
+ 0x25: ???: Read only? (N3330)
+
+ 0x26: Settings -> Phone settings -> Confirm SIM service actions (N3330):
+ 0x00 = Not asked
+ 0x01 = Asked
+
+ 0x27: Messages -> Write messages -> Options -> Dictionary (N3330):
+ 0x00 = Off
+ 0x01 = English
+ 0x0a = Suomi
+
+ 0x28: Messages -> Message settings -> Common -> Character support (N3330):
+ 0x00 = Automatic
+ 0x01 = GSM alphabet
+ 0x02 = Unicode
+
+ 0x29: Startup logo settings (N33x0):
+ 0x00 = Your own uploaded logo
+ 0x01 = Nokia
+ 0x02 = Draft HUMAN technology(tm)
+ 0x03 = Itineris
+
+ 0x2a:???: 0x00 = ??? 0x01 = ??? (N3330)
+
+ 0x2b: ???: 0x00 = ??? 0x01 = ??? (N3330)
+
+ 0x2c: ???: Read only? (N3330)
+
+ 0x2d: Clock -> Auto update of date and time (N3330):
+ 0x00 = Off
+ 0x01 = Confirm first
+ 0x02 = On
+
+ s Get welcome message { 0x0016 }
+ r Get welcome message { 0x0017, no.of blocks, { block } * }
+ where block: { id, {blockspecific} }
+ id: 1: startup logo { y, x, picture (coding?) }
+ 2: welcome note { len, "message" }
+ 3: operator msg { len, "message" }
+ s Set welcome message { 0x0018, no.of blocks, { block } * }
+ where block: see 0x05/0x0017
+ r Set welcome OK { 0x0019, 0x01 }
+ s Get profile name { 0x001a, nr }
+ where nr: see 0x05/0x0013
+ r Profile name { 0x001b, 1, 1, 3, flen, nr, len, {text} }
+ where nr: see 0x05/0x0013
+ len: text length
+ flen len + len(nr, len) = len + 2
+ Note: in Nokia 3310 name is in Unicode
+ s ??? { 0x001c }
+ r ??? { 0x001d, 0x93 }
+ s Set oplogo { 0x0030, location, MCC1, MCC2, MNC, lenhi=0x00, lenlo=0x82, OTABitmap }
+ r Set oplogo OK { 0x0031 }
+ r Set oplogo error { 0x0032, reason }
+ where reason: 0x7d invalid location
+ s Get oplogo { 0x0033, location }
+ where location: 1 (doesn't seem to matter)
+ r Get oplogo { 0x0034, location, MCC1, MCC2, MNC, lenhi=0x00, lenlo=0x82, OTABitmap }
+ r Get oplogo error { 0x0035, reason }
+ where reason: 0x7d invalid location
+ s Set ringtone { 0x0036, location,0x00,0x78, ringtone packed according to SM2.0}
+ r Set ringtone OK { 0x0037 }
+ r Set ringtone error { 0x0038, reason }
+ where reason=0x7d, when not supported location
+ s Get services settings { 0x0080, setting (2 bytes) }
+ where: setting: 0x02,0x00=Nokia access number 1
+ 0x02,0x01=Operator access number 1
+ 0x01,0x00=Personal bookmark 1 settings (name only ?)
+ 0x01,0x01=?
+ 0x02,0x02=?
+ r Get services sett.OK { 0x0081, .... }
+ r Get services sett.err { 0x0082, 0x7b }
+0x06: Calling line restriction/Call forwarding etc
+ r Get call divert { 0x0001, 0x02, x, 0x00, divtype, 0x02, calltype, y, z, 0x0b, number, 0x00...0x00, timeout (byte 45) }
+ s Set call divert { 0x0001, 0x03, 0x00, divtype, calltype, 0x01, number(packed like in SMS), 0x00 ... 0x00,
+ length of number (byte 29), 0x00 ... 0x00, timeout (byte 52), 0x00, 0x00, 0x00}
+ NOTE: msglen=0x37
+ where timeout:
+ 0x00: not set ?
+ 0x05: 5 second
+ 0x0a: 10 second
+ 0x0f: 15 second
+ 0x14: 20 second
+ 0x19: 25 second
+ 0x1e: 30 second
+ where divtype:
+ 0x02: all diverts for all call types ?
+ Found only, when deactivate all diverts for all call types (with call type 0x00)
+ 0x15: all calls
+ 0x43: when busy
+ 0x3d: when not answered
+ 0x3e: if not reached
+ calltype:
+ 0x00: all calls (data, voice, fax)
+ 0x0b: voice calls
+ 0x0d: fax calla
+ 0x19: data calls
+ s Deactivate calldiverts{ 0x0001, 0x04, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ s Get call diverts { 0x0001, 0x05, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ r Get prepaid(?) info { 0x0005, ?,?,?,length,message(packed like in 7bit SMS)}
+0x07:
+ s ??? { 0x0022, ? (1&2 sounds OK) }
+ r ??? OK { 0x0023, ?,?,? }
+ r ??? error { 0x0024, reason }
+ s ??? { 0x0025, ??? }
+ r ??? OK { 0x0026, ??? }
+ r ??? error { 0x0027, reason }
+0x08: Security codes
+ s Change code { 0x0004, code, "current", 0x00, "new", 0x00 }
+ where code: 1: security code (5 chars)
+ 2: PIN (4 chars)
+ 3: PIN2 (4 chars)
+ 4: PUK (8 chars)
+ 5: PUK2 (8 chars)
+ s Status request { 0x0007, 0x01 }
+ r pin recvd { 0x0008, accepted }
+ where accepted: 0x0c (or 0x06): OK
+ code: waiting for (0x08/0x0004) code
+ s entering code { 0x000a, code, "code", 0x00 }
+ where code: see 0x08/0x0004
+0x09: SIM login
+ r login { 0x0080 }
+ r logout { 0x0081 }
+0x0a: Network status
+ s Key duplication on/off{ 0x0044, on? 0x01: 0x02 }
+ s get used network { 0x0070 }
+ r network registration { 0x0071, ?,?,?,length,netstatus,netsel,cellIDH,cellIDL,lacH,lacL,netcode,netcode,netcode }
+0x0c: Keys
+ s Get key assignments { 0x0040, 0x01 }
+ r Get key assignments { 0x0041, {key '1'}, 0x00, {key '2'} ... {key '0'}, 0,0,0, {symbols}, 0 }
+ where {key '0'} => ' ', '0'
+ s Press key { 0x0042, press: 0x01; release: 0x02, button, 0x01 }
+ where button: 0x01 - 0x09: 1-9
+ 0x0a: 0
+ 0x0b: #
+ 0x0c: *
+ 0x0d: Power
+ 0x0e: Pick up phone
+ 0x0f: Hang
+ 0x10: Volume +
+ 0x11: Volume -
+ 0x17: Up
+ 0x18: Down
+ 0x19: Menu
+ 0x1a: Names
+ 0x1B onwards: don't know but they do produce
+ a beep and light up the keypad as if
+ a key had been pressed.
+ r Press key ack { 0x0043, press/release/error(0x05) }
+ s ??? { 0x0044 }
+ r ??? ack { 0x0045, 0x01 }
+0x0d: Status
+ r Display { 0x0050, 0x01, y, x, len, "string"(unicode) }
+ s Status request { 0x0051 }
+ r Status { 0x0052, no. of byte pairs, {byte pair} }
+ where {byte pair}: {cmd, 1:off 2:on}
+ cmd: 1: call in progress
+ 2: ???
+ 3: have unread sms
+ 4: voice call active
+ 5: fax call active
+ 6: data call active
+ 7: key lock active
+ 8: is SMS storage full
+ s Display status { 0x0053, 1:on 2:off }
+ (will send displayed messages with x,y coordinates)
+ r Display status ack { 0x0054, 1 }
+0x11: Phone clock & alarm
+ s set date and time { 0x0060, 1,1,7,yearh,yearl,month,mday,hour,min,0x00 }
+ r date and time set { 0x0061 }
+ s get date and time { 0x0062 }
+ r date and time recvd { 0x0063,date_set?,time_set?,?,?,yearh,yearl,month,mday,hour,min,second }
+ where: date_set & time_set==0x01 - set
+ 0x00 - not set, ?,?,yearh,yearl,month,mday,hour,min,second
+ not available in frame
+ s set alarm { 0x006b, 1,32,3,0x02(on-off),hour,min,0x00 }
+ r alarm set { 0x006c }
+ s get alarm { 0x006d }
+ r alarm received { 0x006e,?,?,?,?,alrm(==2:on),hour,min }
+0x12: Connect to NBS port (61xx only ?)
+ s Send {+0x0c, 0x01, UDH header, data}
+ (without 0,1 header -- for oplogo, cli, ringtone etc upload)
+ where: UDH header = 0x06, 0x05, 0x04,destporth,destportl,srcporth,srcportl
+0x13: Calendar notes
+ s Write calendar note { 0x0064, 0x01, 0x10, length, type, yearH, yearL, month, day, hour, timezone,
+ alarm?(alarm yearH, yearL, month, day, hour, timezone): (0,0,0,0,0,0),
+ textlen, "text" }
+ r Write cal.note report { 0x0065, return }
+ where return: 0x01: ok
+ 0x73: failure
+ 0x81: calendar functions busy. Exit Calendar menu and try again
+ s Calendar notes set { 0x0066... }
+ r Calendar note recvd { 0x0067, 0x01, ?, length, type, yrH,yrL,mon,day,hr,tz,alrm yrH,yrL,mon,day,hr,tz,textlen, "text" }
+ r Cal.note recvd error { 0x0067, err }
+ where err: 0x93: not available
+ (0x01: OK)
+ other: error
+ s Delete cal.note { 0x0068, location }
+ r Del. cal.note report { 0x0069, err }
+ where err: 0x01: OK
+ 0x93: cannot delete
+0x14: SMS funcs
+ s Write SMS to SIM { 0x0004, .... }
+ s Mark SMS as read { 0x0007, 0x02, location, 0x00, 0x64 }
+ r SMS message frame rcv { 0x0008,subtype,?,num,?,BCD(smscenter)...} 20->type, 22->status
+ where type: 0x06: delivery report
+ status: 0x00: delivered
+ 0x30: pending
+ 0x46: failed
+ 0x09: reading failed
+ subtype: 0x02: invalid mem type
+ 0x07: empty SMS location
+ 0x0c: no access to memory (no PIN in card, etc.)
+ s Delete SMS message { 0x000a, 0x02, location }
+ r Delete OK { 0x000b }
+ s SMS status request { 0x0036, 0x64 }
+ r SMS status { 0x0037,?,?,?,?,?,?,msgnumber,unread }
+ r SMS status error { 0x0038 }
+0x3f: WAP
+ s Enable WAP frames { 0x0000}
+ r Enable WAP frames { 0x0002, 0x01}
+
+ s ?? { 0x0003}
+ r ?? { 0x0004}
+
+ s Get WAP bookmark { 0x0006, 0x00, location}
+ where location: 0 - 14
+ r Get WAP bookmark { 0x0007, 0x00, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7]}
+ r Get WAP bookmark err { 0x0008, error }
+ where error:
+ 0x00(?)invalid position
+ 0x01 user inside "Bookmarks" menu. Must leave it
+ 0x02 invalid/too high/empty location
+
+ s Set WAP bookmark { 0x0009, 0xff, 0xff, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7] }
+ Note: bookmark is added to the first free location.
+ r Set WAP bookmark OK {+0x01, 0x36, 0x0a, block }
+ where block:
+ 0x0a, location_of_just_written_bookmark(?),
+ 0x00, next_free_location(?)
+ r Set WAP bookmark err {+0x01, 0x36, 0x0b, error }
+ where error:
+ 0x04 - memory is full
+ 0x01 - we are in the bookmark menu
+ 0x00 - unknown reason for now ;(
+
+? s Delete WAP bookmark { 0x000c, 0x00, location }
+ where: location = 0-14
+? r Delete WAR bookmark OK{ 0x000d }
+? r Delete WAPbookmark err{ 0x000e, 0x02 }
+
+ s ?? { 0x000F}
+ r ?? { 0x0010, 0x00}
+
+ s Get WAP settings 1 { 0x0015, location}
+ where location: 0x00 - 0x05
+ r Get WAP settings 1 OK { 0x0016, title length, title (Unicode), URL length, URL(Unicode),con_type, ???[6 bytes],location, ???[5 bytes],security,...}
+ where:
+ con_type: 0x00 - temporary
+ 0x01 - continuous
+ location: when use "Get WAP settings 2 frame", must give it
+ security: 0x00 = no, 0x01 = yes
+ r Get WAP settings 1 err{ 0x0017, error }
+ where error:
+ 0x01 user inside "Settings" menu. Must leave it
+ 0x02 invalid/too high/empty location
+
+ s Get WAP settings 2 { 0x001b, location}
+ where location: 0x00 - 0x1d (you get it in "Get WAP settings 1" frame)
+ r Get WAP settings 2 OK { 0x001c, 0x01, type, frame...}
+ where type : 0x00 - SMS bearer
+ frame:
+ service_num_len, service_num (Unicode), server_num_len, server_num(Unicode)
+ 0x01 - data bearer
+ frame:
+ auth, call_type, call_speed, ?, IP len, IP (Unicode), dialup len, dialup (Unicode),
+ user len, user (Unicode), password len, password (Unicode)
+ where auth: 0x00 - normal, 0x01 - secure
+ call_type: 0x00 - analogue, 0x01 - ISDN
+ call_speed: 0x00 - 9600, 0x01 - 14400
+ 0x02 - USSD bearer
+ frame: type, service number len/IP len,service num (Unicode)/IP (Unicode),service code len,
+ service code (Unicode)
+ where type: 0x01 - service number, 0x00 - IP
+ r Get WAP settings 2 err{ 0x001d,error}
+ where: error=0x05
+0x40: Security commands
+ s ??? {+0x00, 0x00, 0x07, 0x11, 0x00, 0x10, 0x00, 0x00}
+ This frame hangs phone (N3310 4.02). Meaning unknown !
+ s Open simlock 1 { 0x02, 0x03, 0x1f, 0x11, 0x01, 0x01, 0x10, 0x00}
+ r Open simlock 1 { 0x02 }
+ s ???(N6150) { 0x08, 0x00 }
+ r ???(N6150) { 0x08 }
+ s Enable extended cmds { 0x64, cmd }
+ where cmd: 0x00: off
+ 0x01: on
+ 0x02: enter service mode ?
+ 0x03: reset (doesn't ask for PIN again)
+ 0x04: reset (PIN is requested)
+ In 5110 makes reset without PIN
+ 0x06: CONTACT SERVICE!!! Don't try it!
+ s Reset phone settings { 0x65, value, 0x00 }
+ where value: 0x08 - reset UI (User Interface) settings
+ 0x38 - reset UI, SCM and call counters
+ r Reset phone settings { 0x65, 0x00 }
+ s Get IMEI { 0x66 }
+ r Get IMEI { 0x66, 0x01, IMEI, 0x00}
+ s (ACD Readings)?(N6150 { 0x68 }
+ r (ACD Readings)?(N6150 { 0x68, ... }
+ s Get Product Profile
+ Settings { 0x6a}
+ r Get Product Profile
+ Settings { 0x6a, 4bytes with Product Profile Settings }
+ s Set Product Profile
+ Settings { 0x6b, 4bytes with Product Profile Settings }
+ r Set Product Profile
+ Settings OK ? { 0x6b }
+ s Get code { 0x6e, code }
+ where code: see 0x08/0x0004 (only sec.code is allowed)
+ r Get code { 0x6e, code, allowed, allowed? (sec code (text)) }
+ where code: see 0x08/0x0004
+ allowed: 0: no
+ 1: yes
+ s Set code { 0x6f, code, sec code(text), 0x00 }
+ where code: see 0x08/0x0004
+ s Start monitoring { 0x70, block }
+ where block(N6150):
+ 0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xf9,0x76,0x65,0x20,0x00,
+ 0x00,0x00,0x00,0x00,0x18,0x26,0x15,0x7d,0x0a,0x00,
+ 0xf5,0x82,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
+ 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xf0,0x77,0x80,
+ 0x77,0x80,0xf2,0x82,0x20,0x20,0x20,0x20,0x20,0x20,
+ 0x20,0x20,0x20,0x20
+ This block enables probably all possible monitorred parameters.
+ After it phone sends 0x00 message type values
+ s Break monitoring { 0x71 }
+ r Break monitoring { 0x71 }
+ s Reset Permanent
+ Counters (nm->test36) { 0x74, 0x01, 0x01, 0x0e }
+ r Reset Permanent
+ Counters (nm->test36) { 0x74 }
+ s Call commands { 0x7c, block }
+ where where: command, (values)
+ command: 0x01
+ values: number(ASCII), 0x00 - makes voice call
+ command: 0x02 - answer call
+ command: 0x03 - release call
+ r Call commands { 0x7c, command }
+ s Netmonitor { 0x7e, field }
+ where: field: 00: next
+ F0: reset
+ F1: off
+ F2: field test menus
+ F3: developer menus
+ s Open simlock 2 { 0x81, 0x01, locknumber, 0x10, 0x10, 0x10, 0x10, 0x10 }
+ Note: sets simlock type to factory?
+ where locknumber: 1,2,4,8
+ s Open simlock 2 { 0x81, 0x01, locknumber }
+ where locknumber: 1,2,4,8
+ s Close simlock { 0x82, 0x01, locknumber, 0x00, 0x00, locksinfo(lock1,4,2,3), 0x00 }
+ where locknumber: 1,2,4,8
+ r Close simlock { 0x82, the rest like in 0x40/0x8a }
+ s Get simlock info { 0x8a, 0x00}
+ r Get simlock info { 0x8a, 0x00, 0x01, lockstype, locksclosed, 0x00, 0x00, locksinfo(lock1,4,2,3), counter1,counter2,counter4,counter4,0x00 }
+ where: lockstype: bit1,bit2,bit3,bit4 - if set, selected lock is user lock
+ locksclosed: bit1,bit2,bit3,bit4 - if set, selected lock is closed
+ counter1 - counter4: counters for locks
+ s Set downloaded OpName { 0x8b, 0x00, MCC1, MCC2, MNC, Name, 0x00 }
+ r SetdownloadedOpNameOK?{ 0x8b, 0x00, 0x01 }
+ s Get downloaded OpName { 0x8c, 0x00 }
+ r Get downloaded OpName { 0x8c, 0x00, 0x01, MCC1, MCC2, MNC, Name, 0x00,...}
+ s Buzzer pitch { 0x8f, volume, hzLO, hzHI }
+ if volume and hz is 0, it's off
+ r Buzzer pitch { 0x8f}
+ s ACD Readings ? { 0x91, parameter?(0x02,0x03,0x04,0x05,0x07) }
+ r ACD Readings ? { 0x91, parameter?, value? }
+ s Sleep mode test { 0x92, 0x00, 0x00, howlong(2 bytes), enable }
+ where: enable == 0x01 - enable after test
+ 0x00 - don't enable after test
+ howlong (ms) = 0x07, 0xd0 = 2000
+ s ???(N6150) { 0x98, 0x00 }
+ r ???(N6150) { 0x98, 0x00, 0x04 }
+ s Get bin ringtone { 0x9e, location }
+ where: location=0,1,etc.
+ r Get bin ringtone { 0x9e, location, error, contents... }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT available
+ 0x00, OK
+ s Set bin ringtone { 0xa0, location, 0x00, contenst... }
+ where: location=0,1,etc.
+ r Set bin ringtone { 0xa0, location, error }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT set
+ 0x00, ringtone set OK
+ r Get MSid { 0xb5, 0x01, 0x2f, msid, 0x25 }
+ s Get info about phone { 0xc8, 0x01 }
+ r Get info about phone { 0xc8, 0x01, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get MCU SW Checksum { 0xc8, 0x02 }
+ r Get MCU SW Checksum { 0xc8, 0x02, 0x00, checksum (4 bytes),0x00 }
+ s DPS External SW { 0xc7, 0x03 }
+ r DSP External SW { 0xc7, 0x03, 0x00, string,0x00 }
+ s Get HW { 0xc8, 0x05 }
+ r Get HW { 0xc8, 0x05, 0x00, HW version (4 bytes), 0x00 }
+ s Get "Made" Date { 0xc8, 0x05 }
+ r Get "Made" Date { 0xc8, 0x05, 0x00, date(4 bytes), 0x00 }
+ s Get DSP Internal SW { 0xc8, 0x09 }
+ r Get DSP Internal SW { 0xc8, 0x09, 0x00, version (1 bytes), 0x00 }
+ s Get PCI version { 0xc8, 0x0b }
+ r Get PCI version { 0xc8, 0x0b, 0x00, version, 0x00 }
+ s Get system ASIC { 0xc8, 0x0c }
+ r Get system ASIC { 0xc8, 0x0c, 0x00, string, 0x00 }
+ s Get COBBA { 0xc8, 0x0d }
+ r Get COBBA { 0xc8, 0x0d, 0x00, string, 0x00 }
+ s Get PLUSSA { 0xc8, 0x0e }
+ r Get PLUSSA { 0xc8, 0x0e, available, 0x00 }
+ where available: 0x01: not available
+ s Get CCONT { 0xc8, 0x0f }
+ r Get CCONT { 0xc8, 0x0f, available, 0x00 }
+ where available: 0x01: not available
+ s Get PPM version { 0xc8, 0x10 }
+ r Get PPM version { 0xc8, 0x10, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get PPM info { 0xc8, 0x12 }
+ r Get PPM info { 0xc8, 0x12, 0x00, PPM version ("B", "C", etc.), 0x00 }
+ s Set HW version { 0xc9, 0x05, version, 0x00 }
+ s Get Product Code { 0xca, 0x01 }
+ r Get Product Code { 0xca, 0x01, 0x00, number, 0x00 }
+ s Get Order Number { 0xca, 0x02 }
+ r Get Order Number { 0xca, 0x02, 0x00, string, 0x00 }
+ s Get Prod.Ser.Number { 0xca, 0x03 }
+ r Get Prod.Ser.Number { 0xca, 0x03, 0x00, number, 0x00 }
+ s Get Basic Prod.Code { 0xca, 0x04 }
+ r Get Basic Prod.Code { 0xca, 0x04, 0x00, number, 0x00 }
+ s Set Product Code { 0xcb, 0x01, product code, 0x00 }
+ s Set Order Number { 0xcb, 0x02, number, 0x00 }
+ s Set Prod.Ser.Number { 0xcb, 0x03, number, 0x00 }
+ s Get (original ?)IMEI { 0xcc, 0x01 }
+ r Get (original ?)IMEI { 0xcc, 0x01, IMEI, 0x00 }
+ s Get Manufacture Month { 0xcc, 0x02 }
+ r Get Manufacture Month { 0xcc, 0x02, 0x00, string, 0x00 }
+ s Get Purchare date { 0xcc, 0x04 }
+ r Get Purchare date { 0xcc, 0x04, 0x00, string, 0x00 }
+ s Set "Made" date { 0xcd, 0x02, string, 0x00 }
+ s Make "all" phone tests{ 0xce,0x1d,0xfe,0x23,0x00,0x00}
+ s Make one phone test { 0xce,0x1d,num1,num2,num3,num4}
+ Where num1-num4: 0x02,0x00,0x00,0x00;
+ 0x04,0x00,0x00,0x00;
+ 0x08,0x00,0x00,0x00;
+ 0x10,0x00,0x00,0x00;
+ 0x20,0x00,0x00,0x00;
+ 0x40,0x00,0x00,0x00;
+ 0x80,0x00,0x00,0x00;
+ 0x00,0x01,0x00,0x00;
+ 0x00,0x02,0x00,0x00;
+ 0x00,0x04,0x00,0x00; - "Power off"
+ No test for "Security data"
+ 0x00,0x10,0x00,0x00;
+ 0x00,0x20,0x00,0x00;
+ 0x00,0x40,0x00,0x00;
+ 0x00,0x80,0x00,0x00;
+ 0x00,0x00,0x01,0x00;
+ ....
+ 0x00,0x00,0x10,0x00;
+ s Result of phone tests { 0xcf }
+ r Result of phone tests { 0xcf, number of tests, results of next tests }
+ s ??? { 0xd1 }
+ r ???(N5110) { 0xd1, 0x00, 0x1d, 0x00, 0x01, 0x08, 0x00 }
+ s LCD Test { 0xd3, value }
+ where value: 0x03, 0x02 - 1'st test
+ 0x03, 0x01 - 2'nd test
+ 0x02, 0x03 - clears screen
+ s ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01}
+ r ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01, ?}
+ s Get EEPROM { 0xd4, 0x02, 0x00, 0xa0, locationLo, locationHi, numofbytes }
+ where: numofbytes - how many bytes to read
+ Note: Works ONLY in MBUS
+ r Get EEPROM { 0xd4, 0x02, 0x00, 0xa0, locationLo, locationHi, numofbytes, contest... }
+ where numofbytes - how many bytes available
+ contest - bytes with contests (if numofbytes != 0)
+0x41: Snake game ?
+0x47:
+ s Get Picture Image { 0x0001, location }
+ r Get Picture Image when contains sender number
+ { 0x0002, location, number(like in SMS), 0x00, len, text, 0x00, width, height, 0x01, bitmap }
+ NOTE:
+ Supports only 0x81 and 0x91 coding (NOT alphanumeric numbers!)
+ in sender without sender number
+ { 0x0002, location, 0x00, 0x00, 0x00, len, text, 0x00, width, height, 0x01, bitmap }
+ s Set Picture Image { 0x0003, frame...}
+ where frame: see 0x47/0x0002
+ r Get/Set PictureImageOK{ 0x0004 }
+ r Set Picture Image err { 0x0005, error? }
+ where error=0x74 - wrong location ?
+0x64:
+ s Phone ID request { 0x0010 }
+ r Phone ID recvd { 0x0011, "NOKIA", "imei", 0, "model", 0, "prod.code", 0, "HW", 0, "firmware", magic bytes x 4 ... }
+ s Accessory connection { 0x0012, 16x0x00, 'NOKIA&NOKIA accessory', 3x0x00 } (45 bytes)
+0x7f: Acknowledge(FBUS/IRDA){+type, seq }
+ Acknowledge(MBUS)...
+0xd0:
+ s Power on message seq1 {+04 }
+ r Power on message seq1 {+05 }
+0xd1:
+ s Get HW&SW version { 0x0003, 0x00 }
+0xd2:
+ r Get HW&SW version { 0x0003 "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." }
+0xda: ? (during playing 2 player snake)
+0xf0:
+ s Send RLP frame {+0x00, 0xd9, ... }
+0xf4: Power on message seq 2
--- /dev/null
+
+Last update 16.02.2002
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Assembled by
+ Balazs Nagy (js@lsc.hu)
+ Marcin Wiacek (Marcin-Wiacek@TOPNET.PL)
+ Jens Bennfors <jens.bennfors@ing.hj.se>
+ Michael Hund <michael@drhund.de>
+ Jay Bertrand <jay.bertrand@libertysurf.fr>
+ Gabriele Zappi <gzappi@inwind.it>
+ Markus Plail <plail@web.de>
+ Ralf Thelen <ralf@mythelen.de>
+ ... and other members of gnokii mailing list
+ and authors of some WWW pages.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+NOTE: this information isn't (and can't be) complete. If you know anything
+about features not listed here or you noticed a bug in this list, please
+notify us via e-mail. Thank you.
+
+Document describing frames used in
+GSM Nokia 6210 and derivatives (7110)
+Correct format is FBUS version 2/Infrared/MBUS version 2
+(see nokia.txt for protocol details):
+
+ List:
+
+0x00: Connect to NBS port ?
+ r Set ringtone {+0x7c,0x01,0x00,0x0d,0x06[6],0x78,ringtone packed according to SM2.0}
+ Seems not to work in MBUS!
+0x01: Communication Status
+? r Call msg { 0x0002 }
+? r Call in progress { 0x0003, seqnr }
+? r Remote end hang up { 0x0004, seqnr, ?, error (like in netmon in 39) }
+? r incoming call alert { 0x0005, seqnr, numlen, "number", namelen, "name" }
+? r answered call { 0x0007, seqnr }
+? r terminated call { 0x0009, seqnr }
+? r call msg { 0x000a, seqnr }
+ Note: in 6210 4.27 all msg from 0x01 seems to be unavailable
+0x02: SMS handling
+ s Send SMS message { 0x0001, 0x02, 0x00 (SEND REQUEST), ... }
+ r Message sent { 0x0002 }
+ r Send failed { 0x0003, ?, ?, error (like in netmon in 65)}
+ s Incoming SMS info on { 0x000d, 0x00, 0x00, 0x02}
+ note: no info about Delivery Reports
+ r Incoming SMS info onOK{ 0x000e }
+ note: no info about Delivery Reports
+ r Incoming SMS infoonerr{ 0x000f, error }
+ where error: 0x0c - no PIN
+ r SMS message received { 0x0011, ...... } (whole message)
+ s Set CellBroadcast { 0x0020, 0x01, 0x01, 0x00, 0x00, 0x01, 0x01 }
+ for enable cell broadcast ?
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
+ for disable cell broadcast ?
+ r Set CellBroadcast OK { 0x0021, 0x01 }
+ r Read CellBroadcast { 0x0023, ?, ?, ?, channel, ?, message... } ?
+ s Set SMS center { 0x0030, 0x64, priority, checksum?, format,
+ validity[2], {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00}
+ where tel.no.[12]: {len, type, {number(BCD)}}
+ type: 0x81: normal
+ 0x91: + (international)
+ 0xd0: alphanumeric
+ format: 0x00: text
+ 0x22: fax
+ 0x24: voice
+ 0x25: ERMES
+ 0x26: paging
+ 0x31: X.400
+ 0x32: email
+ validity: 0x000b: 1 hour
+ 0x0047: 6 hours
+ 0x00a7: 24 hours
+ 0x00a9: 72 hours
+ 0x00ad: 1 week
+ 0x00ff: max.time
+ r Set SMS center OK { 0x0031 }
+ r Set SMS center error { 0x0032, reason }
+ s Get SMS center { 0x0033, 0x64, priority }
+ r SMS center received { 0x0034, priority, checksum?, type,
+ validity[2], {DefaultRecipient no.}[12],
+ {SMScenter no.}[12], {SMSC name}, 0x00 }
+ where priority, checksum, type, validity,
+ tel.no.[12]: see 0x02/0x0030
+ r SMS center error recv { 0x0035, reason }
+ s?? { 0x0074}
+ r?? { 0x0075, 0xFF, 0x11, 0x98}
+ s?? { 0x008C}
+ r?? { 0x008D, 0x00}
+0x03: Phonebook functions
+ s Get memory status { 0x0103, 0x02, memory type }
+ where: memory type - see 0x03/0x0107
+ r Get memory status { 0x0104, 0x00, xL, 0x00[2], y1H, y1L, 0x10,
+ 0x00[2], z?, ymaxH, ymaxL, y2H, y2L,
+ 0x0d?, xH?, 0x00[2]? }
+ where y1: location (lowermost)
+ y2: no. of locations
+ ymax: maximum location no.
+ s Read memory { 0x0107, 0x01, 0x01, 0x00, 0x01, xH, xL,
+ yH, yL, 0x00, 0x00}
+ where x: memory type
+ 0x01: (256) Dialled numbers
+ 0x02: (512) Missed calls
+ 0x03: (768) Received calls
+ 0x05: (500) telephone phonebook
+ 0x06: (160) SIM phonebook
+ 0x07: (10/0)
+ 0x08: (1/0)
+ 0x09: (4) voice mailbox
+ 0x0e: (10) speed dials
+ 0x10: (5) caller groups
+ y: location
+ r Read memory error { 0x0108, 0x00, 0x01,
+ code,0x00, 0x00, z, error}
+ where code==0x0f
+ error: 0x34 - phonebook location not found
+ 0x3b - speed dial not assigned
+ r Read memory OK { 0x0108, 0x00, 0x01,
+ code,0x00, 0x00, z, xH, xL, yH, yL, 0x00, 0x00, 0x00, no.of blocks, { block } * }
+ where code: != 0x0f
+ y: location
+ z: generic block size
+ block: {id, 0, 0, blocksize, block no.,
+ {contents}, 0x00}
+ id: 0x04 pointer to another memory location { 0xff?, yH, yL, xL,0x00[3] }
+ 0x07 name {len, (unicode)},
+ 0x08 email
+ 0x09 postal
+ 0x0a note {len, (unicode)}
+ 0x0b number {type, 0x00[3], len, (unicode)}
+ 0x0c ringtone {ringtone no., 0, 0}
+ 0x13 date for a called list (DC, RC, etc.)
+ 0x1b caller group graphic {width, height, 0, 0 {bitmap}}
+ 0x1c caller group graphic on? {(1: yes, 0: no), 0, 0}
+ 0x1e caller group number {number, 0, 0}
+ type: 0x0a: General,
+ 0x03: Mobile (office ?),
+ 0x06: Work,
+ 0x04: Fax,
+ 0x02: Home (mobile ?)
+ s Set mem location { 0x010b, 0x00, 0x01, 0x01, 0x00, 0x00, z,
+ xH, xL, yH, yL, 0x00, 0x00, 0x00,
+ no.of blocks, { block }[no.of blocks] }
+ r Set mem location { 0x010c, 0?, 1?, code, 0?, 0?, z?, 0?, 0?,
+ yH, yL, xL }
+ where code:
+ 0x3d - wrong entry type
+ 0x3e - too much entries
+ s Delete mem location { 0x010f, 0x00, 0x01, 0x04, 0x00, 0x00, 0x0c, 0x01, 0xff, xH, xL,
+ yH, yL, 0x00, 0x00}
+ where x: location
+ y: memory type
+ r Delete mem location { 0x0110, 0x00, 0x00 }
+0x06: Calling line restriction/Call forwarding etc
+ r Get call divert { 0x0001, 0x02, x, 0x00, divtype, 0x02, calltype, y, z, 0x0b, number, 0x00...0x00, timeout (byte 45) }
+ s Set call divert { 0x0001, 0x03, 0x00, divtype, calltype, 0x01, number(packed like in SMS), 0x00 ... 0x00,
+ length of number (byte 29), 0x00 ... 0x00, timeout (byte 52), 0x00, 0x00, 0x00}
+ NOTE: msglen=0x37
+ where timeout:
+ 0x00: not set ?
+ 0x05: 5 second
+ 0x0a: 10 second
+ 0x0f: 15 second
+ 0x1e: 20 second
+ 0x14: 25 second
+ 0x19: 30 second
+ where divtype:
+ 0x02: all diverts for all call types ?
+ Found only, when deactivate all diverts for all call types (with call type 0x00)
+ 0x15: all calls
+ 0x43: when busy
+ 0x3d: when not answered
+ 0x3e: if not reached
+ calltype:
+ 0x00: all calls (data, voice, fax)
+ 0x0b: voice calls
+ 0x0d: fax calla
+ 0x19: data calls
+ s Deactivate calldiverts{ 0x0001, 0x04, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+ s Get call diverts { 0x0001, 0x05, 0x00, divtype, calltype, 0x00 }
+ where divtype, calltype: see above
+0x0a: Network status
+ s get used network { 0x0070 }
+ r get used network { 0x0071, available,?,?,length,netstatus,netsel,cellIDH,
+ cellIDL,lacH,lacL,MCC+MNC[3],{Opstr}, 4?,
+ len, xlen(78), ylen(21), 0, {bitmap} }
+ where {Opstr}: namelen, {operator name(unicode)}
+ len: {xlen, ylen, 0, {bitmap} + 2
+ {bitmap}: bitmaplen, 0, 0, {OTA bitmap}
+ available: 0x02 if the logo following is valid,
+ 0x01 for no operator logo following
+ s get network status { 0x0081 }
+ r get network status { 0x0082, network%, 0x14? }
+ s set operator logo { 0x01a3 0x01, oplogo?, MCC+MNC[3], 0?,4?,len,
+ xlen(78),ylen(21), 0 (frames?),
+ {bitmap}*?, 0x00(padding) }
+ where len, {bitmap}: see 0x0a/0x0071
+ r set operator logo OK { 0x01a4 }
+ s clear operator logo { 0x00af, x}
+ where x==0 to 4
+ r clear operator logo { 0x00bf}
+0x13: Calendar notes
+ s Add meeting note { 0x0001, body like in subtype 0x001a...}
+ r Add meeting note { 0x0002, location (2 bytes), status (2 bytes)}
+ s Add call note { 0x0003, body like in subtype 0x001a...}
+ r Add call note { 0x0004, location (2 bytes), status (2 bytes)}
+ s Add birthday note { 0x0005, location (2 bytes), entry type, 0x00, year of birth(2 bytes),
+ Month, Day, 0x00, 0x00, alarm (4 bytes), alarm type, length, text (Unicode)}
+ r Add birthday note { 0x0006, location (2 bytes), status (2 bytes)}
+ s Add reminder note { 0x0007, body like in subtype 0x001a...}
+ r Add reminder note { 0x0008, location (2 bytes), status (2 bytes)}
+ s Delete calendar note { 0x000b, location (2 bytes) }
+ r Delete calendar note { 0x000c, location (2 bytes), ?, ?, ?, ? }
+ s Get calendar note { 0x0019, location (2 bytes) }
+ r Calendar note recvd { 0x001a, location (2 bytes), entry type, 0x00, year (2 bytes), Month, Day, block}
+ where: entry type - 0x01 - Meeting, 0x02 - Call, 0x04 - Birthday, 0x08 - Reminder
+ block: for Meeting:{hour,minute,alarm (two bytes),recurrance (two bytes),len,0x00,string(unicode)}
+ where alarm=Number of minutes before the time of the meeting
+ that the alarm should be triggered:
+ For meetings with "No alarm"=0xFFFF (-1).
+ For "On time"=0x0000
+ half an hour=0x001E, and so on.
+ Recurrance=in hours, between future occurances of this meeting.
+ If there is no repeat, this value is 0x0000. The special value 0xffff
+ means 1 Year!
+ for Call:{Hour,Minute,Alarm (as above),Recurrance (as above),namelen,numberlen,
+ name(unicode),number(unicode)}
+ for Reminder:{Recurrance (as above),len,0x00,string(unicode)}
+ for Birthday:{byte1,byte2,alarm(4 bytes),yearofbirth,alarmtype,len,string(unicode)}
+ byte1 and byte2 may vary (???). Usually are 0x00 both (but not always)
+ In Birthday, the Year in the common part, usually contains a strange year.
+ So, don't consider it as Year of note, neither year of BirthDay (for Year of
+ Birthday use the value described below).
+ where alarm=32-bit integer that is the number of seconds between the desired
+ alarm time and 11:59:58pm on the birthday.For "No Alarm", the value is
+ 0x0000FFFF (65535).
+ YearOfBirth=used instead of the one in the common part of the entry (see above)
+ but only when reading birthday entries. For storing entries, this field does
+ not exist.
+ AlarmType: 0x00 - Tone, 0x01 - Silent
+? s??? { 0x0021 }
+? r??? { 0x0022, 0x5A, 0x00 }
+? s??? { 0x0025 }
+? r??? { 0x0026, 0x04, 0x00 }
+? s { 0x0029 }
+? r { 0x002A, 0x04, 0x00 }
+ s Get first free pos { 0x0031 }
+ r Get first free pos { 0x0032, location (2bytes) }
+ s Get notes info { 0x003a, 0xFF, 0xFE}
+ r Get notes info { 0x003b, how many notes used (2 bytes), 0x01, 0x07, { two bytes with location for each note} *}
+? s Get calendar note?? { 0x003E, location (2 bytes) }
+? r Get calendar note?? { 0x003F, location (2bytes), ... }
+0x14:
+ s Get Picture Image { 0x0007, location, number[2 bytes], 0x00, 0x64 }
+ r Get Picture Image { 0x0008, 0x07, location, number[2 bytes], 0x07, ??[38],
+ width, height, lenH, lenL, {bitmap}, 0x00, 0x00, text len, text(coded like in SMS)...}
+ r Get SMS failed { 0x0009, 0x02 },
+ s Get SMS status { 0x0036, 0x64 }
+ r Get SMS Status { 0x0037, 0x05/0x03, 0x01, 0x00, 0x00,
+ a (2 octets), b (2 octets), c (2 octets),
+ d (2 octets), e (2 octets), 0x00
+ where:
+ a - according to P.Kot:
+ Number of locations in "fixed" memory. These are all
+ Templates entries in my Nokias 6210 (NPE-3 (c) NMP V05.36
+ 14-11-01, NPE-3 (c) NMP V05.27 01-08-01).
+ I can't remove any of Templates entries in my phone.
+ Marcin Wi¥cek: Rather not ! I don't agree.
+ I have 0x00, 0x0f and 10 templates and 3 SMS
+ and 10 Picture Images.
+ b - Number of used messages in phone memory. These
+ are messages manually moved from the other folders.
+ Picture messages are saved here.
+ c - Number of unread messages in phone memory. Probably
+ only smart messsages.
+ d - Number of used messages in SIM memory. These are
+ either received messages or saved into Outbox/Inbox.
+ Note that you *can't* save message into this memory
+ using 'Move' option. Picture messages are not here.
+ e - Number of unread messages in SIM memory
+
+ s Set Picture Image { 0x0050, 0x07, location, number[2 bytes], 0x07, ??[38],
+ width, height, lenH, lenL, {bitmap}, 0x00, 0x00, text len, text(coded like in SMS)...}
+ std. size: 72x28
+ r Set Picture Image { 0x0051, location, number[2 bytes], 0x07 }
+ s Set SMS name { 0x0083,folder,location(2bytes),name(Unicode),0x00 , 0x00}
+ r Set SMS name { 0x0084,folder,0x00, 0x00, name (Unicode),0x00,0x00}
+ s List Picture Images { 0x0096, location, 0x0f, 0x07 }
+ where location:
+ LM tries with 0x09, 0x11, 0x19, 0x21, 0x29, 0x31, 0x39, 0x41, 0x49
+ Returned value with 0x21
+ r List Picture Images { 0x0097, number of pictures[2 bytes], number1[2 bytes], number2[2 bytes], ..., }
+ s Write SMS to folder { 0x0104, status, folder ID, location(2 bytes), 0x02, 0x01, SMS stuff ... }
+ r Write SMS to folder { 0x0105, folder ID, location(2 bytes), 0x00 }
+ r Write SMS to folder { 0x0106, 0x02 (write failed errorcode ?) }
+ s Get SMS from folder { 0x0107, folderID, location(2 bytes), 0x01, 0x65, 0x01}
+ where: folderID - see 0x14/0x017B
+ r Get SMS from folder { 0x0108, status, folderID, 0x00, location, type, sender number,...}
+
+ where: status=0x01 - reveived/read
+ 0x03 - received/unread
+ 0x05 - stored/sent
+ 0x07 - stored/not sent
+
+ where: folderID - see 0x14/0x017B
+
+ where: type=0x00 - received SMS
+ 0x01 - delivery report
+ 0x02 - stored SMS
+ 0x07 - picture message
+ s Delete SMS message { 0x010a, folderID, location(2 bytes), 0x01 }
+ r Delete SMS { 0x010b }
+ s Get folder status { 0x016b, folderID, 0x0F, 0x01}
+ where: folderID - see 0x14/0x017B
+ r Get folder status { 0x016c, number of entries (2 bytes), entry1number (2 bytes), entry2number(2 bytes), ....}
+ s Get folder names { 0x017A, 0x00, 0x00}
+ r Get folder names { 0x017B, number of strings, folderID, name1, 0x00, folderID, name2, 0x00, name3, 0x00,...}
+ where: folderID=0x08 - Inbox
+ 0x10 - Outbox
+ 0x18 - Archive
+ 0x20 - Templates
+ 0x29 - first "My folders"
+ 0x31 - second "My folders"
+ 0x39 - third -"-
+ and so on
+0x17:
+ s Get Battery info { 0x0002 }
+ r Get Battery info { 0x0003, 0x0b, batt%, 0x14?, 0x01? }
+0x19: Phone clock & alarm
+
+ These frames are like the same frames subtypes in 0x11 in 6110
+
+ s set date and time { 0x0060, 1,1,7,yearh,yearl,month,mday,hour,min,0x00 }
+ r date and time set { 0x0061 }
+ s get date and time { 0x0062 }
+ r date and time recvd { 0x0063,date_set?,time_set?,?,?,yearh,yearl,month,mday,hour,min,second }
+ where: date_set & time_set==0x01 - set
+ 0x00 - not set, ?,?,yearh,yearl,month,mday,hour,min,second
+ not available in frame
+ s set alarm { 0x006b, 1,32,3,0x02(on-off),hour,min,0x00 }
+ r alarm set { 0x006c }
+ s get alarm { 0x006d }
+ r alarm received { 0x006e,?,?,?,?,alrm(==2:on),hour,min }
+
+ These are new (?)
+
+? s ?? { 0x0083, id }
+? r ?? { 0x0084, 0x01, 0x40, 0x03, id, 0x00, 0x00 }
+? r ?? { 0x0084, 0x01, 0x40, 0x03, id, 0x00, 0x01 }
+? r ?? { 0x0084, 0x01, 0x40, 0x03, id, 0x01, 0x00 }
+ where: id=0x27,0x2a,0x32,0x28,0x40
+0x1b:
+ s Get IMEI { 0x0001 }
+ r Get IMEI { 0x0002, {IMEI(ASCII)}, 0x00 }
+ s get HW&SW version { 0x0003, 0x01, 0x32 }
+ r get HW&SW version { 0x0004, "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." 0x00 0xff[14] }
+0x1f:
+ s ??? { 0x0010, 0x02, 0x00, 0xff, 0xff }
+ r ??? { 0x0011, length, 0x00, {block}[length] }
+ where block: { unicode letter[2], 0x0000,
+ 0x00, 0x55, ??, ?? }
+ s Set ringtone { 0x011f, 0x00, location, 0x00, name(Unicode),
+ ringtone(format the same to 0x40/0x019e and 0x40/0x01a0) }
+ where: location: 0x87 to 0x8b on N6210
+ 0x74 to ... on N7110
+ s Get ringtone { 0x0122, 0x00, location}
+ r Get ringtone { 0x0123, 0x00, location, name(Unicode), 0x00,...,0x00, 0x02,0xFC,0x09(ringtone contenst)}
+ r Get ringtone error { 0x0124, ...}
+0x39:
+ s get profile feature { 0x0101, 0x01, 0x01, 0x01, number1, number2}
+ where number1: from 0x00 to 0x07 (for each profile ?)
+ number2: 0x00 - 0x09, 0x0A, 0x16 - 0x19, 0x1a - 0x1f, 0x20 - 0x29, 0x2a - 0x2c, 0xff
+ where 0x09: keypad tones 0x02: incoming call alert 0x03: ringtone number
+ 0x04: ringing volume
+ 0x05: message alert tone 0x06: vibra 0x07: warning tones 0x08: caller groups alert for 0x09: automatic answer
+ 0xff: name
+ r get profile feature { 0x0102, 0x01, 0x02, number2, block...}
+ for number2==0xff: (Profile Name)
+ block: 0x01, length, name(Unicode), 0x00, 0x00
+ for number2==0x00: (Keypad Tones)
+ block: 0x01, 0x01, 0x01, Type, 0x01
+ where: Type : 0x00 = Off
+ 0x01 to 0x03 = Level1 .. Level3
+ for number2==0x02: (Incoming Call Alert)
+ block: 0x01, 0x01, 0x01, Type, 0x01
+ where: Type : 0x00 = Ringing
+ 0x01 = Ascending
+ 0x02 = Ring Once
+ 0x03 = Beep Once
+ 0x05 = Off
+ for number2==0x03: (Ringtone Number)
+ block: 0x01, 0x01, 0x01, Number, 0x01
+ where: Number : 0x40 to 0x62 - gives number of factory ringtone. The number of menu is
+ obtained by doing (Number - 0x3f);
+ where: Number : 0x89 to 0x8d - gives number of uploaded ringtone. The number of menu is
+ obtained by doing (Number - 0x65),while the uploaded ringtone number is
+ obtained by doing (Number - 0x88).
+ for number2==0x04: (Ringing volume)
+ block: 0x01, 0x??, 0x??, Volume, 0x01
+ where: Volume : 0 = Level1 .. to 4 = Level5
+ for number2==0x05: (Message Alert Tone)
+ block: 0x01, 0x01, 0x??, Type, 0x01
+ where: Type : 0x00 = Off
+ 0x01 = Standard
+ 0x02 = Special
+ 0x03 = Beep Once
+ 0x04 = Ascending
+ for number2==0x06: (Vibration)
+ block: 0x01, 0x??, 0x??, Switch, 0x01
+ where: Switch : 0 = Off, 1 = On
+ for number2==0x07: (Warning Tones)
+ block: 0x01, 0x??, 0x??, Switch, 0x01
+ where: Switch : 0 = Off, 1 = On
+ for number2==0x08: (Caller groups Alert for)
+ block: 0x01, 0x??, 0x??, Callers, 0x01
+ where: Callers : 0xff = All calls alert (Read below *)
+ 0x01 = Family
+ 0x02 = VIP
+ 0x04 = Friends
+ 0x08 = Colleagues
+ 0x10 = Others
+ All logical OR among groups are valid, so if you select from one phone's profile
+ alert for Friends and Collegues, a 0x0c will return (because 0x04 OR 0x08 = 0x0c).
+ (*) If Callers==0xff, means "Alert for All calls". Then, in this case, you don't
+ need to read other groups selection.
+ for number2==0x09: (Automatic answer)
+ block: 0x01, 0x??, 0x??, Switch, 0x01
+ where: Switch : 0 = Off, 1 = On
+ N.B. This feature is valid for Handsfree and Headset profiles only!
+ s ??? { 0x0101, 0x04, 0x01, 0x01, 0xff, 0x03 }
+ r ??? { 0x0102, 0x01, 0x02, 0x03, 0x01, 0x01, 0x01, 0x85/0x087 }
+
+ s ? { 0x0105}
+ r ? { 0x0106, 0x01, 0x04}
+0x3f: WAP
+ s Enable WAP frames { 0x0000}
+ r Enable WAP frames { 0x0002, 0x01}
+
+ s ?? { 0x0003}
+ r ?? { 0x0004}
+
+ s Get WAP bookmark { 0x0006, 0x00, location}
+ where location: 0 - 14
+ r Get WAP bookmark { 0x0007, 0x00, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7]}
+ r Get WAP bookmark err { 0x0008, error }
+ where error:
+ 0x00(?)invalid position
+ 0x01 user inside "Bookmarks" menu. Must leave it
+ 0x02 invalid/too high/empty location
+
+ s Set WAP bookmark { 0x0009, 0xff, 0xff, name_len, name(unicode),
+ url_len, url(unicode), 0x01,0x80,0x00[7] }
+ Note: bookmark is added to the first free location.
+ r Set WAP bookmark OK {+0x01, 0x36, 0x0a, block }
+ where block:
+ 0x0a, location_of_just_written_bookmark(?),
+ 0x00, next_free_location(?)
+ r Set WAP bookmark err {+0x01, 0x36, 0x0b, error }
+ where error:
+ 0x04 - memory is full
+ 0x01 - we are in the bookmark menu
+ 0x00 - unknown reason for now ;(
+
+? s Delete WAP bookmark { 0x000c, 0x00, location }
+ where: location = 0-14
+? r Delete WAR bookmark OK{ 0x000d }
+? r Delete WAPbookmark err{ 0x000e, 0x02 }
+
+ s ?? { 0x000F}
+ r ?? { 0x0010, 0x00}
+
+ s Get WAP settings 1 { 0x0015, location}
+ where location: 0x00 - 0x05
+ r Get WAP settings 1 OK { 0x0016, title length, title (Unicode), URL length, URL(Unicode),con_type, ???[6 bytes],location, ???[5 bytes],security,...}
+ where:
+ con_type: 0x00 - temporary
+ 0x01 - continuous
+ location: when use "Get WAP settings 2 frame", must give it
+ security: 0x00 = no, 0x01 = yes
+ r Get WAP settings 1 err{ 0x0017, error }
+ where error:
+ 0x01 user inside "Settings" menu. Must leave it
+ 0x02 invalid/too high/empty location
+ s Get WAP settings 2 { 0x001b, location}
+ where location: 0x00 - 0x1d (you get it in "Get WAP settings 1" frame)
+ r Get WAP settings 2 OK { 0x001c, 0x01, type, frame...}
+ where type : 0x00 - SMS bearer
+ frame:
+ service_num_len, service_num (Unicode), server_num_len, server_num(Unicode)
+ 0x01 - data bearer
+ frame:
+ auth, call_type, call_speed, ?, IP len, IP (Unicode), dialup len, dialup (Unicode),
+ user len, user (Unicode), password len, password (Unicode)
+ where auth: 0x00 - normal, 0x01 - secure
+ call_type: 0x00 - analogue, 0x01 - ISDN
+ call_speed: 0x00 - 9600, 0x01 - 14400
+ 0x02 - USSD bearer
+ frame: type, service number len/IP len,service num (Unicode)/IP (Unicode),service code len,
+ service code (Unicode)
+ where type: 0x01 - service number, 0x00 - IP
+ r Get WAP settings 2 err{ 0x001d,error}
+ where: error=0x05
+0x40: Security commands
+? s ???(N6150) { 0x08, 0x00 }
+? r ???(N6150) { 0x08 }
+ s Enable extended cmds { 0x64, cmd }
+ where cmd: 0x00: off
+ 0x01: on
+ 0x03: reset (doesn't ask for PIN again)
+ 0x04: reset (PIN is requested)
+ In 5110 makes reset without PIN
+ 0x06: CONTACT SERVICE!!! Don't try it!
+ s Get IMEI { 0x66 }
+ r Get IMEI { 0x66, 0x01, IMEI, 0x00}
+ s (ACD Readings)?(N6150 { 0x68 }
+ r (ACD Readings)?(N6150 { 0x68, ... }
+ s Get Product Profile
+ Settings { 0x6a}
+ r Get Product Profile
+ Settings { 0x6a, 4bytes with Product Profile Settings }
+ s Set Product Profile
+ Settings { 0x6b, 4bytes with Product Profile Settings }
+ r Set Product Profile
+ Settings OK ? { 0x6b }
+ s Get code { 0x6e, code }
+ where code: see 0x08/0x0004 (no allowed code !)
+ r Get code { 0x6e, code, allowed, allowed? (sec code (text)) }
+ where code: see 0x08/0x0004
+ allowed: 0: no
+ 1: yes
+? s Reset Permanent
+? Counters (nm->test36) { 0x74, 0x01, 0x01, 0x0e }
+? r Reset Permanent
+? Counters (nm->test36) { 0x74 }
+ s Call commands { 0x7c, block }
+ where where: command, (values)
+ command: 0x01
+ values: number(ASCII), 0x00 - makes voice call
+ command: 0x02 - answer call
+ command: 0x03 - release call
+ r Call commands { 0x7c, command }
+ s Netmonitor { 0x7e, field }
+ where: field: 00: next
+ F0: reset
+ F1: off
+ F2: field test menus
+ F3: developer menus
+ s Get simlock info { 0x8a, 0x00}
+ r Get simlock info { 0x8a, 0x00, 0x01, lockstype, locksclosed, 0x00, 0x00, locksinfo(lock1,4,2,3), counter1,counter2,counter4,counter4,0x00 }
+ where: lockstype: bit1,bit2,bit3,bit4 - if set, selected lock is user lock
+ locksclosed: bit1,bit2,bit3,bit4 - if set, selected lock is closed
+ counter1 - counter4: counters for locks
+ s Buzzer pitch { 0x8f, volume, hzLO, hzHI }
+ if volume and hz is 0, it's off
+ r Buzzer pitch { 0x8f}
+ s ACD Readings ? { 0x91, parameter?(0x02,0x03,0x04,0x05,0x07) }
+ r ACD Readings ? { 0x91, parameter?, value? }
+? s ???(N6150) { 0x98, 0x00 }
+? r ???(N6150) { 0x98, 0x00, 0x04 }
+ s Get bin ringtone { 0x9e, location }
+ where: location=0,1,etc.
+ r Get bin ringtone { 0x9e, location, error, contents... }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT available
+ 0x00, OK
+ s Set bin ringtone { 0xa0, location, 0x00, contenst... }
+ where: location=0,1,etc.
+ r Set bin ringtone { 0xa0, location, error }
+ where location=0,1,etc.
+ error=0x0a, ringtone NOT set
+ 0x00, ringtone set OK
+? r Get MSid { 0xb5, 0x01, 0x2f, msid, 0x25 }
+ s Get info about phone { 0xc8, 0x01 }
+ r Get info about phone { 0xc8, 0x01, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get MCU SW Checksum { 0xc8, 0x02 }
+ r Get MCU SW Checksum { 0xc8, 0x02, 0x00, checksum (4 bytes),0x00 }
+ s DPS External SW { 0xc7, 0x03 }
+ r DSP External SW { 0xc7, 0x03, 0x00, string,0x00 }
+ s Get HW { 0xc8, 0x05 }
+ r Get HW { 0xc8, 0x05, 0x00, HW version (4 bytes), 0x00 }
+ s Get "Made" Date { 0xc8, 0x05 }
+ r Get "Made" Date { 0xc8, 0x05, 0x00, date(4 bytes), 0x00 }
+ s Get DSP Internal SW { 0xc8, 0x09 }
+ r Get DSP Internal SW { 0xc8, 0x09, 0x00, version (1 bytes), 0x00 }
+ s Get PCI version { 0xc8, 0x0b }
+ r Get PCI version { 0xc8, 0x0b, 0x00, version, 0x00 }
+ s Get system ASIC { 0xc8, 0x0c }
+ r Get system ASIC { 0xc8, 0x0c, 0x00, string, 0x00 }
+ s Get COBBA { 0xc8, 0x0d }
+ r Get COBBA { 0xc8, 0x0d, 0x00, string, 0x00 }
+ s Get PLUSSA { 0xc8, 0x0e }
+ r Get PLUSSA { 0xc8, 0x0e, available, 0x00 }
+ where available: 0x01: not available
+ s Get CCONT { 0xc8, 0x0f }
+ r Get CCONT { 0xc8, 0x0f, available, 0x00 }
+ where available: 0x01: not available
+ s Get PPM version { 0xc8, 0x10 }
+ r Get PPM version { 0xc8, 0x10, 0x00, "V ", "firmware", 0x0a, "firmware date", 0x0a, "model", 0x0a, "(c) NMP.", 0x00 }
+ s Get PPM info { 0xc8, 0x12 }
+ r Get PPM info { 0xc8, 0x12, 0x00, PPM version ("B", "C", etc.), 0x00 }
+ s Set HW version { 0xc9, 0x05, version, 0x00 }
+ s Get Product Code { 0xca, 0x01 }
+ r Get Product Code { 0xca, 0x01, 0x00, number, 0x00 }
+ s Get Order Number { 0xca, 0x02 }
+ r Get Order Number { 0xca, 0x02, 0x00, string, 0x00 }
+ s Get Prod.Ser.Number { 0xca, 0x03 }
+ r Get Prod.Ser.Number { 0xca, 0x03, 0x00, number, 0x00 }
+ s Get Basic Prod.Code { 0xca, 0x04 }
+ r Get Basic Prod.Code { 0xca, 0x04, 0x00, number, 0x00 }
+ s Set Product Code { 0xcb, 0x01, product code, 0x00 }
+ s Set Order Number { 0xcb, 0x02, number, 0x00 }
+ s Set Prod.Ser.Number { 0xcb, 0x03, number, 0x00 }
+ s Get (original ?)IMEI { 0xcc, 0x01 }
+ r Get (original ?)IMEI { 0xcc, 0x01, IMEI, 0x00 }
+ s Get Manufacture Month { 0xcc, 0x02 }
+ r Get Manufacture Month { 0xcc, 0x02, 0x00, string, 0x00 }
+ s Get Purchare date { 0xcc, 0x04 }
+ r Get Purchare date { 0xcc, 0x04, 0x00, string, 0x00 }
+ s Set "Made" date { 0xcd, 0x02, string, 0x00 }
+ s Make "all" phone tests{ 0xce,0x1d,0xfe,0x23,0x00,0x00}
+ s Make one phone test { 0xce,0x1d,num1,num2,num3,num4}
+ Where num1-num4: 0x02,0x00,0x00,0x00;
+ 0x04,0x00,0x00,0x00;
+ 0x08,0x00,0x00,0x00;
+ 0x10,0x00,0x00,0x00;
+ 0x20,0x00,0x00,0x00;
+ 0x40,0x00,0x00,0x00;
+ 0x80,0x00,0x00,0x00;
+ 0x00,0x01,0x00,0x00;
+ 0x00,0x02,0x00,0x00;
+ 0x00,0x04,0x00,0x00; - "Power off"
+ No test for "Security data"
+ 0x00,0x10,0x00,0x00;
+ 0x00,0x20,0x00,0x00;
+ 0x00,0x40,0x00,0x00;
+ 0x00,0x80,0x00,0x00;
+ 0x00,0x00,0x01,0x00;
+ ....
+ 0x00,0x00,0x10,0x00;
+ s Result of phone tests { 0xcf }
+ r Result of phone tests { 0xcf, number of tests, results of next tests }
+? s ??? { 0xd1 }
+? r ???(N5110) { 0xd1, 0x00, 0x1d, 0x00, 0x01, 0x08, 0x00 }
+ s LCD Test { 0xd3, value }
+ where value: 0x03, 0x02 - 1'st test
+ 0x03, 0x01 - 2'nd test
+ 0x02, 0x03 - clears screen
+ s ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01}
+ r ACD Readings(N6150)? { 0xd4, 0x02, 0x00, 0x02, 0x00, 0x0e, 0x01, ?}
+ r Function of { 0xff, 0x8c }
+ 0x40 msgtype not
+ supported ?
+0x78:
+ s Status confirm { 0x0201, 0x03 }
+ r Incoming call seq1 { 0x0102 0x0e 0x03 }
+ r Incoming call seq2 { 0x0102 0x7e 0x01 }
+0x79:
+ s CarKit enable { 0x0201 0x01 0x62 0x00 }
+ r CarKit enabled { 0x0201 0x02 0x06 0x00 "V " {version} "\nHFU"
+ 0x00 }
+0x7a: settings
+ r Set setting { 0x01eb, number, 0x00 }
+ s Set setting { 0x01ec, number, contents }
+ where for number:
+ 0x02 (startup text) : 0x00, text (Unicode)
+ 0x15 (startup logo) : 0x00, 0x00, 0x00, 0x04,
+ 0xc0, 0x02, 0x00, height, 0xc0, 0x03, 0x00, width,
+ 0xc0, 0x04, 0x03, 0x00, {bitmap} }
+ where width, height, {bitmap}: see 0x7a/0x01ed 0x15
+ s Get setting { 0x01ee, number}
+ where number: 0x01 - 0x1e
+ 0x02: startup text
+ 0x15: startup logo
+ 0x1c: security code
+ r Get setting { 0x01ed,number, 0x00, contents}
+ where for number:
+ 0x02 (startup text) : 0x00, text (Unicode)
+ 0x15 (startup logo) : 0x00, 0x00, 0x00, 0x04,
+ 0xc0, 0x02, 0x00, height, 0xc0, 0x03, 0x00, width,
+ 0xc0, 0x04, 0x03, 0x00, {bitmap} }
+ where height: 60 (0x3c) or 65
+ width: 96 (0x60)
+ {bitmap}: like other bitmaps but pixels
+ placed vertically.
+ 0x1c (security code): {code(ascii)}, 0x00
+0x7f: Acknowledge(FBUS/IRDA){+type, seq }
+ Acknowledge(MBUS)...
+0xd0:
+ s Power on message seq1 {+04 }
+ r Power on message seq1 {+05 }
+0xd1:
+ s Get HW&SW version { 0x0003, 0x00 }
+0xd2:
+ r Get HW&SW version { 0x0003 "V " "firmware\n" "firmware date\n"
+ "model\n" "(c) NMP." }
+0xf4: Power on message seq 2
--- /dev/null
+
+Document describing protocol used in Nokia phones.
+
+The data provided is for information purposes only.
+Some of the frames might be hazardous to your phone. Be careful!!!
+We do not take any responsibility or liability for damages, etc.
+
+Last update 01.03.2001
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Assembled by
+ Balazs Nagy (js@lsc.hu)
+ Alfred R. Nurnberger <arnu@flosys.com>
+ Hugh Blemings <Hugh.Blemings@vsb.com.au>
+ Mike Bradley <mike@trumpington.st>
+ Odinokov Serge <serge@takas.lt>
+ Pavel Janik <Pavel@Janik.cz>
+ Pawe³ Kot <pkot@linuxnews.pl>
+ Marcin Wiacek (Marcin-Wiacek@TOPNET.PL)
+ Jens Bennfors <jens.bennfors@ing.hj.se>
+ Michael Hund <michael@drhund.de>
+ Jay Bertrand <jay.bertrand@libertysurf.fr>
+ <arnu@venia.net>
+ Andrew Kozin
+ Pavel Machek <pavel@ucw.cz>
+ Diego Betancor <dbetancor@duocom.net>
+ ... and other members of gnokii mailing list
+ and authors of some WWW pages.
+
+NOTE: this information isn't (and can't be) complete. If you know anything
+about features not listed here or you noticed a bug in this list, please
+notify us via e-mail. Thank you.
+
+ Frame format for MBUS version 1:
+
+ Request from Computer/Answer from Phone:
+
+ { DestDEV, SrcDEV, FrameLength, MsgType, {block}, id, ChkSum }
+
+ where DestDEV, SrcDEV: 0x00: phone
+ 0xf8: PC (wakeup msg)
+ 0xe4: PC (normal msg)
+ FrameLength: length of data frame. Maximal 0x78. Longer
+ frames are divided into smaller.
+ MsgType: see List
+ {block}: main frame
+ id: request identity number 1..n, incremented after
+ the request is accepted
+ ChkSum: XOR on frame's all numbers
+
+ Ack from Phone:
+
+ { DestDEV, 0x00, FrameLength, MsgType, {block} , id, ChkSum }
+
+ where DestDEV: taken from original request packet
+ FrameLength: 0x7f, when DestDEV = 0xe4
+ 0x7e, when DestDEV = 0xf8
+ MsgType: see List. Present only, when DestDEV = 0xf8
+ {block}: main frame. Present only, when DestDEV = 0xf8
+ id: request identity number 1..?, corresponding
+ to the original request packet id
+ the request is accepted
+ ChkSum: XOR on frame's all numbers
+
+ Update: description above according to the
+ http://www.gadgets.demon.co.uk/nokia21xx/protocol.html.
+
+ Pavel Machek <pavel@ucw.cz> wrote:
+ 0x7e is actually registration acknowledge. Both have nothing to do
+ with DestDEV, except that special device needs to be used for
+ registration.
+
+ Ack from Computer:
+
+ { 0x00, SrcDEV, 0x7f, id, ChkSum }
+
+ where SrcDEV: taken from response packet
+ id: request identity number 1..?, corresponding
+ to the response packet id
+ the request is accepted
+ ChkSum: XOR on frame's all numbers
+
+ Port settings:
+ Speed 9600 bps, Bits 8, ParityOdd, Stop Bits 1, DTR and RTS logic 0
+
+ In the MBUS bus, the phone has only one connector for transmition and
+ reception.
+
+ Because of this characteristics of the phone connector, every time that the
+ PC writes into the phone it is writing as well into its own Rx. So every
+ time the PC sends info into the phone it finds that same information in its
+ own Rx buffers, like a mirror copy. This should be discarded.
+
+ The communications is made like an old cb radio, only one
+ talking at a time. Many transmission are made this way:
+
+ <computer sends request>
+ <phone sends ack>
+ <phone sends response>
+ <computer sends ack>
+
+ Some frames are sent from phone without asking for them
+
+ You have to implement collision protocol. IE. you should listen for
+ what you are transmitting, and if it does not come back, you have
+ collision.
+
+ You should wait for bus to be free for 3 miliseconds before normal
+ message, and for 2.5 miliseconds before acknowledge. You should wait
+ for acknowledge for 200 miliseconds, then retransmit.
+
+ Frame format for FBUS version 1:
+
+ { FrameID, FrameLength, MsgType, {block}, SeqNo, ChkSum }
+
+ where FrameID: 0x01 Command frame from computer to Nokia
+ 0x02 ??? - Data call frame from computer to Nokia - ???
+ 0x03 Data call frame from Nokia to computer
+ 0x04 Command frame from Nokia to computer
+ FrameLength: {block} + 2
+ MsgType: see List
+ SeqNum: Sequence number of command in case where direction is
+ from ME to computer, the sequence number is
+ counting from 0x30 to 0x37 and resetting back to 0x30.
+ When direction is from computer to ME,
+ sequence number counts from 0x08 to 0x0f and resets back to 0x08.
+ It may not be required to be this way.
+ Sequence numbers are used in acknowledging commands.
+ ChkSum1: CRC = 0;
+ for (i = 0; i < (2 + CMD_LEN); i++)
+ CRC ^= frame[i];
+
+ Frame format for FBUS version 2/Direct IRDA:
+
+ { FrameID, DestDEV, SrcDEV, MsgType, 0x00, FrameLength, {block}, FramesToGo,
+ SeqNo, PaddingByte?, ChkSum1, ChkSum2 }
+
+ where FrameID: 0x1c: IR / FBUS
+ 0x1e: Serial / FBUS
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x0c: TE (FBUS) [eg. PC]
+ MsgType: see List
+ FrameLength: {block} + 2 (+ 1 if PaddingByte exists)
+ FramesToGo: 0x01 means the last frame
+ SeqNo: [0xXY]
+ X: 4: first block
+ 0: continuing block
+ Y: sequence number
+ PaddingByte: 0x00 if FrameLength would be an odd number
+ anyways it doesn't exists
+ ChkSum1: XOR on frame's odd numbers
+ ChkSum2?: XOR on frame's even numbers
+
+ Frame format for MBUS version 2:
+
+ { FrameID, DestDEV, SrcDEV, MsgType, FrameLengthLO, FrameLengthHI, {block},
+ SeqNo, ChkSum }
+
+ where FrameID: 0x1f: Serial / M2BUS
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x1d: TE (M2BUS)
+ 0x10: TE (M2BUS) (Service Software ?)
+ 0x04: Carkit?
+ 0x48: DLR3 cable?
+ 0xF8: unknown target?
+ 0xFF: global target?
+ MsgType: see List
+ FrameLength: {block}
+ SeqNo: sequence number
+ ChkSum: XOR on frame's all numbers
+
+ Please note that M2BUS has only one checksum: XOR on frame[FrameID..SeqNo]
+
+ Ack:
+
+ { FrameID, DestDEV, SrcDEV, 0x7f, Id_SeqNo, ChkSum }
+
+ where Id_SeqNo: Is the sequence number that you are
+ acknowleging (from the other part).
+
+ Frame format for Infrared:
+
+ { FrameID, DestDEV, SrcDEV, MsgType, FrameLengthLo, FrameLengthHi, {block}}
+
+ where FrameID: 0x14
+ DestDev, SrcDev: 0x00: mobile phone
+ 0x0c: TE [eg. PC]
+ MsgType: see List
+ FrameLength: {block}
+
+ Frames list format:
+
+ hex: Short description
+ x msg desc { ... }
+ 0xXX -> one byte
+ 0xXXYY -> two bytes (== 0xXX, 0xYY)
+
+ where hex: message type
+ x: s=send (eg. to mobile), r=receive
+ { ... }: data after 0x00, 0x01 header
+ {+... }: raw data (without header)
+
+-------------------------------------------------------------------------------
+
+Misc (about MBUS version 2):
+
+0x4E commands:
+ (sent from a 5160i TDMA / 6160i TDMA / 6185 CDMA or 7110 GSM
+ phone to the uC in the DLR-3 cable)
+DLR-3 req:
+ 1F 48 00 4E 00 02 01 XX SQ CS
+ frame sent from the phone to the DLR-3 cable
+ (after 15kOhm resistor detected betw. XMIC (3) and DGND (9).)
+ DSR,DCD,CTS flow control data is coded into the 2nd databyte
+ XX: bit.0=/CTS
+ bit.1=/DCD
+ bit.2=CMD/DATA
+ bit.3=DSR
+ bit.4-7=0
+
+0x78 / 0x79 commands:
+ (used by handsfree carkit) Works also on GSM phones (5110 / 6110 / etc)
+These commands are used by the Nokia Carkits to switch the phone audio path to
+XMiC and XEAR , turn the phone on/off according to the car ignition, and
+control the PA loudspeaker amplifier in the carkit and the car radio mute
+output which silences the car radio during a call
+mute status tone:
+ 1F 04 00 78 00 04 01 02 0E 00 SQ CS
+ status indication = disable carkit audio amplifier (no audio / no tone)
+mute status tone:
+ 1F 04 00 78 00 04 01 02 0E 03 SQ CS
+ status indication = enable carkit audio amplifier (audio / tone present)
+mute status call:
+ 1F 04 00 78 00 04 01 02 07 00 SQ CS
+ status indication = disable radio mute output (no call)
+mute status call:
+ 1F 04 00 78 00 04 01 02 07 01 SQ CS
+ status indication = enable radio mute output (call active)
+enable ???:
+ 1F 04 00 78 00 04 01 02 08 01 SQ CS
+ status indication = enable ??? sent to HFU-2 on power on
+ byte 9 (07,08,0E) seems to be a pointer to a memory location,
+ byte 10 is the data at this memeory location.
+response from HFU:
+ 1F 00 04 78 00 03 02 01 03 SQ CS
+ response message from HFU-2 (use unknown)
+go HF and IGN on:
+ 1F 00 04 79 00 05 02 01 01 63 00 SQ CS
+ enables carkit mode + turns phone on + req. mute status
+go HF and IGN off:
+ 1F 00 04 79 00 05 02 01 01 61 00 SQ CS
+ enables carkit mode + powers phone off (1 min delay) + req. mute status
+ext. HS Offhk:
+ 1F 00 04 79 00 05 02 01 01 23 00 SQ CS
+ enables carkit mode + external handset lifted (OFF-Hook)
+ext. HS Onhk:
+ 1F 00 04 79 00 05 02 01 01 63 00 SQ CS
+ enables carkit mode + external handset put back (ON-Hook)
+ Ignition and Hook are coded into one byte
+ bit.0 = 0:on power on 1:when in operation
+ bit.1 = IGNITION STATUS
+ bit.2 = x can be 1 or 0
+ bit.3 = 0
+ bit.4 = 0
+ bit.5 = 1
+ bit.6 = Hook (inverted)
+ bit.7 = 0
+HFU-2 version:
+ 1F 00 04 79 00 12 02 01 02 06 00 56 20 30 36 2E 30 30 0A 48 46 55 32 00 SQ CS
+for HFU-2:
+ 1F 04 00 DA 00 02 00 02 SQ CS
+ function unknown - sent from Nokia phone to HFU-2mute output (call active )
+
+0xD0 commands:
+init:
+ 1F 00 1D D0 00 01 04 SQ CS
+ sent by the Service Software or HFU-2 on startup
+init resp:
+ 1F 1D 00 D0 00 01 05 SQ CS
+ response from phone to above frame
--- /dev/null
+This is part of files available in mygnokii_developer.tar.gz
+available in http://marcin-wiacek.topnet.pl
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Configuration</title>
+ <link REL=stylesheet HREF="../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Configuration</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><font color="#1F409F" size=+2 class="dzial">How to install it from the source ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>If you get the sources you need to create script
+<i>configure</i>. You do it by typing:
+<PRE>tfuj:~/gnokii-0.3.3pre5$ autoconf</PRE>
+
+<P>If you get the sources from the tarball you don't need to do
+this - <TT>configure</TT> is already made for you. For quick install do simply:
+<PRE>tfuj:~/gnokii-0.3.3pre5$ ./configure
+tfuj:~/gnokii-0.3.3pre5$ make
+tfuj:~/gnokii-0.3.3pre5$ make install
+</PRE>
+
+<P>But <i>configure</i> has some options. Except obvious
+parameters as <i>--prefix</i> which specifies a path to install GNOKII, you
+can specify one of the following:
+
+<DL>
+ <dt><i>--help</i>
+ <dd>Shows you list of available options</dd></dl>
+<dl>
+ <DT><i>--enable-debug</i>
+ <DD>Turns on debugging. It's usefull especially for developers. But if you
+ find a bug in GNOKII, please compile the sources with debugging enabled and
+ send this output to the GNOKII mailing list. This is used by <i>gnokii</i>
+ program. </DD></DL>
+<DL>
+ <DT><i>--enable-xdebug</i>
+ <DD>The same as above but used by <i>xgnokii</i>. </DD></DL>
+<DL>
+ <DT><i>--enable-rlpdebug</i>
+ <DD>This option turns on debugging specific to the RLP stuff. Note, that it's
+ very important at the moment as this part of GNOKII is under the hardest
+ development. </DD></DL>
+<DL>
+ <DT><i>--without-x</i>
+ <DD>Don't include X Window system support - <i>xgnokii</i>. </DD></DL>
+<DL>
+ <DT><i>--enable-security</i>
+ <DD>Turns on some security functions:.... Use them with caution. </DD></DL>
+<DL>
+ <DT><i>--enable-win32</i>
+ <DD>Include MS Windows support. Yes, it really exists. ;-) </DD></DL>
+<DL>
+ <DT><i>--with-model=MODEL</i>, <i>--with-port=PORT</i>
+ <DD>Specify the model of the phone (eg. 6150) and the port it is connected to
+ (eg. /dev/ttyS1). These values can be overwritten with ones from the config
+ files.
+ </DD>
+</DL>
+
+<P>The sample usage:
+<PRE>tfuj:~/gnokii-0.3.3pre5$ ./configure --prefix=/usr2 --enable-debug --without-x \
+--enable-security --with-model=6130 --with-port=/dev/ttyS1
+</PRE>
+
+<P>When the <i>configure</i> succeed, it shows options GNOKII
+will be compiled with:
+<PRE> Host system: linux-gnulibc1
+ Gnokii version: 0.3.3_pre5
+ Xgnokii version: 20000613
+ Phone model: 6130
+ Serial port: /dev/ttyS1
+ X (GTK) support: no
+ Debug: yes
+ XDebug: no
+ RLPDebug: no
+ NLS: yes
+ Security: yes
+ Win32:
+ Prefix: /usr2
+</PRE>
+
+<P>Now, the only thing left to do is just ro run:
+<PRE>tfuj:~/gnokii-0.3.3pre5$ make
+tfuj:~/gnokii-0.3.3pre5$ make install
+</PRE>
+
+<P>Finally, you have GNOKII installed in your system. And now REAL
+FUN begins. :-)
+
+<p><font color="#1F409F" size=+2 class="dzial">How to install it from binaries ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>If you downloaded gnokii as a pre-built binary you should install
+it in the conventional manner for the package type in question.
+For example if you downloaded a .rpm file you can install it by
+running the following as root.
+
+<p>rpm -i gnokii-0.3.2-i386.rpm
+
+<p>If you are using a Debian based system, you can use dpackage
+to do the installation (FIXME - is this correct ?)
+
+<p><font color="#1F409F" size=+2 class="dzial">How to make connection with phone ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>There are three ways to make it:
+
+<ul>
+<li>connecting phone with computer using cable. All phones allow to make it
+(even 3210 - connector is inside). If you want to know more
+about creating your own cable, read <a href=../gsm/cables/cables.htm>cables faq</a>.</li>
+<li>using IrDa port in phone and computer. Notice, that your computer
+and phone must have it (only some series of Nokia phones has it - for example,
+6110, 6150)</li>
+<li>connecting to phone special device called "dongle" (it has IrDa port)
+and making IrDa connection between it and phone. Current gnokii cas use
+Tekram IRmate 210 - see patches</li>
+</ul>
+
+<p><font color="#1F409F" size=+2 class="dzial">How to configure gnokii ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>First it to use <i>--with-model</i> and <i>--with-port</i> options for
+configure script. But I do not recommend this. In my opinion these should be
+removed from configure. Second disadvantage is that you can't use it when
+you are installing a binary package.
+
+<p>So, will use better method :-).
+You should copy the <a href=../examples/gnokiirc>gnokiirc</a>
+file from the Docs/examples directory to your
+home directory and name it gnokiirc or copy it into /etc directory
+and name gnokiirc.
+
+<p>Using your favorite
+editor ensure that the settings are correct for your system,
+the sample file has details of the various options available. The most
+difficult problem could be discovering model of your phone - go into
+our <a href=../gsm/firmware/firmware.htm>firmware page</a>
+and try to use codes written in column
+<b>Firmware version code</b>. If your phone will display something,
+see model number on the third line, look on the
+<a href=../gsm/firmware/firmware.htm>firmware page</a>
+again (for it) and read phone model then.
+
+<p>Note that you will need read/write permissions on whatever
+serial port you specify in gnokiirc. You can now use gnokii
+and xgnokii.
+
+<P>Of course, you don't have to make any config, if you will use
+these config options. There are default:
+
+<p>
+<pre>
+[global]
+port = /dev/ttyS0
+model = 6110
+connection = serial
+initlength = default
+bindir=/usr/local/sbin
+</pre>
+
+<p><font color="#1F409F" size=+2 class="dzial">How to configure infrared connection ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>
+<ul>
+
+<li>Go into configuration of your IrDa port (the most often it's made in
+BIOS, sometimes using program provided by computer's producer):
+
+<p>
+<ul>
+<li>Enable it</li>
+<li>Setup the COM-Port on which it should work.
+Here are addresses:
+<br>ttyS0 (COM1): 3F8, IRQ: 4
+<br>ttyS1 (COM2): 2F8, IRQ: 3
+<br>ttyS2 (COM3): 3E8, IRQ: 4
+<br>ttyS3 (COM4): 2E8, IRQ: 3
+<br>
+</li>
+</ul>
+</li>
+
+<li>Configure gnokii (see previous question)
+setting type of connection to
+infrared.</li>
+
+<li>If you are using linux, put linux-irda off (you can't use gnokii over infrared and
+linux-irda at the same time - it means too, if you want use
+linux-irda you must close all gnokii-applications what
+use the infrared-port in moment).
+</li>
+</ul>
+
+<p><font color="#1F409F" size=+2 class="dzial">How to configure gnokii driver for data connection ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>After installing and configuring gnokii you should make another group
+and allow mgnokiidev (it our virtual modem driver)
+to use it. For example (if you have installed gnokii
+into /usr/local):
+
+<p>
+<i>groupadd gnokii<br>
+chown root:gnokii /usr/local/sbin/mgnokiidev<br>
+chmod 4750 /usr/local/sbin/mgnokiidev</i>
+
+<p><b>And now connect (FIRST EXAMPLE):</b>
+
+<p>Then connect your phone to your PC and then run gnokiid:
+
+<PRE>[ first console ]
+tfuj:/home/pawel/gnokii# ./gnokiid/gnokiid
+</pre>
+
+<p>If successful, you should see a message saying that mgnokiidev has been
+run to create /dev/gnokii. If you're using a 5110/6110 series phone
+you should hear a beep and see an "accessory connected" message on
+the phone. If you're using a 3810 series phone you won't see anything
+on the phones LCD.
+
+<p>And now:
+
+<p>
+<pre>
+[ second console ]
+[- running minicom -]
+
+[ third console ]
+[- when connection is estabilished -]
+tfuj:/etc/ppp# /usr/sbin/pppd -d -detach /dev/gnokii 115200
+Using interface ppp0
+Connect: ppp0 <--> /dev/gnokii
+sent [LCP ConfReq id=0x1 <MRU 552> <ASYNCMAP 0x0> <MAGIC 0xc5c718fb> <PCOMP> <ACCOMP>]
+rcvd [LCP ConfReq id=0x8e <ASYNCMAP 0xa0000> <MAGIC 0x56292222> <PCOMP> <ACCOMP> < 11 04 05 f4> < 13 0d 01 70 69 65 6b 6e 61 2d 61 73 34>]
+sent [LCP ConfRej id=0x8e < 11 04 05 f4> < 13 0d 01 70 69 65 6b 6e 61 2d 61 73 34>]
+rcvd [LCP ConfNak id=0x1 <MRU 1500>]
+sent [LCP ConfReq id=0x2 <ASYNCMAP 0x0> <MAGIC 0xc5c718fb> <PCOMP> <ACCOMP>]
+rcvd [LCP ConfReq id=0x8f <ASYNCMAP 0xa0000> <MAGIC 0x56292222> <PCOMP> <ACCOMP>]
+sent [LCP ConfAck id=0x8f <ASYNCMAP 0xa0000> <MAGIC 0x56292222> <PCOMP> <ACCOMP>]
+rcvd [LCP ConfAck id=0x2 <ASYNCMAP 0x0> <MAGIC 0xc5c718fb> <PCOMP> <ACCOMP>]
+sent [IPCP ConfReq id=0x1 <ADDR 192.168.1.10> <COMPRESS 01 0f VJ>]
+sent [CCP ConfReq id=0x1 <DEFLATE 15> <DEFLATE(OLD#) 15> <BSD 15 v1>]
+rcvd [IPCP ConfReq id=0x16 <COMPRESS 0f VJ 00> <ADDR 157.25.75.129>]
+sent [IPCP ConfAck id=0x16 <COMPRESS 0f VJ 00> <ADDR 157.25.75.129>]
+rcvd [IPCP ConfNak id=0x1 <ADDR 157.25.94.141>]
+sent [IPCP ConfReq id=0x2 <ADDR 157.25.94.141> <COMPRESS 01 0f VJ>]
+rcvd [LCP ProtRej id=0x90 80 fd 01 01 00 0f 1a 04 78 00 18 04 78 00 15 03 2f]
+rcvd [IPCP ConfAck id=0x2 <ADDR 157.25.94.141> <COMPRESS 01 0f VJ>]
+local IP address 157.25.94.141
+remote IP address 157.25.75.129
+Terminating on signal 2.
+sent [LCP TermReq id=0x3 "User request"]
+rcvd [LCP TermAck id=0x3]
+Connection terminated.
+Connect time 5.6 minutes.
+Sent 30568 bytes, received 197133 bytes.
+tfuj:/etc/ppp#
+</PRE>
+
+<p><b>SECOND EXAMPLE (I used such scripts):</b>
+
+<PRE>/home/pawel/.gnokiirc
+---------------------
+global]
+port = /dev/ttyS1
+model = 6110
+connection = serial
+initlength = 1
+
+/usr/sbin/ppp-gnokii
+--------------------
+#!/bin/sh
+LOCAL_IP=0.0.0.0
+REMOTE_IP=0.0.0.0
+NETMASK=255.255.255.0
+DIALER_SCRIPT=/etc/ppp/ppp-gnokii
+exec /usr/sbin/pppd debug /dev/gnokii 115200 \
+$LOCAL_IP:$REMOTE_IP \
+connect $DIALER_SCRIPT
+
+/etc/ppp/ppp-gnokii
+-------------------
+#!/bin/sh
+/usr/sbin/chat -v \
+ TIMEOUT 30 \
+ ABORT '\nBUSY\r' \
+ ABORT '\nNO ANSWER\r' \
+ ABORT '\nRINGING\r\n\r\nRINGING\r' \
+ ABORT '\nNO CARRIER\r' \
+ '' ATDT501808080 \
+ CONNECT ''
+
+/etc/ppp/options
+----------------
+-detach
+modem
+crtscts
+defaultroute
+asyncmap 0
+mtu 552
+mru 552
+
+/etc/ppp/pap-secrets
+--------------------
+ppp * ppp
+</PRE>
+
+<P>Number 501808080 is an Internet access number for all Idea
+Centertel (Polish GSM operator) abonents. With these files the only thing to do
+is to run <i>gnokiid</i> and <i>/usr/sbin/ppp-gnokii</i>. Note that both:
+<i>/usr/sbin/ppp-gnokii</i> and <i>/etc/ppp/ppp-gnokii</i> must be
+executable files. At the moment you have to run <i>ppp-gnokii</i> as the
+superuser unless the simple user has a permission to write to a <I>pty</I>
+device. <i>gnokiid</i> must be run as the user belinging to <I>gnokii</I>
+group.
+
+<PRE>
+[ first console ]
+tfuj:~S /usr/sbin/gnokiid
+Initialising GSM
+Slave pty is /dev/ttyp9, calling /usr/sbin/mgnokiidev to create /dev/gnokii.
+
+[ second console ]
+tfuj:~# /usr/sbin/ppp-gnokii
+Serial connection established.
+Using interface ppp0
+Connect: ppp0 <--> /dev/gnokii
+Warning - secret file /etc/ppp/pap-secrets has world and/or group access
+sent [LCP ConfReq id=0x1 ]
+rcvd [LCP ConfReq id=0xbb ]
+sent [LCP ConfAck id=0xbb ]
+rcvd [LCP ConfNak id=0x1 ]
+sent [LCP ConfReq id=0x2 ]
+rcvd [LCP ConfAck id=0x2 ]
+Warning - secret file /etc/ppp/pap-secrets has world and/or group access
+sent [PAP AuthReq id=0x1 user="ppp" password="ppp"]
+rcvd [PAP AuthAck id=0x1 ""]
+Remote message: ^F
+sent [IPCP ConfReq id=0x1 ]
+sent [CCP ConfReq id=0x1 ]
+rcvd [IPCP ConfReq id=0x49 ]
+sent [IPCP ConfAck id=0x49 ]
+rcvd [IPCP ConfNak id=0x1 ]
+sent [IPCP ConfReq id=0x2 ]
+rcvd [IPCP ConfAck id=0x2 ]
+local IP address 192.168.23.55
+remote IP address 192.168.9.2
+</PRE>
+
+<p><b>THIRD EXAMPLE:</b>
+
+<p>Use /dev/gnokii as a modem:
+
+<p><i>e.g. ppp session<br>
+--------------- /etc/ppp/peers/demon-gnokii ---------------------<br>
+/dev/gnokii 115200<br>
+modem crtscts defaultroute<br>
+connect 'chat -v ABORT BUSY ABORT ERROR ABORT "NO CARRIER" "" AT OK-AT-OK ATD02083389666 CONNECT'<br>
+user XXXX.demon.co.uk<br>
+noauth<br>
+mtu 296<br>
+debug<br>
+----------------------------------------------------------------<br>
+--------------- /etc/ppp/pap-secrets ---------------------------<br>
+XXXX.demon.co.uk demon-gnokii <yourpassword><br>
+----------------------------------------------------------------<br>
+</i>
+
+<p>Then "pppd call demon-gnokii" should connect
+<br>('tail -f /var/log/messages' to see what is happening)
+
+<p>If a call terminates you should get 'NO CARRIER' and gnokiid should
+continue to work, but this is early code and you may find you have to
+Ctrl-C and restart gnokiid (especially if the phone says the terminal
+connection has been lost)
+
+<p><b>AND ANOTHER EXAMPLE PPP SCRIPT FROM <a href="mailto:wikne@lynx.uio.no">Jon Wikne</a>:</b>
+
+<p>
+<i>
+#!/bin/sh<br>
+#<br>
+# Script to launch PPP over a Nokia 5110 / 6110 mobile phone<br>
+# 20-06-2000 -- Jon Wikne<br>
+#<br>
+### NOTE: "01234567" and "username" below must be replaced<br>
+### with your actual ISP's phone number and your user name.<br>
+#<br>
+### NOTE 2: If you are calling an ISDN number or a digital<br>
+### line you may also need ATS35=0 in the chat sequence.<br>
+ <br>
+# Launch gnokiid....<br>
+echo "Launching gnokiid... "<br>
+/usr/local/sbin/gnokiid &<br>
+ <br>
+# Wait for gnokiid to find the phone.<br>
+sleep 7<br>
+ <br>
+# Now, down to business!<br>
+echo "Calling and starting pppd... "<br>
+pppd /dev/gnokii 115200 debug connect \<br>
+'chat -v ECHO ON ABORT BUSY ABORT ERROR ABORT "NO CARRIER" \<br>
+"" AT OK ATDT01234567 CONNECT ""' \<br>
+noipdefault ipcp-accept-local ipcp-accept-remote \<br>
+user username<br>
+ <br>
+# Some cleaning up to do....<br>
+<br>
+echo -n "Stopping gnokiid... "<br>
+ps ax | awk 'BEGIN { prog="/usr/local/sbin/gnokiid"; ARGC=1 } <br>
+{ if (prog == $5) { print $1 ; exit 0 } }' $1<br>
+kill "$1"<br>
+echo $1
+</i>
+
+<p><font color="#1F409F" size=+2 class="dzial">Permission problem...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<pre>
+> Now xgnokii want to connecting..... and some minutes later it's say:
+> Gnokii serial_open: open: Permission denied
+> Couldn't open FB61 device: Permission denied
+
+you should set your /dev/ttySx to:
+
+crw-rw---- 1 root dialout 4, 65 Jul 5 2000 /dev/ttyS1
+
+and add yourself to the group dialout. or make a new group gnokii
+and do the same thing for this group. see the gnokii doc about
+this, especialy if you want to use gnokiid.
+</pre>
+
+<p><font color="#1F409F" size=+2 class="dzial">Xgnokii files missed...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<pre>
+> > I start to configure:
+> >
+> > elwinx:/usr/src/gnokii# ./configure --prefix=/usr/local/
+> >
+> > checking for X... (cached) libraries /usr/X11R6/lib, headers
+> > /usr/X11R6/include
+> > checking for X11/xpm.h... (cached) no
+> > configure: warning: Cannot find include X11/xpm.h
+> > configure: warning: Disabling xgnokii.
+</pre>
+
+<p>For Debian GNU/Linux 2.2 potato:
+
+<p>
+<pre>
+> Do:
+> dpkg -S \*xpm.h
+> and show the result. You can't use xgnokii without libxpm.
+
+After I installed the xpm4g-dev_3.4k-5.deb xgnokii found my X
+
+My next Problem was the Program didn't find the gtk.h
+
+I installed this lib's
+libglib1.2-dev
+libgtk1.2-dev_1.2.7-1.deb
+
+and xgnokii are start up
+</pre>
+
+<p>For Redhat:
+
+<p>
+<pre>
+On Red Hat 6.2 (or derived?)
+
+sloth:danielm[12]% locate xpm.h
+/usr/X11R6/include/X11/xpm.h
+sloth:danielm[13]% rpm -qf /usr/X11R6/include/X11/xpm.h
+xpm-devel-3.4k-2
+
+On Red Hat 7 (or derived?)
+
+mouth:danielm[4]% locate xpm.h
+/usr/X11R6/include/X11/xpm.h
+mouth:danielm[5]% rpm -qf /usr/X11R6/include/X11/xpm.h
+XFree86-devel-4.0.1-1
+</pre>
+
+<p><font color="#1F409F" size=+2 class="dzial">Infrared problem</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<pre>
+> I'm having trouble getting Gnokii to work with my Nokia 6110 using the
+> infrared connection. It works perfectly with the cable. When I run gnokii
+> as non-root I get the following output:
+>
+> Added new section global
+> Adding key/value port//dev/ttyS3
+> Adding key/value model/6110
+> Adding key/value initlength/default
+> Adding key/value connection/infrared
+> Adding key/value bindir//usr/local/sbin/
+> Entering monitor mode...
+> Initialising GSM interface...
+> Starting IR mode...!
+> Couldn't open FB61 infrared device: Device or resource busy
+> Hmmm... GSM_LinkOK never went true. Quitting.
+>
+> And if I run it as root it looks like this:
+>
+> Added new section global
+> Adding key/value port//dev/ttyS3
+> Adding key/value model/6110
+> Adding key/value initlength/default
+> Adding key/value connection/infrared
+> Adding key/value bindir//usr/local/sbin/
+> Entering monitor mode...
+> Initialising GSM interface...
+> Starting IR mode...!
+> PC: 1c:00:0c:02:00:09:00:01:00:0d:00:00:02:01:40:00:52:06:
+> Timeout in IR-mode
+> PC: 1c:00:0c:02:00:09:00:01:00:0d:00:00:02:01:41:00:53:06:
+> Timeout in IR-mode
+> PC: 1c:00:0c:02:00:09:00:01:00:0d:00:00:02:01:42:00:50:06:
+> Timeout in IR-mode
+> PC: 1c:00:0c:02:00:09:00:01:00:0d:00:00:02:01:43:00:51:06:
+> Timeout in IR-mode
+> PC: 1c:00:0c:02:00:09:00:01:00:0d:00:00:02:01:44:00:56:06:
+> Timeout in IR-mode
+> Hmmm... GSM_LinkOK never went true. Quitting.
+>
+> It makes no difference if IR-reception is activated or not (well maybe the
+> numbers are different, I haven't checked)
+>
+> I have followed the Alessandro's beta-HOWTO which was posted June 22 2000
+> with the subject "Re: IR setup".
+>
+> In /var/log/messages I have found the following:
+>
+> Feb 18 23:34:16 bmw kernel: ircomm_tty: virtual tty driver for IrCOMM (
+> revision:Wed May 26 00:49:11 1999 )
+> Feb 18 23:34:16 bmw kernel: ttyS00 at 0x03f8 (irq = 4) is a 16550A
+> Feb 18 23:34:16 bmw kernel: ttyS03 at 0x02e8 (irq = 3) is a 16550A
+>
+> I have tried both with and without the irda-module loaded (insmod
+> irda) but without luck.
+>
+> I'm using a Fujitsu C325 Lifebook (labtop) and my Nokia 6110 is version
+> 4.33. Has anyone experienced problems like these and hopefully has found a
+> solution, or maybe just have some ideas for what I should try next.
+
+"I also had removed the Ethernet PCcard.
+That thing got assigned the _interrupt_ (irq 3) that the serial interface
+for the IR port needs. Without it gnokii works."
+
+Now I've got contact to my Nokia 6110 using the infrared port.
+</pre>
+
+<p><font color="#1F409F" size=+2 class="dzial">Answering data calls problem...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<pre>
+> It seems like it's some sort of PacBell or Verizon thing, because I
+> get a ring when I try to dial a voice call, but when I dial from
+> minicom/gnokiid I get "NO CARRIER" ("Check Operator Services" on the
+> phone), and dialing in from the Palm still gets no ring.
+
+First we should know how operators manage data call services,
+is there any international standard (it would be, to make international data
+calls possible). I described, how it works with my operator (Plusgsm/PL)
+and I'm interesting if it's a worldwide standard for these services?
+Did somebody tried to make a cellular-to-cellular international data transfer ?
+
+In Plusgsm there are three kinds of data calls :
+1. OUTGOING CALLS. Service activation is free with no additional monthly charge.
+ For default this service is disabled, you have to call operator's helpdesk
+ to enable. With this service is possible to call:
+ a) any internet gate
+ b) WAP gate
+ c) any "private" computer with own transfer protocol
+ d) ?? send a fax ?? (with special fax software for cellular modem
+ included in NCDS)
+ 1 minute charge is similar to voice calls. It's not allowed by the operator
+ to answer incoming data call.
+2. INCOMING CALLS. You have to pay for service activation (5$) and additional
+ monthly charge (10$). Then you will get a new SIM card with 2 phone numbers:
+ one for voice/sms and second one - for incoming data calls only.
+ 1 min charge depends on the network from the call was initiated,
+ generally 1...2 times x voice call.
+3. FAX CALLS. Another payable service, not covered by above mentioned.
+ There is a special trick for incoming fax: it's stored in "FAX mailbox",
+ you can call this mailbox with standard fax machine
+ (or cellular modem connected to PC) to receive it.
+
+I guess your operator have similar restrictions for incoming data calls and
+here is your problem. Incoming call is recognized as a data type and rejected.
+It would be nice to know if it's rejected on the operator's software level or
+by the phone software (acc. to informations stored in the SIM).
+In the second case it's easier to omit these restrictions. But be careful !
+You will be treated by the law in the same way as if you try to hack
+Bill Gates credit card number ;-) .
+</pre>
+
+<p><font color="#1F409F" size=+2 class="dzial">Xgnokii works, gnokii not...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<pre>
+> 1. Why is it that xgnokii communicates perfectly with my 3210, while the
+> only thing that the command line gnokii does is:
+> GSM/FBUS init failed! (Unknown model ?). Quitting.
+> [cvd@sirius gnokii]$ ./gnokii --monitor
+> Opened configuration file /home/cvd/.gnokiirc
+> Added new section global
+> Adding key/value port//dev/ttyS1
+> Adding key/value model/3210
+> Adding key/value initlength/default
+> Adding key/value connection/serial
+
+Look into latest gnokiirc from /docs/default. "serial" setting for connection
+is not used from long time. Change to other actual parameter ("fbus" ?)...
+</pre>
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>GNOKII FAQ</title>
+ <link REL=stylesheet HREF="../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">GNOKII FAQ</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><font color="#1F409F" size=+2 class="dzial">What is gnokii ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Generally, what is gnokii (G from GNU, NOKII from Nokia) ?
+
+<p>It is a name of project. The aim of it is to develop tools and drivers
+for Nokia mobile phones. Of course, I think in this moment about really
+different tools - for example, modem drivers, console tools, etc.
+All created here software is released under the GNU
+General Public License. Please see <a href="COPYING">COPYING</a>
+for more details on license/copying issues,
+the lack of warranty and where to send a postcard if you like gnokii :).
+Anyway, our software works on many software (Linux, Free BSD, etc.)
+and hardware (Intel, etc.) platforms...
+
+<p><font color="#1F409F" size=+2 class="dzial">What software applications are created in gnokii project ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<ul>
+
+<li>
+The first application, gnokii, is a command line utility that was
+originally provided to assist developers and interested users in
+working with the low level API functions that were being developed.
+
+<p>From these rather humble beginnings, it has evolved into a the main
+command line tool of the suite. Many people now use it for
+reading/writing phone book entries, sending and receiving SMS messages
+etc. Ultimately it is intended that it will become a utility that
+communicates with gnokiid to provide a command line interface to
+the functionality provided by the gnokiid daemon.
+<br>
+</li>
+
+<li>
+The second application provided is xgnokii which as the name suggests
+is a X-windows based application that provides a graphical interface
+to your phone. Amongst other things, xgnokii allows you to read and
+write phone book entries, read, write and send SMS messages, monitor
+battery and received signal strength.
+
+<p>At present xgnokii works directly with the phone, however in the
+future it will more likely use the "side" interface of gnokiid.
+
+<p>The main author of it is <a href=mailto:ja@mail.upjs.sk>Jan Derfinak</a>
+<br>
+</li>
+
+<li>
+The third part of the suite is gnokiid. gnokiid provides a
+virtual modem interface, /dev/gnokii that looks like a regular
+Hayes-AT compatible modem with the ETSI defined extensions for
+GSM phones. What this means in practical terms is that you can
+treat the /dev/gnokii device like an ordinary modem and use it
+to make data calls from pppd or a terminal application like
+minicom.
+
+<p>
+gnokiid is still under development, it's ultimate aim being to
+act as a "master" daemon that interfaces with your phone on one
+side and gnokii or xgnokii on the other. This "side" code is still
+under discussion, particularly with respect to the most appropriate
+choice of communication method (IPC, TCP/IP etc.)
+<br>
+</li>
+
+<li>
+The last application provided with the suite is mgnokiidev which is
+used by gnokiid to create on demand a symbolic link between
+/dev/gnokii and the pseudo tty used by gnokiid for the virtual
+modem interface. It's operation is transparent under normal
+usage as gnokiid takes care of calling it when required.
+</li>
+
+</ul>
+
+<p>This project also inspired some people to write other software for Nokia.
+For example:
+
+<p>
+<ul>
+<li>
+There is a perlmodule available for gnokii. It gives access to all
+the routines that are defined in gsm-common.h from a perl-program. It
+is intended for application developers who want to use their favorite
+language in interfacing the phone data with databases, ldap-directories
+and (in the future) different calendar applications. It is written by
+<a href="mailto:konstantin@agouros.de">Konstantin Agouros</a>
+and support starts with revision 0.2.6-pre3 of gnokii.
+
+<p>The homepage of this module is
+<a href="http://www.agouros.de/gnokii">http://www.agouros.de/gnokii</a>
+<br>
+</li>
+
+<li>
+<a href="http://anders.fix.no/software/gnokline-1.0.tgz">http://anders.fix.no/software/gnokline-1.0.tgz</a>
+and <a href="http://alamin.sourceforge.net">http://alamin.sourceforge.net</a> -
+software, which interprets received by connected Nokia phone SMSes and makes some things
+</li>
+
+</ul>
+<p><font color="#1F409F" size=+2 class="dzial">Which phones are supported ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>You can also ask, what phones are supported ? All, you want :-) Really !
+
+<p>At first, we were making in gnokii project modules
+for Nokia 3810/8110 and 51x0/61x0 phones. Later users started to
+write parts for other Nokia phones. And we hope to extend it to another
+models: 7110, etc. Remember: it's even possible to write modules
+for other than Nokia phones
+too (just imagine: support for the most popular phones in one software !)...
+
+<p><a href=phones.htm>Here</a> is more detailed table with supported phones info...
+
+<p>You can also look into
+<a href="http://gnokii.org/users">registered gnokii users database</a>
+too see used by them phones...
+
+<p><font color="#1F409F" size=+2 class="dzial">What is compatibility with hardware ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Generally, gnokii can work with all computers, which have serial port
+(over cable).
+
+<p>If you want to use infrared, sometimes are small problems, because some
+IrDa connectors are not compatible with some standards...
+
+<p><font color="#1F409F" size=+2 class="dzial">How can I get support for it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>We our only people and we sometimes make mistakes. But don't worry:
+support for gnokii is really great. At first, you can tell your problem
+to all gnokii users (in May 2000 on the list there were subscribed about
+1000 people).
+
+<p>The most often it's enough. If not, contact with authors:
+
+<p>When problem is connected with module for concrete phone, write to people
+listed in answer for question <b>Which phones are supported ?</b>.
+For other parts: <a href=mailto:ja@mail.upjs.sk>Jan Derfinak</a>
+is responsible for xgnokii.
+
+<p><font color="#1F409F" size=+2 class="dzial">How to contact with gnokii users ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Thanks to the efforts of
+<a href="http://www.net.lut.ac.uk/~martin/">Martin Hamilton</a> we have a Majordomo based mailing
+list gnokii@net.lut.ac.uk.
+
+<p>You can subscribe by sending email to
+gnokii-request@net.lut.ac.uk with the word <i>subscribe</i> in the body of the text.
+
+<p><b><font color=red>
+Note that the list is not a forum for discussion on how to obtain copies of
+Nokia's proprietary software.</font></b>
+It is the primary discussion forum for the project.
+
+<p><a href="">Archive of the list</a>
+
+<p><font color="#1F409F" size=+2 class="dzial">Does Nokia sponsors/supports this work ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>In the early stages of the project there were indications that
+Nokia would provide some support for the project. Regrettably, these
+negotiations stalled over the issue of binary versus open source
+releases and the project has proceeded without official or unofficial
+assistance.
+
+<p><font color="#1F409F" size=+2 class="dzial">How can I help with creating it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>There are some things, you can do you gnokii:
+
+<p>
+<ul>
+<li>Tell us that you're interested, or that you would use the resulting
+software or that you would be happy to test it out.
+
+<p>The best method to make it is to adding yourself to the user database
+at <a href="http://gnokii.org/users">http://gnokii.org/users</a>.
+<br>
+</li>
+
+<li>
+Give your input in discussions about the design and development of the suite
+now that we are at that stage. In particular the best model of driver
+interface will need to be discussed broadly to get the best result.
+We've only had limited driver writing experience so if you've more, let us know!
+<br>
+</li>
+
+<li>
+Help examining the protocol and its differences between phone models.
+<br>
+</li>
+
+<li>
+Port the software to a new platform. Please tell us before you do so to ensure
+that the port will integrate nicely into the source code tree.
+<br>
+</li>
+
+<li>
+Help us in writing our software or preparing help into it.
+</li>
+</ul>
+
+<p><font color="#1F409F" size=+2 class="dzial">Where to get latest versions ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>The source of gnokii aplications is in the CSV server.
+
+<p>We want to thank to Andrew Tridgell, Samba team for it...
+and Czech Linux Users Group for hosting the original
+CVS repository at cvs.linux.cz.
+
+<p>The server's address is pserver.samba.org. If you
+are already familiar with CVS, set the CVSROOT to
+
+<p><i>:pserver:cvs@pserver.samba.org:/cvsroot</i>
+
+<p>and use the password <i>cvs</i> for checking out the repository with the name
+<i>gnokii</i>.
+
+<p>If you are not familiar with cvs, don't worry. It's very simple.
+First, you need some of older gnokii releases (sources) - see for example
+links in the end of this question. Unpack them to some directory. Then:
+
+<p>
+<ul>
+
+<li>
+For Unix/Linux
+just install the cvs package for your distribution and follow these steps:
+
+<p>
+<ul>
+<li>set your environmental variable CVSROOT. If you have bash (Bourne
+Again Shell):
+
+<p><i>export CVSROOT=:pserver:cvs@pserver.samba.org:/cvsroot</i>
+
+<p>If you have different shell, use different command (e.g. setenv).
+
+<p>
+</li>
+
+<li>Log in to the CVS server as anonymous reader by typing
+
+<p><i>cvs login</i>
+
+<p>Use <i>cvs</i> as your password.
+
+<p>
+</li>
+
+<li>If you are logged in you are ready to checkout the latest sources:
+
+<p><i>cvs co gnokii</i>
+<p>
+</li>
+</ul>
+
+</li>
+
+<li>
+for win32 and (<a href=http://www.wincvs.org>WinCVS</a>):
+
+<p>
+<ul>
+
+<li>
+Go to the Admin/Preferences window
+</li>
+
+<li>
+In the "general" tab set CVSROOT to the <i>cvs@pserver.samba.org:/cvsroot</i>
+and <i>local mounted directory</i> to the <i>"passwd" file on the server</i>
+<p>
+</li>
+
+<li>Go to the Admin/Login window</li>
+
+<li>Enter <i>cvs</i> as the password<p></li>
+
+<li>Go to the Admin/Create/Checkout module</li>
+
+<li>Enter <i>gnokii</i> as module name and directory where have gnokii source
+(WinCVS will
+ create a directory called gnokii under the one you specify)</li>
+</ul>
+
+<p>
+</li>
+</ul>
+
+<p>If you prefer, there is a WWW interface to the CVS server at
+<a href="http://samba.org/cgi-bin/cvsweb/gnokii/">http://samba.org/cgi-bin/cvsweb/gnokii/</a>.
+
+<p>Now you are on your own - you have the current sources on your disk
+in the directory gnokii. If you are going to make substantial changes
+and feel that they should be included into gnokii please mention it
+on the list first to avoid duplicated effort.
+
+<p>If you would like to receive email when updates are made to the CVS
+repository, just send email to
+<a href=mailto:hugh.blemings@vsb.com.au>Hugh Blemings</a> email to that effect
+and you'll be added to the recipients list.
+
+<p>Another way to get almost latest (x)gnokii tools is to download it from
+pages of authors:
+
+<p>
+<ul>
+<li>
+<a href="ftp://ftp.upjs.sk/pub/users/ja/xgnokii/">ftp://ftp.upjs.sk/pub/users/ja/xgnokii/</a>
+- here are really latest versions of xgnokii (site of
+<a href=mailto:ja@mail.upjs.sk>Jan Derfinak</a> - main author of XGNOKII).</li>
+
+<li>
+<a href="ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/">
+ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/</a>
+(site of <a href=Pavel.Janik@linux.cz>Pavel Janik</a>).
+</li>
+
+<li>
+<a href="http://linuxcare.com.au/download/gnokii/pre/">
+http://linuxcare.com.au/download/gnokii/pre/</a> (site of
+<a href="mailto:hugh.blemings@vsb.com.au">Hugh Blemings</a>).
+</li>
+</ul>
+
+<p>Remember: it's still work in progress. It means, that we very often change it,
+add new functions and correct our bugs (sometimes once a day :-))... So,
+it's good to check it often...
+
+</div>
+</body>
+</html>
--- /dev/null
+Getting gnokii to work with a 6210 under linux
+==============================================
+
+- Compile your kernel with IrDA support for your chipset.
+
+For me on my VAIO this was:
+CONFIG_IRDA=m
+CONFIG_IRCOMM=m
+CONFIG_IRDA_OPTIONS=y
+CONFIG_IRDA_DEBUG=y
+
+CONFIG_IRTTY_SIR=m
+ Use the emulation of serial port part of your IrDA chipset or...
+CONFIG_NSC_FIR=m
+ Specify the one you have (I have a NSC 87338)
+
+- Reboot onto new kernel etc.
+- Check your serial devices don't conflict with the ioport/irq that your
+ chipset driver will try to use:
+ setserial /dev/ttySX (where X is 0 -> 3) should give you the information
+ you need.
+ If you have a device that conflicts with your ioport/irq then you will
+ need to remove the serial driver's control over it with:
+ setserial /dev/ttySX uart none port 0 irq 0
+ (where X is there relevant port mine is /dev/ttyS2)
+- I used the chipset way to get IrDA working.
+ I needed:
+ options nsc-ircc dongle_id=0x09
+ alias irda0 nsc-ircc
+ in /etc/modules.conf
+ Then just irattach irda0 -s 1 which *should* load all the modules you need
+ and start it doing irda discovery.
+ The modules I have loaded at this point are: nsc-ircc and irda.
+- Run irdadump to see that it is indeed attempting to discover something.
+ You should see messages like:
+15:24:07.380360 xid:cmd 0c57083d > ffffffff S=6 s=0 (14)
+15:24:07.470333 xid:cmd 0c57083d > ffffffff S=6 s=1 (14)
+15:24:07.560310 xid:cmd 0c57083d > ffffffff S=6 s=2 (14)
+15:24:07.650283 xid:cmd 0c57083d > ffffffff S=6 s=3 (14)
+15:24:07.740279 xid:cmd 0c57083d > ffffffff S=6 s=4 (14)
+15:24:07.830279 xid:cmd 0c57083d > ffffffff S=6 s=5 (14)
+15:24:07.920311 xid:cmd 0c57083d > ffffffff S=6 s=* langly hint=0400 [ Computer
+] (22)
+- Place the phone in front of it, enable the Infrared parts of it (Menu 90)
+ then it should change to be like:
+15:26:07.380336 xid:cmd 0c57083d > ffffffff S=6 s=0 (14)
+15:26:07.470288 xid:cmd 0c57083d > ffffffff S=6 s=1 (14)
+15:26:07.560284 xid:cmd 0c57083d > ffffffff S=6 s=2 (14)
+15:26:07.650281 xid:cmd 0c57083d > ffffffff S=6 s=3 (14)
+15:26:07.740280 xid:cmd 0c57083d > ffffffff S=6 s=4 (14)
+15:26:07.847192 xid:rsp 0c57083d < d10e0000 S=6 s=4 Nokia 6210 hint=b125 [ PnP Modem Fax Telephony IrCOMM IrOBEX ] (27)
+15:26:07.830293 xid:cmd 0c57083d > ffffffff S=6 s=5 (14)
+15:26:07.920283 xid:cmd 0c57083d > ffffffff S=6 s=* langly hint=0400 [ Computer
+] (22)
+- Now try using ircomm to talk to the phone. Try minicom /dev/ircomm0 (you
+ may need to setup a default profile for this port as the root user with
+ minicom -s /dev/ircomm0).
+- This depends on your distribution having the right lines in modules.conf
+ for ircomm to be loaded:
+alias tty-ldisc-11 irtty
+alias char-major-160 irda0
+alias char-major-161 ircomm-tty
+ And your /dev/ircomm0 should be character device 161,0.
+ Debian testing/unstable gets this right.
+ If these don't work you may need to load ircomm and ircomm-tty manually.
+- minicom /dev/ircomm0 should now work and AT commands should function.
+- With a .gnokiirc modified as follows:
+ port = /dev/ircomm0
+ model = 6210
+ connection = irda
+ gnokii --monitor should now function.
+
+ [huggie@langly ~]$ gnokii --monitor
+ Entering monitor mode...
+ RFLevel: 100
+ Battery: 100
+ SIM: Used 5, Free 85
+ etc.
+
+ Not all the functions for 6210 work yet seemingly.
+
+- If instead gnokii hangs then you may have a version of gnokii that still
+ has recv() in irda_open of common/devices/unixirda.c. Just comment out
+ that line, recompile and try again.
+
+
+Simon Huggins <huggie-gnokii@earth.li>
+------------------------------------------------------------------------------
+big performance boost !!
+I kompile my kernel (linux 2.4.7) with:
+CONFIG_IRDA_OPTIONS=y
+CONFIG_IRDA_CACHE_LAST_LSAP=y
+CONFIG_IRDA_FAST_RR=y
+this reduce reading phonebook from 150 to 20 seconds !!!
+
+Ralf Thelen [ralf@mythelen.de]
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Command line gnokii FAQ</title>
+ <link REL=stylesheet HREF="../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Command line gnokii FAQ</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><font color="#1F409F" size=+2 class="dzial">What is command line gnokii ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>It was first our testing tool. Now it can be used for making almost all things
+possible with gnokii package (and this is the only available tool for win32).
+
+<p><font color="#1F409F" size=+2 class="dzial">Some general commands...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><I>gnokii --help</I>
+<DD>Displays GNOKII list of parameters:
+<PRE>c:\> gnokii --help
+ usage: gnokii [--help|--monitor|--version]
+ gnokii --getmemory memory_type start [end] [-d]
+ gnokii --writephonebook [-i]
+ gnokii --getspeeddial number
+ gnokii --setspeeddial number memory_type location
+ gnokii --getsms memory_type start [end] [-f file]
+ gnokii --deletesms memory_type start [end]
+ gnokii --sendsms destination [--smsc message_center_number |
+ --smscno message_center_index] [--long n] [-s] [-C n]
+ [-8] [-v n] [-d]
+ ........
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --version</I>
+<DD>Displays GNOKII version and copyright information:
+<PRE>c:\> gnokii --version
+GNOKII Version 0.3.3-pre8-gold
+Copyright (C) Hugh Blemings <hugh@linuxcare.com>, 1999, 2000
+Copyright (C) Pavel JanÃk ml. <Pavel.Janik@linux.cz>, 1999, 2000
+Built 10:36:05 Dec 10 2000 for 6110 on com2:
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Managing phonebook and other (dialed, misssed, answered, own, etc.) memories</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><I>gnokii --getmemory memory_type start [end] [-d]</I>
+<DD>Reads specificed memory location from phone..
+<p>You can specify such memories:
+
+<p>
+<ul>
+<li>ME - Phone phonebook memory</li>
+<li>SM - SIM card phonebook memory,</li>
+<li>FD - Fixed dial numbers,</li>
+<li>ON - Own numbers,</li>
+<li>EN - Emergency numbers,</li>
+<li>DC - Dialled numbers,</li>
+<li>RC - Received numbers,</li>
+<li>MC - Missed numbers,</li>
+<li>LD - Last dialed</li>
+</ul>
+
+<p>
+With memories DC, EC, MC you will see assigned date (yes, with all Dialled,
+Received, Missed numbers phone saves date and time too !). If you don't want
+it, use <i>-d</i> option
+
+<p>Note: Locations start from 0 !
+
+<p>Usage examples:
+
+<PRE>tfuj:~$ gnokii --getmemory SM 1 5
+Maja ERA;+48604xxxxxx;SM;1;1
+Dom;+4822xxxxxxx;SM;2;5
+Maja;+4822xxxxxxx;SM;3;1
+Iza;+48601xxxxxx;SM;4;5
+Ania;+48501xxxxxx;SM;5;0
+
+tfuj:~$ gnokii --getmemory ON 1 5
+DOM;+4822xxxxxxx;ON;1;5
+;;ON;2;5
+;;ON;3;5
+;;ON;4;5
+ON|5|Bad location or other error!(22)
+
+tfuj:~$ gnokii --getmemory EN 1 5
+Memory type EN not supported!
+
+tfuj:~$ gnokii --getmemory MC 1 5
+Maja IDEA;501xxxxxx;MC;1;5
+21.06.2000 21:32:52
+Maja IDEA;0501xxxxxx;MC;2;5
+21.06.2000 18:06:02
+;;MC;3;5
+11.06.2000 15:09:33
+;;MC;4;5
+11.06.2000 12:44:55
+;;MC;5;5
+10.06.2000 16:59:13
+</PRE>
+
+<p>The meaning of the fields in the output:
+ <UL>
+ <LI>
+ <TT>ME/SM/ON/FD/EN/LD</TT>:
+ <OL>
+ <LI>Name </LI>
+ <LI>Number </LI>
+ <LI>Memory type </LI>
+ <LI>Location in the memory</LI>
+ <LI>Group number</LI>
+ </OL>
+ <LI>
+ <TT>DN/RC/MC</TT>:
+ <OL>
+ <LI>Name </LI>
+ <LI>Number </LI>
+ <LI>Memory type </LI>
+ <LI>Location in the memory </LI>
+ <LI>Group number </LI>
+ <LI>Date and time of the call </LI>
+ </OL>
+ </LI>
+ </UL>
+
+<p>Possible errors:
+ <OL>
+ <LI>Bad location or other error!(22) </li>
+ <LI>Memory type <TT>XX</TT> not supported! </LI>
+ </OL>
+
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --writephonebook [-i]</I>
+<DD>
+Reads the data from the standard input and saves it in the SIM Card/phone
+memory. The input data is in the format as described above (in desciption
+for <i>--getmemory</i> parameter).
+
+<p>Usage examples:
+
+<PRE>
+tfuj:~$ gnokii --writephonebook
+
+Girlfriend;+48501000000;ME;1;1
+Write Succeeded: memory type: int, loc: 1, name: Girlfriend, number: +48501000000
+
+tfuj:~$ echo "Very_long_name_longer_then_the_phone_can_save;some_string;ME;2;1" | gnokii --writephonebook
+Write Succeeded: memory type: int, loc: 2, name: Very_long_name_longer_then_the_phone_can_some_string, number: some_string
+
+tfuj:~$ echo "Girlfriend;+48501000000;ME;200;1" | gnokii --writephonebook
+Write FAILED(22): memory type: int, loc: 200, name: Girlfriend, number: +48501000000
+
+tfuj:~$ echo "Girlfriend;+48501000000;ME;3;10" | gnokii --writephonebook
+Write Succeeded: memory type: int, loc: 3, name: Girlfriend, number: +48501000000
+
+tfuj:~$ gnokii --getmemory ME 1 5
+Girlfriend;+48501000000;ME;1;1
+Very_long_name_l;//3/////2#4;ME;2;1
+Girlfriend;+48501000000;ME;3;10
+;;ME;4;5
+;;ME;5;5
+
+tfuj:~$ echo "Girlfriend;+48501000000;PP;3;10" | gnokii --writephonebook
+Format problem on line 1 [Girlfriend;+48501000000;PP;3;10]
+
+tfuj:~$ echo "some_nonsense_string" | gnokii --writephonebook
+tfuj:~$
+</PRE>
+
+<p>Some notes:
+ <OL>
+ <LI>Remember that any existent entries in the phonebook will be overwritten
+ (must use [-i] option, if you don't want it - you will be asked then, if
+ you want overwrite or not)</LI>
+ <LI>Names and numbers are truncated by the phone when saving. </LI>
+ </OL>
+
+<p>Possible errors:
+ <OL>
+ <LI>Wrong location: Write FAILED(22) </LI>
+ <LI>Wring memoty type: Format problem on line n </LI>
+ <LI>Other errors: [no output] - <I>this should be changed</I> </LI>
+ </OL>
+
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --getvoicemailbox</I>
+<DD>Get voice mailbox number
+
+<p>Example:
+<PRE>
+
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Speed dials</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><I>gnokii --getspeeddial number</I>
+<DD>Reads from the phone a number assigned to a shotrcut key
+
+<p>Example:
+<PRE>
+tfuj:~$ gnokii --getspeeddial 1
+SpeedDial nr. 1: 3:0
+</PRE>
+The output format: <i>SpeedDial nr. key_number: memory_type:location</i>.
+
+<p>On error output is empty.
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --setspeeddial number memory_type location</I>
+<DD>Writes to the phone a number assigned to a shotrcut key.
+You can use memory SM or ME.
+
+<p>Example:
+
+<PRE>
+tfuj:~$ gnokii --setspeeddial 1 SM 1
+Succesfully written!
+
+tfuj:~$ gnokii --setspeeddial 1 PP 1
+Unknown memory type PP!
+</PRE>
+
+<p>...but there are still some bugs:
+
+<PRE>
+tfuj:~$ gnokii --setspeeddial 1 SM 10000
+Succesfully written!
+
+tfuj:~$ gnokii --getspeeddial 1
+SpeedDial nr. 1: 3:16
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">SMS (Smart Messaging System)</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>If you don't know anything about SMS, please read our <a href=../gsm/sms/sms.htm>SMS FAQ</a>.
+
+<DL>
+<DT><I>gnokii --getsms memory_type start [end] [-f file]</I>
+<DD>Reads SMS messages from the specified <i>memory_type</i> (it can
+be phone's internal memory - ME - or SIM card - SM memory) starting at
+<i>start</i> and ending at <i>end</i>. If <i>end</i> argument is not
+present only one location - <i>start</i> - is read.
+
+<p>Examples:
+
+<PRE>tfuj:~$ gnokii --getsms SM 11
+11. Inbox Message (read)
+Date/time: 29/6/0 13:41:22 +0100
+Sender: 102 Msg Center: +48501200777
+Text:
+SMS OD: Mariusz, Wszystkiego najlepszego z okazji imienin! Mariusz
+
+tfuj:~$ gnokii --getsms SM 3
+3. Delivery Report (read)
+Sending date/time: 25/5/0 13:58:24 +0100
+Response date/time: 25/5/0 13:58:32 +0100
+Receiver: +48605000000 Msg Center: +48501200777
+Text: Delivered
+
+tfuj:~$ gnokii --getsms SM 5
+5. Outbox Message (not sent)
+Text: UU0i7eec
+
+tfuj:~$ gnokii --getsms SM 12
+GetSMS SM 12 failed!(4)
+
+tfuj:~$ gnokii --getsms SM 15
+15. Delivery Report (read)
+Sending date/time: 3/1/0 10:49:51 +0100
+Response date/time: 6/1/0 10:51:06 +0100
+Receiver: 1921681052342802 Msg Center: +48501200777
+Text: Failed
+
+tfuj:~$ gnokii --getsms SM 28
+SMS location SM 28 empty.
+
+tfuj:~$ gnokii --getsms SM 25 28
+25. Inbox Message (read)
+Date/time: 18/6/0 12:17:30 +0100
+Sender: 501 Msg Center: +48501200777
+Text:
+Liczba wiadomosci:1,nowych:1,faksow:0
+
+SMS location SM 26 empty.
+27. Inbox Message (read)
+Date/time: 21/6/0 19:45:11 +0100
+Sender: 123 Msg Center: +48501200777
+Text:
+Informujemy, ze wyslalismy do Panstwa fakture z terminem platnosci do 28.06.00. Dziekujemy za wybranie sieci Idea.
+
+SMS location SM 28 empty.
+
+tfuj:~$ gnokii --getsms SM 31
+Invalid location: SM 31
+
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --deletesms memory_type start [end]</I>
+<DD>
+Deletes SMS messages from specified memory type (SM or ME)
+starting at entry <i>start</i> and ending at <i>end</i>
+
+<p>Examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>
+gnokii --sendsms destination [--smsc message_center_number |
+--smscno message_center_index] [--long n] [-s] [-C n]
+[-8] [-v n] [-d]
+[--enablevoice|--disablevoice|--enablefax|--disablefax|
+--enableemail|--disableemail|--void] [--unicode]</I>
+<DD>
+Sends an SMS message to <i>destination</i>
+via SMSC number given in <i>message_center_number</i> or SMSC number taken from
+phone memory from address <i>message_center_index</i>.
+If arguments <i>--smsc</i> and <i>--smscno</i> is ommited SMSC number is taken
+from phone memory from location 1. Message text
+is taken from standard input.
+
+<p>Meaning of optional parameters:
+<ul>
+<li><i>--smsc</i> - specify SMSC set</li>
+<li><i>--smscno</i> - specify SMSC number</li>
+<li><i>--long</i> - reads <i>n</i> bytes and cut into Linked SMS
+(only when contenst is longer than size of 1 SMS)</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-C</i> - specify SMS class</li>
+<li><i>-8</i> - send as 8-bit SMS</li>
+<li><i>-v</i> - set validity</li>
+<li><i>-d</i> - you will receive delivery report</li>
+<li><i>--enablevoice, --disablevoice, --enablefax,
+--disablefax, --enableemail, --disableemail</i> -
+These switches makes, that SMS has different meaning and in some phones
+will enable/disable voice/fax/email signs on phone's screen</li>
+<li><i>--voidsms</i> -
+These switches makes, that SMS has different meaning and some phones
+after receiving it won't
+display anything on the screen, but it will make sound/enable vibra</li>
+<li><i>--unicode</i> - codes SMS as Unicode SMS. When put
+'~' (tilde) char inside, phone will start/end
+blinking text. When will put "{" char,
+contents of SMS will be invisible in some phones.</li>
+</ul>
+
+<p>Examples:
+
+<PRE>
+gnokii --sendsms "+48601601601" < file
+</PRE>
+</DD></DL>
+Saves an SMS message in SIM. Message text is taken from stdin.
+
+<DL>
+<DT><I>
+gnokii --savesms destination|\"\" [--smsc
+message_center_number] [--smscno message_center_index]
+[--long n] [-r] [-i] [-s] [-C n] [-8] [-a] [-l]
+[--enablevoice|--disablevoice|--enablefax|--disablefax|
+--enableemail|--disableemail|--void|--hang|--bug] [--unicode]
+</i>
+<DD>
+
+<p>Meaning of optional parameters:
+<ul>
+<li><i>--smsc</i> - specify SMSC set</li>
+<li><i>--smscno</i> - specify SMSC number</li>
+<li><i>--long</i> - reads <i>n</i> bytes and cut into Linked SMS
+(only when contenst is longer than size of 1 SMS)</li>
+<li><i>-r</i> - mark SMS as read/sent</li>
+<li><i>-i</i> - saves SMS to inbox</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-C</i> - specify SMS class</li>
+<li><i>-8</i> - send as 8-bit SMS</li>
+<li><i>-a</i> - ask, when specify location and sms is already there</li>
+<li><i>-l</i> - specify location</li>
+<li><i>--enablevoice, --disablevoice, --enablefax,
+--disablefax, --enableemail, --disableemail</i> -
+These switches makes, that SMS has different meaning and in some phones
+will enable/disable voice/fax/email signs on phone's screen</li>
+<li><i>--voidsms</i> -
+These switches makes, that SMS has different meaning and some phones
+after receiving it won't
+display anything on the screen, but it will make sound/enable vibra</li>
+<li><i>--hangsms</i> -
+This switch makes, that SMS has different meaning and in some phones
+(like Nokia 5110) it will hang phone, when saved to Outbox and
+you try to read it from phone's menu</li>
+<li><i>--bug</i> -
+This switch makes, that SMS has different meaning and in some phones
+(like Nokia 5110, 6150) has problems with this SMS, when try to read it
+from phone's menu. It seems to be its firmware bug...
+</li>
+<li><i>--unicode</i> - codes SMS as Unicode SMS. When put
+'~' (tilde) char inside, phone will start/end
+blinking text. When will put "{" char,
+contents of SMS will be invisible in some phones.</li>
+</ul>
+
+<p>Examples:
+
+<PRE>
+gnokii --savesms "SavedSMS" -i < file
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>gnokii --getsmsc message_center_number</i>
+<DD>show the SMSC number from location <i>message_center_number</i>.
+
+<p>Usage examples:
+
+<PRE>
+tfuj:~$ gnokii --getsmsc 1
+1. SMS center (CENTERTEL) number is +48501200777
+Messages sent as Text
+Message validity is 72 hours
+
+tfuj:~$ gnokii --getsmsc 2
+2. SMS center () number is
+Messages sent as Text
+Message validity is Unknown
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Date/time and alarm</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><I>gnokii --getdatetime</I>
+<DD>
+Shows current date and time in the phone.
+
+<p>Example:
+
+<PRE>
+tfuj:~$ gnokii --getdatetime
+Date: 2000/07/06
+Time: 23:50:43
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --setdatetime [YYYY [MM [DD [HH [MM]]]]]</I>
+<DD>
+Set the date and the time of the phone.
+
+<p>Example:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --getalarm</I>
+<DD>
+Shows current alarm set in phone.
+
+<p>Example:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --setalarm HH MM</I>
+<DD>
+Set the alarm of the phone.
+
+<p>Example:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Calendar</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><I>gnokii --getcalendarnote index [-v]</I>
+<DD>
+Get the note with number index from calendar. It will be written in
+vCalendar 1.0 format, when use <i>-v</i> option.
+
+<p>Example:
+
+<PRE>
+tfuj:~$ gnokii --getcalendarnote 1
+ Type of the note: Reminder
+ Date: 2000-06-26
+ Time: 23:59:59
+ Text: GNOKII TEST
+
+tfuj:~$ gnokii --getcalendarnote 2
+The calendar note can not be read
+
+tfuj:~$ gnokii --getcalendarnote 1 -v
+BEGIN:VCALENDAR
+VERSION:1.0
+BEGIN:VEVENT
+CATEGORIES:MISCELLANEOUS
+SUMMARY:GNOKII TEST
+DTSTART:20000626T235959
+END:VEVENT
+END:VCALENDAR
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --writecalendarnote vcardfile number</I>
+<DD>
+Write the note to calendar.
+
+<p>Example:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --deletecalendarnote index</I>
+<DD>
+Delete the note with number <i>index</i> from calendar.
+
+<p>Example:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p>
+<img src="../gsm/netmon/nm_5110.gif" align=right>
+<font color="#1F409F" size=+2 class="dzial">Netmonitor</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>If you don't know, what is this or how to use it, please read first
+our <a href=../gsm/netmon/faq_net0.htm>Netmonitor manual</a>.
+
+<DL>
+<DT><I>gnokii --netmonitor {reset|off|field|devel|next|nr}</I>
+<DD>
+Setting/querying netmonitor mode.
+
+<p>Example:
+
+<PRE>
+tfuj:~$ gnokii --netmonitor 0
+TMSI46963A06
+T321: 2/ 20
+PRP:5 0 0
+ 0 784
+
+tfuj:~$ gnokii --netmonitor 1
+ 784 -72 xxx
+ 0 0 x xxxx
+ 29 29
+ CBCH
+
+tfuj:~$ gnokii --netmonitor 2
+ NO 2 B35
+ 16 x
+
+tfuj:~$ gnokii --netmonitor 3
+784 28-73 28
+781 19-82 19
+809 19-82 19
+ N N
+
+tfuj:~$ gnokii --netmonitor 4
+778 12-89 12
+794 11-90 11
+774 8-93 8
+ N N N
+
+tfuj:~$ gnokii --netmonitor 5
+800-99-99-99
+xxxxxxxxxxxx
+xxxxxxxxxxxx
+ N xx xx
+
+tfuj:~$ gnokii --netmonitor 6
+26003 26002
+20420 26001
+26207 20810
+26203 20416
+
+tfuj:~$ gnokii --netmonitor 7
+E A H C I BR
+1 1 0 0 0 10
+
+tfuj:~$ gnokii --netmonitor 1000
+
+ NO TEST
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>gnokii --nm_collect [screen x] [screen y] [screen z]</I>
+<DD>
+This function is like <i>--netmonitor</i>, but:
+
+<p>
+<ul>
+<li>each screen is printed on one single line</li>
+<li>it loop until user press CTRL-C, (like <i>--monitor</i>)</li>
+<li>it output simultaneously 1, 2 or 3 netmonitor screen</li>
+</ul>
+
+<p>Was originally developed for:
+
+<p>
+<ul>
+<li>comparing of data from differents screen.</li>
+<li>log of netmonitor screen</li>
+</ul>
+
+<p>It's easier and has less options than <i>--netmonitordata</i>, but
+should work with every phone that has netmonitor enabled and
+don't need any parameter specifications (like <i>--netmonitordata</i>,
+which requires external file with info about parameters).
+
+<p>Author: <a href=mailto:a.scopece@tin.it>Andrea Scopece</a>
+
+<p>Example:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><I>
+gnokii --netmonitordata [-S file] [-I file] [-h] [-n n] [-ts n] [-tm n]
+[-fs str] [-ls str] FLD1:FLD2:FLDn:...</I>
+<DD>
+
+<p>Meaning of parameters is:
+<p>
+<ul>
+<li><i>-fs string</i> - field separator, default " "</li>
+<li><i>-ls string</i> - line separator, default LF (CRLF for win32)</li>
+<li><i>-ts seconds</i> - seconds before of next output of data (min 1 s,
+max 3600 s)</li>
+<li><i>-tm milliseconds</i> - milliseconds before of next output of data
+(default 200 ms, min 200 ms, max 10000 ms)</li>
+<li><i>-n times</i> - stop data output after "times" cycle.
+ <i>-ts</i> and <i>-tm</i> are mutually exclusive</li>
+<li><i>-h</i> - no header output, (default yes)</li>
+<li><i>DATE</i> - output date, may be as normal YY-MM-DD</li>
+<li><i>DATE-S</i> - output date, may be as short MM-DD</li>
+<li><i>DATE-L</i> - output date, may be as long yyyy-mm-dd</li>
+<li><i>TIME</i> - output time, may be as normal hh:mm:ss</li>
+<li><i>TIME-S</i> - output time, may be as short hh:mm</li>
+<li><i>TIME-L</i> - output time, may be as long hh:mm:ss:cc</li>
+<li>
+<table>
+<tr><td>PARAM1
+<br>PARAM2
+<br>PARAM3
+<br>....
+<br>PARAMn
+</td>
+<td>
+This is the name of a param as specified in file
+info-mon/model/version
+parameter names must be in this file, and are case sensitive.
+
+<p>You can specify max 512 params at once.
+</td></tr>
+</table>
+</li>
+
+<li><i>-S file</i> - parameters of netmonitor screen
+you can override the default specification
+of netmonitor parameters, suppling a file here.</li>
+<li><i>-I file</i> - sequence of command line's argument
+this is useful execute a series of different
+operation, like calling:
+<br><i>gnokii --netmonitordata args_set_1
+<br>gnokii --netmonitordata args_set_2
+<br>gnokii --netmonitordata args_set_3
+<br>gnokii --netmonitordata args_set_n
+</i>
+
+<p>file contains arguments as normally specified
+on command line, but:
+
+<p>on every line you should specify <i>-n n</i> option
+so processing can stop without user intervent,
+and continue with next line args_set.
+
+<p>May be useful to make some pre-made collection,
+as one made for battery check poupose, as
+anothor to monitor neighbor cells, and so on.
+
+<p>Inside this file options <i>-I</i> and option <i>-S</i>
+are silently ignored
+
+<p>Line in this file may be max length 1024
+</li>
+</ul>
+
+<p>Here is also note from author:
+
+<p>Checks of all arguments, and eventually files contents, are made
+before start of data output.
+
+<p>Because of complexity of command line, phone spec, and eventually
+command file, on error, you have datailed description of any error,
+
+<p>Also I attached here an examples of commands-file (see /Docs/examples)
+that can run with:
+<i>mygnokii --netmonitordata -S netmonitordata_6150_413 -I nmd_commands</i>
+
+<p>Users of same model but with other firmware version probably
+should do very little work for an exact parameters specifications
+of theirs phones.
+
+<p>Users of 5110 and 6110 probably should remove some parameters not
+available, like parameters related to dual band.
+
+<p>Users of other phone models should write a new parameters-file:
+some hints are available in file netmonitordata_6150_413.
+
+<p>If help is needed, please dump the screen,
+(<i>mygnokii --netmonitor 20 > screen_20.txt</i>),
+and send an e-mail to <a href=email:a.scopece@tin.it>my address</a>.
+
+<p>If available, check help screen by pressing '*' on phone
+(during netmonitor session).
+
+<p>Scope of this work is monitoring some "user-interesting"
+parameters, coming from differents screen, like battery charging
+vs. time, cell ID and channel changes vs. signal strenght, ...
+
+<p>This is work in progress, so any input would be appreciated.
+
+<p>Author: <a href=mailto:a.scopece@tin.it>Andrea Scopece</a>
+
+<p>Example:
+
+<PRE>
+gnokii --netmonitordata -S file RxL:LAC:CID
+
+gnokii --netmonitordata -S file -fs ";" RxL:LAC:CID
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Logos and startup texts</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>If you don't know, what is logo, please read first <a href=../gsm/logos/logos.htm>our logos FAQ</a>.
+
+<DL>
+<DT><i>
+gnokii --bitmapconvert source destination
+<br>gnokii --bitmapconvert source destination op [network code]
+<br>gnokii --bitmapconvert source destination caller [caller group number]
+<br>gnokii --bitmapconvert source destination startup
+</i>
+<DD>
+Converts logo files. Supported formats:
+NOL, NGG, NSL, NLM, BMP, OTA, XPM.
+3'rd parameter allow to specify, what type should be destination
+logo (when format allows for it).
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --sendlogo op destination logofile network_code
+[--smsc message_center_number] [--smscno message_center_index]
+[-s] [-v n] [-d]
+<br>gnokii --sendlogo caller destination logofile
+[--smsc message_center_number] [--smscno message_center_index]
+[-s] [-v n] [-d]
+</i>
+<DD>
+Send the logofile to destination as operator
+or CLI logo. Optional parameters:
+
+<p>
+<ul>
+<li><i>--smsc</i> - specify SMSC set</li>
+<li><i>--smscno</i> - specify SMSC number</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-v</i> - set validity</li>
+<li><i>-d</i> - you will receive delivery report</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --savelogo op logofile network_code
+[--smsc message_center_number] [--smscno message_center_index]
+[-r] [-i] [-s] [-a] [-l] [--name name]
+<br>gnokii --savelogo caller logofile
+[--smsc message_center_number] [--smscno message_center_index]
+[-r] [-i] [-s] [-a] [-l] [--name name]
+</i>
+<DD>
+Saves the logofile on SIM as operator
+or CLI logo. Optional parameters:
+
+<p>
+<ul>
+<li><i>--smsc</i> - specify SMSC set</li>
+<li><i>--smscno</i> - specify SMSC number</li>
+<li><i>-r</i> - mark as read</li>
+<li><i>-i</i> - save to inbox</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-a</i> - ask, when specify location and sms is already there</li>
+<li><i>-l</i> - specify location</li>
+<li><i>--name</i> - specify recipient/sender name instead of default</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --setlogo op [logofile] [network code]
+<br>gnokii --setlogo startup [logofile]
+<br>gnokii --setlogo caller [logofile] [caller group number] [group name]
+<br>gnokii --setlogo {dealer|text} [text]
+</i>
+<DD>
+Set caller, startup or operator logo or set (Dealer) welcome note.
+
+<p>In Nokia 6110/6130/6150 you will see menu in phone after using it...
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getlogo op [logofile] [network code]
+<br>gnokii --getlogo startup [logofile] [network code]
+<br>gnokii --getlogo caller [logofile][caller group number][network code]
+<br>gnokii --getlogo {dealer|text}
+</i>
+<DD>
+Get caller, startup or operator logo or get (Dealer) welcome note.
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Ringtones</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><i>
+gnokii --sendringtone destination ringtonefile
+[--smsc message_center_number] [--smscno message_center_index]
+[-s] [-v n] [-d] [--scale]
+</i>
+<DD>
+Send the RTTL/OTT file to destination as ringtone.
+
+<p>
+<ul>
+<li><i>--smsc</i> - specify SMSC set</li>
+<li><i>--smscno</i> - specify SMSC number</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-v</i> - set validity</li>
+<li><i>-d</i> - allow to receive delivery report, when send</li>
+<li><i>--scale</i> - saves scale info with all tones. It allow
+to eliminate firmware bug in some Nokia phones.</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --saveringtone ringtonefile
+[--smsc message_center_number] [--smscno message_center_index]
+[-r] [-i] [-s] [-a] [-l] [--name name] [--scale]
+</i>
+<DD>
+Saves ringtone on SIM.
+
+<p>
+<ul>
+<li><i>--smsc</i> - specify SMSC set</li>
+<li><i>--smscno</i> - specify SMSC number</li>
+<li><i>-r</i> - mark as read</li>
+<li><i>-i</i> - save to inbox</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-s</i> - set replying via the same centre</li>
+<li><i>-a</i> - ask, when specify location and sms is already there</li>
+<li><i>-l</i> - specify location</li>
+<li><i>--name</i> - specify recipient/sender name instead of default</li>
+<li><i>--scale</i> - saves scale info with all tones. It allow
+to eliminate firmware bug in some Nokia phones.</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --setringtone ringtonefile
+ [location]
+</i>
+<DD>
+Set the RTTL/OTT as ringtone
+
+<p>In Nokia 6110/6130/6150 you will see menu in phone after using it...
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getbinringtone ringtonefile
+ [location]
+</i>
+<DD>
+Gets downloadable ringtone and writes it in the special binary format
+(it's not yes decoded - after making it this function can be unavailable).
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --setbinringtone ringtonefile
+ [location]
+</i>
+<DD>
+Sets downloadable ringtone. Ringtonefile is in format used by
+<i>--getbinringtone</i>. Mygnokii contains some default Nokia phones
+ringtones saved in this format.
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+
+<DL>
+<DT><i>
+gnokii --ringtoneconvert source destination
+</i>
+<DD>
+Converts ringtone files (RTTL, OTT)
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --playringtone file
+</i>
+<DD>
+Plays ringtone in phone
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --composer ringtonefile
+</i>
+<DD>
+Shows, how ringtone will look in Composer in phone...and how to enter it there...
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --allringtones
+</i>
+<DD>
+Shows names of ringtones in your phone (to test, if they're put into source)
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Backup/restore tool</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><i>
+gnokii --backupsettings file [subformat]
+</i>
+<DD>
+Writes various settings into one file
+
+<p>Supported formats: LMB (Logo Manager Backup - full support for
+N61xx/51xx features; for N7110/6210 some things can be missed, when compare
+to files saved by LM),
+CSS (NCDS3 - only phonebook part),
+CSV (subformats: ncds2, lm, ncds3_pl - some things missed for N7110/6210),
+SCM (WinTesla)
+
+
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --restoresettings file
+</i>
+<DD>
+
+<p>
+<ol>
+<li>restores various settings from one file</li>
+<li>allow to write phonebooks and logos into separate files.</li>
+</ol>
+
+<p>Supported formats: LMB (Logo Manager Backup - full support for
+N61xx/51xx features; for N7110/6210 some things can be missed, when compare
+to files saved by LM),
+CSS (NCDS3 - only phonebook part),
+CSV (subformats: ncds2, lm, ncds3_pl - some things missed for N7110/6210),
+SCM (WinTesla)
+
+
+
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Profiles</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><i>
+gnokii --getprofile [number]
+</i>
+<DD>
+Show settings for selected(all) profile(s)
+
+<p>Usage examples:
+
+<PRE>
+tfuj:~$ gnokii --getprofile 1
+1. "General"
+Incoming call alert: Ringing
+Ringtone number: 19
+Ringing volume: Level 3
+Message alert tone: Standard
+Keypad tones: Off
+Warning and game tones: On
+Vibration: On
+Caller groups: 0x00
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --setprofile number feature value
+</i>
+<DD>
+Set profile feature
+
+<p>Possible features are:
+<ul>
+<li>callalert (Incoming call alert)
+ <br>possible values are:
+ <ul>
+ <li>ringing (Ringing)</li>
+ <li>ascending (Ascending)</li>
+ <li>ringonce (Ring once)</li>
+ <li>beeponce (Beep once)</li>
+ <li>ringing (Ringing)</li>
+ <li>groups (Caller groups - not in N5110)</li>
+ <li>off,0 (Off)</li>
+ </ul>
+</li>
+<li>volume (Ringing volume)
+ <br>possible values are: 1|2|3|4|5
+</li>
+<li>keypad,keypadtone (Keypad tones)
+ <br>possible values are:
+ <ul>
+ <li>0,off (Off)</li>
+ <li>1 (Level 1)</li>
+ <li>2 (Level 2)</li>
+ <li>3 (Level 3)</li>
+ </ul>
+</li>
+<li>smstone,messagetone,sms,message (Message alert tone)
+ <br>possible values are:
+ <ul>
+ <li>0,off (No tone)</li>
+ <li>standard (Standard)</li>
+ <li>special (Special)</li>
+ <li>beeponce,once (Beep once)</li>
+ <li>ascending (Ascending)</li>
+ </ul>
+</li>
+<li>warningtone,warning (Warning and game tones)
+ <br>possible values are: 0|off|1|on
+</li>
+<li>vibra,vibration (Vibration)
+ <br>possible values are: 0|off|1|on
+</li>
+<li>lights (Lights)
+ <br>possible values are:
+ <ul>
+ <li>0,off (Automatic)</li>
+ <li>1,on (On)</li>
+ </ul>
+</li>
+<li>answer (Automatic answer)
+ <br>possible values are: 0|off|1|on
+</li>
+<li>name - profile name (doesn't work in N5110)
+ <br>value is new profile name
+</li>
+<li>ringtone (Ringing tone)
+ <br>value is new ringing tone number
+</li>
+<li>groups - caller group name for profile
+ <br>value is new caller group number
+</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Security features</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<P>This functions are available ONLY, if gnokii was compiled with them !
+
+<DL>
+<DT><i>
+gnokii --entersecuritycode PIN|PIN2|PUK|PUK2
+</i>
+<DD>
+Asks for the code and sends it to the phone
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getsecuritycodestatus
+</i>
+<DD>
+Show if a security code is needed
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getsecuritycode PIN|PIN2|PUK|PUK2|SecurityCode
+</i>
+<DD>
+Gets security code (only SecurityCode allowed !)
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">Other functions</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<DL>
+<DT><I>gnokii --monitor</I>
+<DD>Runs <i>gnokii</i> in persistent communication state - displays all data
+received from the phone to the <i>stderr</i>. Example session:
+
+<PRE>tfuj:~$ gnokii --monitor
+Entering monitor mode...
+Initialising GSM interface...
+RFLevel: 4
+Battery: 3
+Power Source: battery
+SIM: Used 42, Free 188
+Phone: Used 4, Free 46
+FD: Used 0, Free 20
+ON: Used 2, Free 3
+SMS Messages: UnRead 0, Number 26
+Network: IDEA Centertel (Poland), LAC: 00c8, CellID: 1024
+[...]
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --dialvoice number
+</i>
+<DD>
+Initiate voice call from first number on SIM card.
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getdisplaystatus
+</i>
+<DD>
+Shows what icons are displayed in phone's screen.
+
+<p>Usage examples:
+
+<PRE>
+tfuj:~$ gnokii --getdisplaystatus
+Call in progress: off
+Unknown: off
+Unread SMS: off
+Voice call: off
+Fax call active: off
+Data call active: off
+Keyboard lock: off
+SMS storage full: off
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --identify
+</i>
+<DD>
+Get IMEI, model and revision
+. In this moment doesn't work with MBUS connection
+and Unix...
+
+<p>Usage examples:
+
+<PRE>
+tfuj:~$ gnokii --identify
+IMEI: 495502202470000
+Model: NSK-3
+Revision: SW 4.11, HW2460
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --senddtmf string
+</i>
+<DD>
+Sends DTMF sequence
+. If you will start from "p" (Pause), phone will display
+menu before sending it...
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --presskeysequence sequence
+</i>
+<DD>
+presses some keys in phone keyboard
+
+<p>Available keys:
+<ul>
+<li>0..9</li>
+<li>#</li>
+<li>*</li>
+<li>m (Menu)</li>
+<li>n (Names)</li>
+<li>p (Power)</li>
+<li>g (Green)</li>
+<li>r (Red)</li>
+<li>+, - (Volume up or down)</li>
+<li>u (Up arrow)</li>
+<li>d (Down arrow)</li>
+<li>w - 2 sec. pause (useful, when you simulate writing SMS)</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --reset [soft|hard]
+</i>
+<DD>
+Resets the phone.
+ You can use "soft" parameter (no question for PIN code - it's default)
+or "hard" (phone will ask for PIN - of course, if you have it enabled in your card;
+in some phones - for example N5110 - this type of reset will be like "soft")
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getphoneprofile
+</i>
+<DD>
+Gets profile set normally with Product Profile Settings
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --setphoneprofile feature value
+</i>
+<DD>
+Set profile set normally with Product Profile Settings:
+
+<p>Features can be:
+
+<p>
+<ul>
+<li>"ALS" (Alternative Line Service) - values "0" or "1"</li>
+<li>"HRData" (data transmission using Half Rate channels) - values "0" or "1"</li>
+</ul>
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --displayoutput
+</i>
+<DD>
+Show texts displayed in phone's screen
+
+<p>Usage examples:
+
+<PRE>
+tfuj:~$ gnokii --displayoutput
+Entering display monitoring mode...
+Accessory
+connected
+Names
+Menu
+23:59
+Messages
+Exit
+Select
+_
+Messages
+Exit
+Select
+_
+Call register
+Exit
+Select
+2
+Missed
+calls
+Back
+Select
+2-1
+Received
+calls
+Back
+Select
+2-2
+Dialled
+numbers
+Back
+Select
+2-3
+Erase recent
+call lists
+Back
+Select
+2-4
+Show call
+duration
+Back
+Select
+2-5
+Last call
+duration
+00:01:33
+Back
+2-5-1
+All calls'
+duration
+06:45:02
+Back
+2-5-2
+Received calls'
+duration
+02:49:38
+Back
+2-5-3
+Names
+Menu
+23:59
+...WAW...
+POCZTA ELE
+...WAW...
+Leaving display monitor mode...
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getphoneprofile
+</i>
+<DD>
+Gets Product Profile Settings from phone
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --getoperatorname
+</i>
+<DD>
+Get info about downloaded operator name
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<DL>
+<DT><i>
+gnokii --setoperatorname code name
+</i>
+<DD>
+Set downloaded operator name
+
+<p>Usage examples:
+
+<PRE>
+</PRE>
+</DD></DL>
+
+<p><font color="#1F409F" size=+2 class="dzial">How to send SMS to multiple recipients using gnokii ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>
+<i>
+#!/bin/tcsh<br>
+ <br>
+if ( $# == 0 ) then<br>
+ echo "You must specify at least one recipient's number!"<br>
+ exit 1<br>
+endif<br>
+ <br>
+echo -n "Enter SMS:"<br>
+set sms="$<"<br>
+ <br>
+foreach i ( $* )<br>
+ echo "$sms" | gnokii --sendsms "$i"<br>
+end
+</i>
+
+</div>
+
+
+<p><font color="#1F409F" size=+2 class="dzial">Sending script...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Author: oxana [rasqua@t-online.de]
+
+<p>
+I use a simple perlscript to send sms from a daily generated file. The file
+is generated by another script.
+
+<p>The script contains only one line like this "send following data :
++49179xxxxxxx Hallo Guillaume#Test#"
+
+<p>Where +49xxx the number, followed by text, # will be replaced with a
+carriage return (\n) the string "send sms:" is only to prevent errors
+
+<p>I've modified the comments for english language ... the programm is very
+simple (I'am perl-newbie too) but I hope you can read it.
+I use this to send a daily status-sms to my phone.
+
+<p><pre>
+#!/usr/bin/perl
+use strict;
+while (1) #example endlessloop
+{
+my ($strtosend, $valid, $rxnnummer, $smslaenge, $pid, $filename, $timeout);
+# (nummer is german for number, laenge is german for length)
+$filename = "/xxx/xxx/xxx/data/smstosend_data"; # file with
+data
+$valid ="send sms:";
+# to prevent errors
+$timeout = 100;
+# timeout
+open(INPUT, "< $filename"); #
+or die "error opening: $!\n"; # hope here are no errors
+while(<INPUT>)
+# if ok
+{
+$strtosend = $_;
+# copy input to strtosend
+if ($strtosend =~ /\A$valid/)
+# if $valid then
+{
+$strtosend = substr ($strtosend, index($strtosend,"+"));
+# cut all befor number (send sms:)
+if ($strtosend =~ /\+\d.*?\b/) {$rxnummer = $&} else {$rxnummer = 0};
+# all following numbers are phone-number and copy it to rxnummer (nummer is
+german for number)
+$strtosend =~ s/\+49179\d.*?\b\s//g; #
+remove number
+$strtosend =~ s/\#/\n/g;
+# replace # by \n
+$smslaenge = length($strtosend);
+# check length
+$pid = open(FileHandle, "|gnokii --sendsms $rxnummer --long $smslaenge");#
+or die "Fehler bei fork: $!\n"; ### start gnokii and send sms
+print FileHandle "$strtosend\n";
+# send string to stdin
+select(undef,undef,undef,15);
+# i dont know
+close (FileHandle); # or die "Fehler bei close: $!\n"; #
+close gnokii
+close(INPUT);
+# close input-file
+unlink($filename);
+# remove input-file
+open(INPUT, ">> /xxx/xxx/xxx/smshistory_data") or die "error opening: $!\n";
+# open history for append
+print INPUT "\n",'-' x 80,"\n";
+# line with 80 "-"
+print INPUT ("send succeeded to : $rxnummer \nat :
+".localtime()."\n$strtosend \n"); # write text to file
+print INPUT "\n",'-' x 80,"\n";
+# line with 80 "-"
+close INPUT;
+# close file
+}
+else
+# if impossible (open file)
+{
+ # do nothing
+}
+}
+select(undef,undef,undef,$timeout);
+# dont know
+}
+exit(0);
+# exit program
+</pre>
+
+</body>
+</html>
+
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Supported phones</title>
+ <link REL=stylesheet HREF="../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Supported phones</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<table width=100% border=1 cellspacing=0 cellpadding=2>
+<tr>
+<td align="center"><b>Model</b></td>
+<td align="center"><b>Connection</b></td>
+<td align="center"><b>Logos</b></td>
+<td align="center"><b>Ringtones</b></td>
+<td align="center"><b>Data calls</b></td>
+<td align="center"><b>Notes</b></td>
+</tr>
+
+<tr>
+<td align="center">640</td>
+<td align="center">(mbus)</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">3110</td>
+<td align="center">serial</td>
+<td align="center">?</td>
+<td align="center">-</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">3210</td>
+<td align="center">serial/mbus</td>
+<td align="center">startup (static)/operator/picture</td>
+<td align="center">uploading</td>
+<td align="center">-</td>
+<td></td>
+</tr>
+
+<tr>
+<td align="center">3310</td>
+<td align="center">serial/mbus</td>
+<td align="center">startup (static)/operator/picture</td>
+<td align="center">uploading only</td>
+<td align="center">-</td>
+<td align="center">Each memory note has null name</td>
+</tr>
+
+<tr>
+<td align="center">3810</td>
+<td align="center">serial</td>
+<td align="center">?</td>
+<td align="center">-</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">5110</td>
+<td align="center">serial/mbus or ATGSM (with NCDS)</td>
+<td align="center">operator</td>
+<td align="center">-</td>
+<td align="center">yes</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">5130</td>
+<td align="center">serial/mbus or ATGSM (with NCDS)</td>
+<td align="center">operator</td>
+<td align="center">-</td>
+<td align="center">yes</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">5160</td>
+<td align="center">(mbus)</td>
+<td align="center">?</td>
+<td align="center">-</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">6110</td>
+<td align="center">serial/mbus/infrared or ATGSM (with NCDS)</td>
+<td align="center">startup/operator/caller</td>
+<td align="center">uploading/downloading</td>
+<td align="center">yes</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">6130</td>
+<td align="center">serial/mbus/infrared or ATGSM (with NCDS)</td>
+<td align="center">startup/operator/caller</td>
+<td align="center">uploading/downloading</td>
+<td align="center">yes</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">6150</td>
+<td align="center">serial/mbus/infrared or ATGSM (with NCDS)</td>
+<td align="center">startup/operator/caller</td>
+<td align="center">uploading/downloading</td>
+<td align="center">yes</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">6160</td>
+<td align="center">(mbus)</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">6185</td>
+<td align="center">(mbus)</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">6210</td>
+<td align="center">serial/mbus/dlr3 or ATGSM</td>
+<td align="center">startup/operator/caller</td>
+<td align="center">no</td>
+<td align="center">no</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">7110</td>
+<td align="center">serial/mbus/dlr3 or ATGSM</td>
+<td align="center">startup/operator/caller</td>
+<td align="center">no</td>
+<td align="center">no</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">8110</td>
+<td align="center">serial</td>
+<td align="center">?</td>
+<td align="center">-</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">8110i</td>
+<td align="center">serial</td>
+<td align="center">?</td>
+<td align="center">incoming</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+<tr>
+<td align="center">9000i</td>
+<td align="center">?</td>
+<td align="center">?</td>
+<td align="center">incoming</td>
+<td align="center">?</td>
+<td align="center"></td>
+</tr>
+
+</table>
+
+<p>Note:
+
+<p>
+<ul>
+<li><b>?</b> - not tested</li>
+<li><b>incoming</b> - you have to find another phone supported by mygnokii and
+send ringtone/logo/etc. to this one</li>
+<li><b>no</b> - feature not supported by mygnokii</li>
+<li><b>yes</b> - feature supported by mygnokii</li>
+<li><b>-</b> - feature not supported by phone</li>
+</ul>
+
+<p>In connection you have types, you should enter in gnokiirc and which will
+work in phone. When its' in brackets, it means, that this of connection is supported,
+but "connection" parameter in gnokiirc is not important. ATGSM means, that you
+should use ATGSM "model" in gnokiirc.
+
+</body>
+</html>
--- /dev/null
+
+
+todologo.perl GNOKII Tools todologo.perl
+
+
+NAME
+ todologo.perl - Create operator logo that contains 3 lines of text
+
+SYNOPSIS
+ todologo.perl <text of line> - <text of line 2> - <text of line 3>
+
+DESCRIPTION
+ The `todologo.perl' program is used to create three lines of text
+ that fits to the standard Nokia operator logo space (i.e. 72x14
+ pixel space). This is achieved by using a proportional tiny font
+ which most elements have size of 3x4 pixels (some are thinner).
+
+ The name comes from an original intention that this program is
+ used to create todo entries to one's mobile phone screen so that
+ those are always visible and thus in user's memory. But the tool
+ can just be used to print arbitrary text to the space provided
+ by an operator logo.
+
+ The hand-crafted font currently supports the following characters:
+ abcdefghijklmnopqrstuvwxyz and 0123456789
+
+OUTPUT
+ The standard `.nol' formatted operator logo is printed to
+ standard output. The header information of that output is taken
+ from `gnokii.nol' that is distributed with Gnokii -- so you most
+ probably need to give your operator code when uploading it to your
+ mobile phone. Use `Gnokii' or `Xlogos' to do the uploading.
+
+EXAMPLES
+ First example writes some todo entries to todo.nol:
+
+ todologo.perl pick up kids - call wife - order chinese >todo.nol
+
+ This last example writes some wisdom to the stdout:
+
+ todologo.perl Never underestimate - the power of the dork - \
+ side of the force
+
+SEE ALSO
+ Gnokii, Xlogos
+
+COPYING
+ This program is distributed under the GNU Public License.
+
+
+
+Gnokii Tools 25oct2000
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Calendar</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Calendar</font></center>
+
+<p>FIX ME: we need description of Calendar window in xgnokii here...
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Contacts</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Contacts</font></center>
+
+<p>FIX ME: we need description of Contacts window in xgnokii here...
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>DTMF</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">DTMF</font></center>
+
+<p>FIX ME: we need description of DTMF window in xgnokii here...
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>XGNOKII</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">XGNOKII</font></center>
+
+<p>FIX ME: we need description of main xgnokii window here...
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Netmon</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Netmon</font></center>
+
+<p>FIX ME: we need description of Netmon window in xgnokii here...
+
+<p>Related links:
+<br><a href=../../../gsm/netmon/faq_net0.htm>Netmonitor manual</a>
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>SMS</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">SMS</font></center>
+
+<p><img src=sms.gif>
+
+<p>FIX ME: we need description of SMS window in xgnokii here...
+
+<p>Related topics:
+<br><a href=../../../gsm/sms/sms.htm>SMS FAQ</a>
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Speed dial</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Speed dial</font></center>
+
+<p>FIX ME: we need description of Speed dial window in xgnokii here...
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Keyboard</title>
+ <link REL=stylesheet HREF="../../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Keyboard</font></center>
+
+<p>FIX ME: we need description of Keyboard window in xgnokii here...
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Cables FAQ</title>
+ <link REL=stylesheet HREF="../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Cables FAQ</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><font color="#1F409F" size=+2 class="dzial">What cables are used for Nokia phones ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Nokia phone can support three protocols of transmission over cable:
+
+<p>
+<ul>
+<li>M2BUS (called often simply MBUS) - 9600,N,...</li>
+<li>FBUS - 115200</li>
+<li>AT mode - 19600</li>
+</ul>
+
+<p>You cable can support each of them...and phone must be compatible with it
+(for example, CAN'T use DLR-3 with phone, which show "headset connected"
+after connecting it)...
+
+<p><font color="#1F409F" size=+2 class="dzial">Schematics</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Simple M2BUS (only) cable:
+<p><img src=cable1.gif>
+<p>Note:
+<br>
+<ul>
+<li>74HC04 must be in HC version</li>
+<li>Dioda Zenera 3,2 V it required for phones different than 21xx, 3110</li>
+</ul>
+
+<p>FBUS cable:
+<p><img src=cable2.gif>
+
+<p>Switch for M2BUS/FBUS for cable above:
+<p><img src=switch.gif>
+
+<p>Cable for AT mode is unavailable here, because it needs programmed chip
+and I don't know, what programm should be inside...
+
+<p>To make FBUS/MBUS cable you have to connect:
+<p>
+<ul>
+<li>FBUS - GND, TX and RX</li>
+<li>M2BUS - MBUS and GND</li>
+</ul>
+
+<p><font color="#1F409F" size=+2 class="dzial">Phone connectors</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+
+
+<p><font color="#1F409F" size=+2 class="dzial">What are original cables for Nokia phones ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>
+<ul>
+<li>DAU-3 (or DAU-3H) - cable for Nokia series 2100.
+Sell with Nokia Cellularware (it isn't produced now).
+</li>
+
+<li>
+DAU-4S - cable for Nokia 3110 and all models in series 8100 (8110, 8110i, 8148 and 8148i).
+Sell with Nokia Cellularware (it isn't produced now).
+</li>
+
+<li>
+DAU-4F - uniwersal (FBUS/M2BUS) cable without switch,
+for Nokia 3110 and all models in series 8100 (8110, 8110i, 8148 and 8148i).
+Sell with Nokia Cellular Data Suite 1.0 (it isn't produced now).
+</li>
+
+<li>
+DAU-9P - uniwersal (FBUS/M2BUS) cable without switch, for Nokia 51x0/61x0.
+Sell with Nokia Cellular Data Suite 1.2 - 3.0a.
+</li>
+
+<li>
+DLR-1 - cable sell with Nokia 9000 Communicator. It can be used
+to exchange date between phone and computer and installing software into phone.
+It's M2BUS cable.
+</li>
+
+<li>
+DLR-2 - cable sell with Nokia 9110 Communicator. It can be used
+to exchange date between phone and computer and installing software into phone.
+It's M2BUS cable, but can't be used with programs working with this protocol (needs
+some small changes - after them will not work original Communicator programms).
+
+<li>
+DLR-3 and DLR-3P - cables for Nokia 7110/6210. Supports AT mode and FBUS.
+FIXME: MBUS too ?
+</li>
+</ul>
+
+<p><font color="#1F409F" size=+2 class="dzial">Can I use DLR-3 cable with my phone ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>See post from gnokii maillist:
+
+<p>The dlr-3 CAN'T work with the older phones. this is because the
+converter in the cable is powered by the phone. this is done by the
+phone by raising the !mic-gnd! pin to vcc. if the cable doesn't
+repond on the mbus after 1 second, the power is dropped. a older
+phone doesn't do this, so the converter is unpowered.
+
+<p>To decide if a phone needs a dau-9 (the old one, powered by pc) or
+the new one (dlr-3) simply connect a dlr-3 to the phone. if the
+phone says "headset connected" it isn't capable of using a dlr-3
+and you have to change to a dau-9.
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p>Page created from materials from <a href=http://www.fkn.pl>www.fkn.pl</a>
+
+</div>
+</body>
+</html>
--- /dev/null
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+
+ <meta name="konwerter" content="Ogonki97 1.3">
+
+ <meta name="Description" content="Kody do Nokii/Codes for Nokia phones">
+
+ <meta name="language" content="pl">
+
+ <meta name="revisit-after" content="15 days">
+
+ <meta name="Robots" content="all">
+
+ <meta name="KeyWords" content="3210, GSM, DCS, NCDS, MBUS, M2BUS, FBUS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, FAQ, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+
+ <meta name="Author" content="Marcin Wi±cek">
+ <title>FAQ - kable do Nokii</title>
+
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+ <body bgcolor="#ffffff" text="#2b2b69" link="#525ff5" vlink="#525ff5" alink="#2fa030">
+ <a name="Top"></a>
+<p align="Right"><a class="autoremail" href="../../index.htm">Strona g³ówna/Main
+page</a></p>
+
+<center><font color="#1f409f" size="+2" class="tytul">Kody do Nokii/Codes
+for Nokia phones</font></center>
+
+<p></p>
+<hr size="2" noshade="" width="60%" align="Center" style="color: rgb(0,64,128);">
+
+<p>Poni¿ej zosta³y zebrane wszystkie (?) kody do telefonów Nokia, które mo¿na
+wpisaæ w momencie, gdy na wy¶wietlaczu jest widoczna nazwa sieci/logo i odblokowana
+jest klawiatura: </p>
+<p>You have here all (?) codes for Nokia phones. You can enter them, when
+see on the screen network name/logo and keypad is unlocked. </p>
+<p> </p>
+<ul>
+ <li>GSM/DCS/PCN:
+ <ul>
+ <li><b>*#06#</b> - sprawdzanie IMEI/checking IMEI. <a href="../firmware/firmware.htm#IMEI">
+Wiêcej o IMEI/More about IMEI</a></li>
+ <li><b>*EFR0#</b> w³±cza/enables <a href="../netmon/faq_net1.htm#EFR">EFR</a>
+, <b>#EFR0#</b> wy³±cza/disables <a href="../netmon/faq_net1.htm#EFR">EFR</a>
+. Je¿eli dzia³a w Twoim telefonie (GSM/DCS/PCN), telefon siê zrestartuje
+po jego u¿yciu/If it works for your GSM/DCS/PCN phone, phone will restart
+after using it. Je¿eli nie, mo¿esz u¿yæ np. mygnokii ze strony <a href="../../zips/download.htm">
+Pliki do pobrania</a> do jego w³±czenia/If not, you can use mygnokii from
+ <a href="../../zips/download.htm">Files for download</a> page to
+enable it. <a href="../netmon/faq_net1.htm#EFR">Wiêcej o EFR/More about EFR</a></li>
+ <li><b>*HRC0#</b> w³±cza/enables <a href="../netmon/faq_net1.htm#HR">HR</a>
+, <b>#HRC0#</b> wy³±cza/disables <a href="../netmon/faq_net1.htm#HR">HR</a>
+. Je¿eli dzia³a w Twoim telefonie (GSM/DCS/PCN), telefon siê zrestartuje
+po jego u¿yciu/If it works for your GSM/DCS/PCN phone, phone will restart
+after using it. Je¿eli nie, mo¿esz u¿yæ np. mygnokii ze strony <a href="../../zips/download.htm">
+Pliki do pobrania</a> do jego w³±czenia/If not, you can use mygnokii from
+ <a href="../../zips/download.htm">Files for download</a> page to
+enable it. <a href="../netmon/faq_net1.htm#HR">Wiêcej o HR/More about HR</a></li>
+ <li><b>*#sim0clock#</b> - sprawdza, czy mo¿liwe jest zatrzymanie zegara
+karty SIM/checks, if SIM card can stop its' clock (GSM/DCS/PCN)</li>
+
+ </ul>
+ </li>
+ <li>analog:
+ <ul>
+ <li><b>*3001#12345</b>, <b>*#639#</b> - Menu do programowania NAM/NAM programming
+menu. W niektórych modelach pozwala w³±czyæ <a href="../netmon/faq_net0.htm">
+monitor sieci</a> (nazywany Field Test)/In some models allows to enable <a href="../netmon/faq_net0.htm">
+netmonitor</a> (called Field Test).</li>
+ <li><b>*#92772689#</b> - checking ISDN number/sprawdzanie numeru ISDN (N6120/6160/6162)</li>
+ <li><b>*#EVRC#</b> - w³±cza i wy³±cza AMPS (Enhanced Variable Rate Codec)/enables
+and disables AMPS (Enhanced Variable Rate Codec) (N6185)</li>
+
+ </ul>
+ </li>
+ <li><b>*#9999#</b>, <b>*#170602112302#</b>, <b>*#682371158412125#</b>,
+ <b>*#3110#</b>, <b>*#0000#</b>, <b>*#3810#</b>, <b>*#5190#</b>, <b>*#6120#</b>
+, <b>*#837#</b>, <b>*#6190#</b>, <b>*#8110#</b> - sprawdzanie wersji i daty
+firmware, modelu telefonu/checking firmware date & version and phone
+model. <a href="../firmware/firmware.htm">Wiêcej o firmware/More about firmware</a></li>
+ <li><b>#pw+Master code+Y#</b> - kod pozwalaj±cy zdj±æ simlocka o numerze
+Y (je¿eli podano prawid³owy 10-cyfrowy MasterCode) - wtedy zobaczysz <tt>
+"SIM protection turn off"</tt>. Je¿eli telefon ma simlocka i podano z³y MasterCode,
+zobaczysz <tt>"Code error"</tt>. Je¿eli telefon nie ma simlocka, zobaczysz
+ <tt>"SIM was not restricted"</tt>. Mo¿esz sprawdziæ stan simlocka równie¿
+przy u¿yciu mygnokii ze strony <a href="../../zips/download.htm">Pliki do
+pobrania</a> This is code for disabling simlock number Y (if you gave correct
+10-digits MasterCode) - you will see <tt>"SIM protection turn off"</tt>.
+If phone has simlock and MasterCode was wrong, you will see <tt>"Code error"</tt>
+. If phone doesn't have simlock, you will see <tt>"SIM was not restricted"</tt>
+. You can also check simlock state using mygnokii from page <a href="../../zips/download.htm">
+Files for download</a> too</li>
+ <li><b>*#war0anty#</b>, <b>*#warranty#</b> - wej¶cie do menu serwisowego/entering
+service menu. W niektórych telefonach nale¿y usun±æ modu³ analogowy przed
+jego u¿yciem/In some phones you have to remove analog module before using
+it. W niektórych starszych telefonach (np. Nokii 3110) trzeba tu podaæ dodatkowy
+kod/ In some older phones (like Nokia 3110) you have to enter additional
+code here:
+ <ul>
+ <li><b>6232</b> (OK): Pokazuje miesi±c i rok produkcji/Displays the Month
+and Year of Manufacture</li>
+ <li><b>7332</b> (OK): Pokazuje datê ostatniej naprawy/Displays the date
+of the last repairment, if found ('DATE NOT SAVED'...)</li>
+ <li><b>7832</b> (OK): Pokazuje datê kupna telefonu/Displays (if found)
+the date where the phone was purchased ('DATE NOT SAVED'...)</li>
+ <li><b>9268</b> (OK): Pokazuje numer seryjny/Displays Serial Number</li>
+ <li><b>37832</b> (OK): Zmienia datê kupna (TYLKO RAZ!)/Set the Purchasing
+Date MMYY (Warning: You can only do this once - So be careful ...)</li>
+ <li><b>87267</b> (OK): Transfer danych do nastêpnego telefonu/Transfers
+ALL phone numbers, pictures, sounds from one phone to another</li>
+
+ </ul>
+ </li>
+ <li><b>*#7780#</b> - reset ustawieñ telefonu do fabrycznych (np. Nokia
+3110)/reset settings to Factory (for example, Nokia 3110)</li>
+ <li><b>*#date#</b> - pokazuje datê produkcji/data date of production (N2110)</li>
+ <li><b>*#srn0#</b> - pokazuje numer seryjny/shows Serial Number (N6150)</li>
+ <li><b>*#opr0logo#</b> - kasuje logo operatora. Dzia³a w Nokii 3310 4.06
+i nowszych/clears operator logo. Works in Nokia 3310 4.06 and newer</li>
+
+</ul>
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek/Back to the top</em></small></a></p>
+<p> </p>
+<hr size="2" noshade="" width="60%" align="Center" style="color: rgb(0,64,128);">
+ <br>
+<p align="Right"><font class="autor" size="1"><a class="autoremail" href="mailto:Marcin+Wi%B9cek%3CMarcin-Wiacek@topnet.pl%3E">
+Marcin Wi±cek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">
+WWW</a>) <br>
+Ostatnia aktualizacja: 5 stycznia 2002/Last modification: 5 January 2002</font>
+ </p>
+</body>
+</html>
--- /dev/null
+<HTML>
+<HEAD>
+ <meta name="Description" content="Comparing phones">
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
+ <meta name="language" content="pl">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3210, GSM, DCS, NCDS, MBUS, M2BUS, FBUS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, FAQ, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="Author" content="Marcin Wi±cek">
+ <title>Compare phones</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body>
+<script language=javascript>
+
+top.myform();
+
+</script>
+</body>
+</html>
--- /dev/null
+<HTML>
+<HEAD>
+ <meta name="Description" content="Comparing phones">
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
+ <meta name="language" content="pl">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3210, GSM, DCS, NCDS, MBUS, M2BUS, FBUS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, FAQ, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="Author" content="Marcin Wi±cek">
+ <title>Compare your phone</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body>
+
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Strona g³ówna/Main page</a></p>
+
+<p><a href=index.htm target=_blank>Click here to open script in new window</a>
+
+<p><a href=index.htm target=_blank>Kliknij, aby otworzyæ skrypt w nowym oknie</a>
+</body>
+</html>
--- /dev/null
+<HTML>
+<HEAD>
+ <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=ISO-8859-2">
+ <meta name="Description" content="Comparing phones">
+ <meta name="language" content="pl">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3210, GSM, DCS, NCDS, MBUS, M2BUS, FBUS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, FAQ, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="Author" content="Marcin Wi±cek">
+ <title>Compare your phone</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+
+<script language=javascript>
+
+var numer=0;
+var initialized=false; //if variables were correctly initialized
+
+//THESE CAN BE CHANGED
+var howmanyparameters=28;
+var howmanyphones=9;
+
+//init table
+function minitialize(ilosc)
+{
+ for (i=0;i<ilosc;++i) this[i]=0;
+ this.length=ilosc;
+ return this;
+}
+
+function f(mydata) {
+ this.data=mydata;
+ return this;
+}
+
+//adds phone info
+function nphone(mydata)
+{
+ if (numer<howmanyphones)
+ {
+ phonetable[numer]=new f(mydata);
+ numer++;
+ } else
+ {
+ alert("Too many nphone");
+ }
+}
+
+var phonetable=new minitialize(howmanyphones);
+var checkboxstate=new minitialize(howmanyparameters*howmanyphones);
+
+//THESE CAN BE CHANGED
+nphone("Model,Cellular system,Internal phonebook,SMS memory,WAP,Operator logo,Caller groups,Startup logo,Picture images,Ringtones,Calendar,Connection,Data calls,Voice tags,Display,Time&Date,SIM Application Toolkit,Games,DMCP/TTML,Profiles,SMS features,Battery,Vibra,EFR,Call registry,ALS,Calculator,size");
+nphone("Nokia 2110i (NHE-4),GSM 900,125+10 (notepad),5,-,-,-,-,-,8,-,MBUS,9600,-,5 lines,countdown counter,-,-,-,-,reports,Ni-Cd 400/standard NiMH 550/vibra NiMH 550/Ni-Cd 1100/Ni-MH 1500,Battery,-,10 dialled/10 received/10 missed,-,-,?");
+nphone("Nokia 3110 (NHE-8),GSM 900,-,-,-,-,-,-,-,25,-,FBUS/MBUS,9600,-,4 lines/13 chars,-,-,-,-,1+1,reports,Li-Ion 400 (146 g)/standard 550 NiMH (187 g)/vibra 550 NiMH (187 g)/Li-Ion 1500 (203 g),Battery,-,5 dialled/5 received/5 missed,-,-,?");
+nphone("Nokia 3210 (NSE-8/9),GSM 900/1800,-,-,-,1 (72x14),ringtone to each name,animated/static (84x48),4 (72x28),38+2(composer),-,FBUS/MBUS,-,-,84x48,time/date/alarm,yes,Snake/Logic/Memory/React/Rotation,-,1+5,reports+T9+sets,Ni-MH 1250 (151 g),Phone,yes,8 dialled(time/date)/8 received(time/date)/8 missed(time/date),yes,yes,?");
+nphone("Nokia 3310 (NHM-5),GSM 900/1800,-,8 templates(70 chars)/8 smileys(7 chars),-,1 (72x14),ringtone to each name,animated/static (84x48),8+6 screen savers (72x28),35+7(composer),10 reminders (36 chars),FBUS/MBUS,-,8,84x48,time/date/alarm/stopwatch/countdown counter,yes,Snake II/Space Impact/Bantumi/Pairs II,-,6,reports+unicode+linked+T9+sets+chat+multiple send,standard Ni-MH 900/Li-Ion 850,Phone,yes,?,yes,yes,113x48x22mm");
+nphone("Nokia 3330 (NHM-6),GSM 900/1800,100,8 templates(70 chars)/8 smileys(7 chars),1.1 (CSD/2.5kb deck),1 (72x14),ringtone to each name,animated/static (84x48),8+6 screen savers (72x28/animated),35+7(composer),10 reminders (36 chars),FBUS/MBUS,-,8,84x48,time/date/alarm/stopwatch/countdown counter,yes,Snake II/Space Impact/Bantumi/Pairs II/Bumper+downloaed via WAP,-,6,reports+unicode+linked+T9+sets+chat+multiple send,standard Ni-MH 900/Li-Ion 850,Phone,yes,?,yes,yes,113x48x22mm");
+nphone("Nokia 5110 (NSE-1),GSM 900,-,-,-,1 (72x14),-,-,-,30,-,FBUS/MBUS,9600,-,84x48,time/hidden date/alarm,-,Snake/Logic/Memory,-,1+5,reports+sets,Li-Ion 900 (154g)/Li-Ion 1000/standard NiMH 900 (170g)/vibra NiMH 900 (179 g)/Li-Ion 1500 (165 g),Battery,yes,8 dialled(time/date hidden)/5 received(time/date hidden)/5 missed(time/date hidden),yes,yes,?");
+nphone("Nokia 6150 (NSM-1),GSM 900/1800,150,-,-,1 (72x14),5,static (84x48),-,35+1,max. 1297 chars and 50 entries,FBUS/MBUS/Irda,14400,-,84x48,time/date/alarm,yes,Snake (2 players)/Logic/Memory,yes,6,reports+sets,standard Li-Ion 900/Li-Ion 1000/NiMH 900/vibra NiMH 900/Li-Ion 1500,Battery,yes,10 dialled(time/date) 10 received(time/date) 10 missed(time/date),yes,yes,?");
+nphone("Nokia 6210 (NPE-3),EGSM 900/1800,500 with 3 numbers and 1 text (max. under one name: 5 numbers and 2 texts),150 or 50 picture images/templates,1.1 (CDS/SMS/1.3kb deck/50kb cache),1 (72x28),5,static (96x60),50,35+5,220,FBUS/MBUS/Irda/Bluetooth,9.600/14.400 single slot or HSCSD (2+2/3+1/non transparent) via IrDA or cable,10,96x60,time/date/alarm,yes,Snake II (2 players)/Opposite/Pairs II,-,6,reports+sets+multiple send+T9,Li-Polymer 800 (100g)/Bluetooth Li-Ion 810 (120g)/standard Li-Ion 900 (144g)/Li-Ion 1050 (111g),Phone,yes,? dialled(time/date) ? received(time/date) ? missed(time/date),yes,yes,129.5x47.3x18.8mm(standard battery)");
+
+function ret_value(data,number) {
+
+ var ret_previous=0,ret_thisone=0;
+
+ for (var i=0;i<number+1;i++) {
+ var zx=data.indexOf(",",ret_thisone);
+ if (zx==-1) zx=data.length;
+ ret_previous=ret_thisone;
+ ret_thisone=zx+1;
+ }
+
+ return data.substring(ret_previous,ret_thisone-1);
+}
+
+
+function new_state() {
+ this.checked=true;
+ this.tresc='';
+ this.num=0;
+ return this;
+}
+
+function change_state(i) {
+ if (checkboxstate[i].checked==true)
+ checkboxstate[i].checked=false;
+ else
+ checkboxstate[i].checked=true;
+ return true;
+}
+
+//draws form
+function myform() {
+ var num=0;
+
+ if (top.initialized==false) {
+
+ for (i=0;i<top.checkboxstate.length;i++)
+ top.checkboxstate[i]=new top.new_state();
+
+ top.initialized=true;
+
+ for (j=0;j<top.howmanyparameters;j++) {
+ for (i=0;i<top.numer;i++) {
+ var mystring=top.ret_value(top.phonetable[i].data,j);
+
+ for (z=0;z<i;z++) {
+ if (mystring==top.ret_value(top.phonetable[z].data,j)) {
+ mystring='';
+ break;
+ }
+ }
+
+ if (mystring!='') {
+ top.checkboxstate[num].tresc=mystring;
+ top.checkboxstate[num].num=i;
+ num++;
+ }
+ }
+ }
+
+ top.checkboxstate.length=num;
+ }
+
+ num=0;
+
+ top.frames[1].document.open();
+ top.frames[1].document.write("<link rel=stylesheet href=../../styl.css type=text/css>");
+ top.frames[1].document.write("<a NAME=Top></a>");
+ top.frames[1].document.write("<center><font color=#1F409F size=+2 class=tytul>Compare your phone</font></center>");
+ top.frames[1].document.write("<p><hr size=2 noshade width=60% align=center style='color:#004080'>");
+ top.frames[1].document.write("<font class=font>PL: Ta strona pozwala porownywac rozne modele telefonow (jezeli bedzie nia zainteresowanie, dodam kolejne). Bedzie dostepna wylacznie po angielsku");
+ top.frames[1].document.write("<p>This is simple script for comparing info about phones");
+ top.frames[1].document.write("<p>If checkbox name is written in bold, it's category name. If it's ");
+ top.frames[1].document.write("not selected, this category will be not displayed.");
+ top.frames[1].document.write("<p>You can also mark, what parameters from each category MUST be available ");
+ top.frames[1].document.write("in phone description to see this description (the choice is valid even, if category will be not visible).");
+ top.frames[1].document.write("<p>Tested for Internet Explorer 5 (don't use Refresh or Back from menu here) and Netscape 4");
+ top.frames[1].document.write("<FORM NAME=one>");
+ for (j=0;j<top.checkboxstate.length;j++) {
+ top.frames[1].document.write("<INPUT TYPE=CHECKBOX NAME=",num," ");
+ if (top.checkboxstate[j].checked) top.frames[1].document.write("CHECKED ");
+ if (top.checkboxstate[j].num==0)
+ top.frames[1].document.write("OnClick=top.change_state(",j,")><b>",top.checkboxstate[j].tresc,"</b></INPUT>");
+ else
+ top.frames[1].document.write("OnClick=top.change_state(",j,")>",top.checkboxstate[j].tresc,"</INPUT>");
+ top.frames[1].document.write("<br>");
+ }
+ top.frames[1].document.write("<INPUT TYPE=BUTTON OnClick=top.mytable() VALUE='>> Display'></FORM></font>");
+ top.frames[1].document.write("<p><a class=shref href=#Top><small><em>Back to the top</em></small></a><br>");
+ top.frames[1].document.write("<hr size=2 noshade width=60% align=center style=color:#004080>");
+ top.frames[1].document.write("<br><p align=RIGHT><font class='autor' size='1'><a class=autoremail href='mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>'>Marcin Wi±cek</a> (<a class=autoremail href=http://marcin-wiacek.topnet.pl>WWW</a>)");
+ top.frames[1].document.close();
+}
+
+//draws table with info
+function mytable() {
+ top.frames[1].document.open();
+ top.frames[1].document.write("<link rel=stylesheet href=../../styl.css type=text/css>");
+ top.frames[1].document.write("<a NAME=Top></a>");
+ top.frames[1].document.write("<center><font color=#1F409F size=+2 class=tytul>Compare phones</font></center>");
+ top.frames[1].document.write("<p><hr size=2 noshade width=60% align=center style='color:#004080'><p>");
+ top.frames[1].document.write("<table border=1 cellspacing=0>");
+ for (var i=0;i<top.numer;i++) {
+ var mytext="<tr>";
+ var q=0;
+ for (j=0;j<top.howmanyparameters;j++) {
+ var zwr=top.ret_value(phonetable[i].data,j);
+ var w=q+1;
+ while (true) {
+ if (w>top.checkboxstate.length) break;
+ if (top.checkboxstate[w].num==0) break;
+ if (top.checkboxstate[w].tresc==zwr) {
+ if (top.checkboxstate[w].checked==false) mytext="";
+ break;
+ }
+ w++;
+ }
+ if (mytext=="") break;
+ if (top.checkboxstate[q].checked) {
+ mytext=mytext+"<td align=center>";
+ if(i==0) mytext=mytext+"<font class=font><b>";
+ mytext=mytext+zwr;
+ if(i==0) mytext=mytext+"</b></font>";
+ mytext=mytext+"</td>";
+ }
+ q++;
+ while (top.checkboxstate[q].num!=0 && q<top.checkboxstate.length) {
+ q++;
+ }
+ }
+ if (mytext!="") top.frames[1].document.write(mytext+"</tr>");
+ }
+ top.frames[1].document.write("</table>");
+ top.frames[1].document.write("<FORM NAME=two>");
+ top.frames[1].document.write("<INPUT NAME=222 TYPE=BUTTON OnClick=top.myform() VALUE='<< Back to parameters'></FORM>");
+ top.frames[1].document.write("<p><a class=shref href=#Top><small><em>Back to the top</em></small></a><br>");
+ top.frames[1].document.write("<hr size=2 noshade width=60% align=center style=color:#004080>");
+ top.frames[1].document.write("<br><p align=RIGHT><font class='autor' size='1'><a class=autoremail href='mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>'>Marcin Wi±cek</a> (<a class=autoremail href=http://marcin-wiacek.topnet.pl>WWW</a>)");
+ top.frames[1].document.close();
+}
+
+document.write("<frameset cols=0,* border=0 frameborder=no>");
+document.write("<frame noresize src=null.htm><frame src=1.htm></frameset>");
+</script>
+<noscript>
+Required WWW browser with Java Script !
+</noscript>
+</html>
--- /dev/null
+<HTML>
+<HEAD>
+</head>
+<body>
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center>
+<p>Here is table describing firmware in various Nokia 1xxx/2xxx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#100"></a>100</td>
+
+<td>THX-9L</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="450"></a>450</td>
+
+<td>TFH-9</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.04 03-02-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#540"></a>540</td>
+
+<td>THF-11</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.01 18-11-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#550"></a>550</td>
+
+<td>THF-10</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.04 09-06-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#640"></a>640</td>
+
+<td>THF-13</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#650"></a>650</td>
+
+<td>THF-12</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.05 08-12-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#1011"></a>1011</td>
+
+<td>NHE-2</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#1610"></a>1610</td>
+
+<td>NHE-5</td>
+
+<td>*#170602112302#</td>
+
+<td>490139</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.92 17-03-96
+<br>V4.12 30-05-96
+<br>V5.02 26-06-96
+<p>(V4.12) SMS sending added.
+<br>(V4.12) Dodane wysy³anie SMS.
+<p>V5.15 25-02-97
+<br>V5.23 02-11-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#1611"></a>1611</td>
+
+<td>NHE-5SX</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.03 12-08-97
+<p>V4.05 09-11-98 (new 1611?)
+<p>V5.02 26-06-96
+<p>Some firmware versions display full network names.
+<br>Niektóre wersje oprogramowania wy¶wietlaj± pe³ne nazwy sieci.
+<p>V5.23 02-11-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#1630"></a>1630</td>
+
+<td>NHE-5NA</td>
+
+<td>*#170602112302#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.23 02-11-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#1631"></a>1631</td>
+
+<td>NHE-5SA</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#NHE-5NX"></a>16??</td>
+
+<td>NHE-5NX</td>
+
+<td></td>
+
+<td>490152</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.13 10-12-96</td>
+</tr>
+
+<tr>
+<td><a NAME="#2010"></a>2010</td>
+
+<td>NHE-3</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#2110"></a>2110</td>
+
+<td>NHE-1XN</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">Vm4.95 02-07-96
+<br>V5.56 03-12-96</td>
+</tr>
+
+<tr>
+<td><a NAME="#2110i900"></a>2110i, 2110e for GSM 900</td>
+
+<td>NHE-4</td>
+
+<td>*#170602112302#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.11 27-09-95
+<br>V5.62 05-05-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#2110i900_2"></a>2110i, 2110e for GSM 900</td>
+
+<td>NHE-4NX</td>
+
+<td>*#682371158412125#</td>
+
+<td>490130</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.31 06-01-96
+<br>V5.49 09-10-96
+<br>V5.62 05-05-97
+<br>V5.70 15-11-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#2110i_1800"></a>2110i, 2110e for GSM 1800</td>
+
+<td>NHK-IEA</td>
+
+<td>*#682371158412125#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#2140"></a>2140</td>
+
+<td>NHK-1XA</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">Vm4.92 01-06-95</td>
+</tr>
+
+<tr>
+<td><a NAME="#2148"></a>2148</td>
+
+<td>NHK-1</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#2148i"></a>2148i</td>
+
+<td>NHK-4</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#2160"></a>2160</td>
+
+<td>NHC-4NE</td>
+
+<td></td>
+
+<td></td>
+</tr>
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center>
+<p>Here is table describing firmware in various Nokia 3xxx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#3110"></a>3110</td>
+
+<td>NHE-8</td>
+
+<td>*#3110#</td>
+
+<td>490165, 490184 (Finland)</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V6.52 15-05-97
+<br>V7.11 24-09-97
+<p>An updated GSM operators' list.
+<br>Uaktualniona lista operatorów.
+<p>By pressing C during a call which then changes the NaviKey's function
+to Options that include putting the call on hold, address book, sending
+DTMF and ending the Call (it can be activated via a settting menu item
+"In Call functions").
+<br>Przez naci¶niêcie klawisza C w czasie rozmowy oznaczenie NaviKey zmienia
+siê na "Opcje" daj±c dostêp do menu zawieraj±cego ró¿ne opcje przydatne
+podczas rozmowy (mo¿e byæ ono w³±czane przy pomocy opcji "Funkcje równoleg³e"
+w menu).
+<p>The hold function is complemented by a new Menu function "call waiting
+service".
+<br>Funkcja zawieszenia po³±czenia jest obecna w postaci nowej pozycji
+menu ("Us³uga po³±czeñ oczekuj±c.").
+<p>The leaflet also indicates that the volume of all ringing tones have
+been raised.
+<br>Zwiêkszono g³o¶no¶æ wszystkich dzwonków.
+<p>The option to add a number directly from the dialled/received/missed
+calls to the phonebook - When a number in those registers is highlighted
+and is not in the phonebook already, the Navikey displays "Options" which
+include save and dial.
+<br>Dodano opcjê zapisu numeru do ksi±¿ki telefonicznej z menu z wybieranymi/odebranymi
+i nieodebranymi po³±czeniami - je¿eli nie ma jakiego w ksi±¿ce, oznaczenie
+Navikey zmienia siê na "Options", które pozwala w³a¶nie na zapis (i dzwonienie).
+<p>A "fast silent mode" (like in 8110) - press <b>Menu</b> and <b>#</b>.
+<br>Szybkie przej¶cie do cichego trybu (jak w Nokii 8110) - wystarczy nacisn±æ
+<b>Menu</b>
+i <b>#</b>.
+<p>Any answer key function removed.
+<br>Usuniêto funkcjê odbioru jednym klawiszem.
+<p>V7.72 18-12-97
+<p>Support for vibra battery - added menu in option.
+<br>Obs³uga baterii wibracyjnych - odpowiednia opcja w menu.
+<p>Added "Cell Info Display" and "Broadcast Messages" options in menu.
+<br>Dodana obs³uga cell info i cell broadcast (pozycje "Informacje o sieciach"
+i "Wiadomo¶ci sieciowe" w menu)
+<p>V7.73 30-01-98
+<br>V8.11 27-02-98
+<p>(NEWER TOO ?): when you're in menu and press (c) key, phone leaves menu
+(it doesn't go to one level higher)
+<br>(NOWSZE TE¯ ?): je¿eli u¿ytkownik jest w menu i naci¶nie klawisz (c),
+opu¶ci ca³kowicie menu (a nie przejdzie do jednego poziomu wy¿ej).
+<p>V8.30 16-04-98
+<br>V8.32 21-09-98
+<br>V8.50 20-10-98
+<br>
+<hr WIDTH="50%">
+<br>B£¡D (nie wiem, czy z równie¿ z najnowszym oprogramowaniem): nie mo¿na
+do³adowaæ karty SIM+ (zadzwoniæ pod 5555) po wyczerpaniu limitu do 0 PLN
+lub zablokowaniu rozmów wychodz±cych (nale¿y kartê prze³o¿yæ do innego
+telefonu i j± tam do³adowaæ albo skorzystaæ z numeru 0-22 6075555).</td>
+</tr>
+
+<tr>
+<td><a NAME="#3210"></a>3210</td>
+
+<td>NSE-8/9</td>
+
+<td>*#0000#</td>
+
+<td>448896, 448903 (Finland), 449142 (Finland), 449143, 499149 (Germany),
+449150, 449203 (Germany), 449204 (Germany), 449314</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V2.54 20-01-99
+<br>V3.00 07-06-99
+<br>V3.01 10-06-99
+<br>V3.10 17-06-99
+<br>V4.02 20-07-99
+<br>V4.41 17-08-99
+<br>V4.43 14-09-99
+<br>V4.65 07-10-99
+<ul>
+<li>
+Improvement to charger detection and clock stoppings (in the display)</li>
+
+<li>
+Menu support for OTA prepaid service implemented</li>
+
+<li>
+Improved Short Term Memory: the number from e.g. missed calls list can
+now be edited</li>
+
+<li>
+SIM ATK message sent note improved. Now SMS message send indication is
+shown only once when the message is sent.</li>
+
+<li>
+SIM-card busy note implemented in SIM ATK. SIM card busy note is now displayed
+when entering SIM ATK menu while SIM card is waiting for response to send
+SMS or send SS command.</li>
+
+<li>
+Keyguard can now be on, when the phone is connected to PPH-1 car kit</li>
+
+<li>
+Operator name changed "KB Impuls" -> "Bee Line" (250/99)</li>
+
+<li>
+T9 language databases updated</li>
+
+<li>
+T9 case handling improved: Automatical change between upper and lower cases
+after dot (.). Spell mode now uses the present case instead of always starting
+in upper case.</li>
+
+<li>
+Improvements in T9 special character handling and Matches menu</li>
+
+<li>
+Improvement to T9 ('Insert word' and 'Insert number')</li>
+
+<li>
+Improvement to USSD</li>
+
+<li>
+Improvement to CPHS Information number handling</li>
+
+<li>
+Improved reception of two consecutive OTA ringing tones.</li>
+
+<li>
+Postponing alarm for over 90 minutes, improved. When the alarm is set and
+activated, it is possible to postpone (snooze) it continuously (before
+it was limited to 90 min.)</li>
+
+<li>
+Destination number is now given as default if Picture Message sending fails.
+This means that the user does not have to enter the destination number
+again.</li>
+</ul>
+V5.01 26-11-99
+<p>(V4.02) With connected headset the light turn on all time (previously
+not always).
+<br>(V4.02) Przy pod³±czaniu zestawu s³uchawkowego zawsze zapala siê pod¶wietlenie
+(poprzednio nie zawsze).
+<p>Added <b>Menu 3-8</b> ("Prepaid credit").
+<br>Dodane <b>Menu 3-8</b> ("Op³acony kredyt"). Nie dzia³a z SIM+.
+<p>V5.10 21-01-00
+<p>Changes in parts connected with charging battery.
+<br>Zmiany w czê¶ci odpowiedzialnej za ³adowanie baterii.
+<p>V5.22 29-03-00
+<p>V5.26 07-04-00
+<p>Phone displays animated startup logo with "hands", not downloaded by
+user. If you will reset phone settings (Menu3-3 in PC-LOCALS 1.3), it disappear
+and downloaded logo will be displayed then.
+<br>Telefon pokazuje animowane logo startowe z "r±czkami", a nie to wgrane
+przez u¿ytkownika. Je¿eli zresetujesz ustawienia telefonu (Menu 3-3 w PC-LOCALS
+1.3), zniknie ono i pokazywane bêdzie wtedy logo wgrane.
+<p>V5.31 24-05-00
+<ul>
+<li>
+(V5.01): when you edit SMS and enter "*" key (symbols), pressing "#" will
+move cursor to the next line</li>
+
+<li>
+Can't open simlocks using NokiaTool only - must use EEPROM method</li>
+
+<li>
+Dodano dwie ukryte gry (React i Logika). Aby je uaktywniæ (opis dla PC-LOCALS
+1.3):</li>
+
+<ul>
+<li>
+Uruchom PCLOCALS</li>
+
+<li>
+Wejd¼ w menu 3 ( ME Function)</li>
+
+<li>
+Wybierz PRODUCT PROFILE SETTINGS</li>
+
+<li>
+Zmieñ bit 29 (pozycja 1D) z 0 na 1</li>
+
+<li>
+Wci¶nij F2, aby zapisaæ zmiany w EEPROMie</li>
+</ul>
+
+<li>
+Added two hidden games (React and Logic). To activate them (description
+for PC-LOCALS 1.3):</li>
+
+<ul>
+<li>
+RUN PC Locals</li>
+
+<li>
+Goto menu 3 ( ME Functions )</li>
+
+<li>
+Choose PRODUCT PROFILE SETTINGS section</li>
+
+<li>
+Change bit 29 ( place 1D ) from 0 to 1</li>
+
+<li>
+Press F2 to save to EEPROM</li>
+</ul>
+
+<li>
+(NOWSZE TE¯ ?) B£¡D: Po wybraniu czasu 12-godzinnego i jêzyka polskiego
+w godzinach popo³udniowych w menu ustawiaj±cym zegarek pojawia siê godzina,
+"po po³." (po po³udniu) i ró¿ne dziwne znaczki...</li>
+
+<li>
+(NEWER TOO ?) BUG: <a href="../netmon/faq_net4.htm#Menu45">Test 45 in NetMonitor</a>
+and parameter ChCur in <a href="../netmon/faq_net3.htm#Menu23">test 23</a>
+don't work correctly.</li>
+
+<br>(NOWSZE TE¯ ?) B£¡D: <a href="../netmon/faq_net4.htm#Menu45">Test 45
+w monitorze sieci</a> i parametr ChCur w <a href="../netmon/faq_net3.htm#Menu23">te¶cie
+23</a> nie dzia³aj± poprawnie.
+<li>
+(NEWER TOO ?) BUG: When you're in Composer (Menu 9-3), haven't set tempo
+before and use "Tempo", will see blank screen with indicator on the right
+side of screen. To change tempo must press any key.</li>
+
+<br>(NOWSZE TE¯ ?) B£¡D: Kiedy jeste¶ w Kompozytorze (Menu 9-3), nie ustawia³e¶
+tempa melodii i u¿yjesz opcji "Tempo", zobaczysz pusty ekran ze wzka¼nikiem
+po prawej stronie ekranu. Musisz teraz nacisn±æ jeden raz dowolny klawisz...
+<li>
+(NOWSZE TE¯ ?) B£¡D: Niedok³adne t³umaczenie w <b>Menu 1-8-2</b> i <b>Menu
+1-4-1</b></li>
+
+<li>
+Improvement to RF signal bars: When RX was reduced by e.g. 50 dB in phones
+with software version 5.22 or 5.26, the RF signal bars may only decrease
+by one bar instead of two-three bars.</li>
+
+<li>
+Improvement to Picture messages: In previous versions Picture messages
+couldn't be forwarded unless the text was edited.</li>
+
+<li>
+SMS editor speed improved: In previous versions the SMS editor could appear
+slow when entering long messages (100-160 characters)</li>
+
+<li>
+Improvement to composer: In previous versions certain sequences of tones
+could cause the phone to reset.</li>
+
+<li>
+Operator list updated</li>
+</ul>
+V5.36 25-07-00 or 08-08-20 or 27-07-00
+<br>V5.38
+<p>(?) When read info about simlocks via cable some programs (for example,
+NokiaTool), they're CLOSED !
+<br>(?) Przy odczycie informacji o simlockach przez kabel przy u¿yciu pewnych
+programów (np. NokiaTool), s± one ZAMYKANE !
+<p>V6.00 13-10-00 or 03-10-00
+<br>V6.00 23-08-01 (ROM6?)
+<br>
+<ul>
+<li>
+(V5.24) In call register menu new option Send SMS in Dialled/Missed/Received
+list</li>
+
+<li>
+(V5.24)Changed ringing tones (for example, "Hurdy-gurdy")</li>
+
+<li>
+(V5.36) "SIM card registration failed" message is shown when the SIM card
+or phone is unknown or rejected from the network.</li>
+
+<br>(V5.36) Komunikat "Rejestracja karty SIM nieudana" , gdy karta SIM
+lub telefon nie mo¿e byæ zalogowany w sieci
+<li>
+(V5.36) Unknown callers (private/unlisted numbers) are now registered as
+missed calls (for example, in the Call register (<b>Menu 3-1</b>)). They
+are listed as "(no number)" and it is now possible to see Time of call</li>
+
+<li>
+(V5.36) Arabic (Indian) numbers are used correctly</li>
+
+<li>
+(V5.36) Improvement to receiving an over the air ringing tone. Earlier
+when receiving an over the air ringing tone and selecting playback directly,
+the first tone would be partially cut off during the playback (only when
+the keypad tones were activated)</li>
+
+<li>
+(V5.36) Improvement to SIM Application Toolkit</li>
+
+<li>
+(V5.36) Improvements to T9 </li>
+
+<li>
+(V5.36) When using Options menu to insert a symbol twice in an empty SMS
+editor (e.g. @@) (This problem was presented only in SW versions 5.31 and
+5.36) - phone remembers the T9 state after entering and leaving the options
+menu (earlier when entering and leaving the options menu from the SMS editor
+after having disabled T9 with the #-key, the phone would activate T9 again
+automatically)</li>
+
+<li>
+(V5.36) Operator list updated </li>
+
+<li>
+(V5.36) BUG REPAIRED: When edit long SMS (about 160 chars) and press Up/Down
+key very long (until will scroll all SMS context - 160 chars) without releasing,
+phone will restart after it - info from SkyBoy</li>
+
+<br>(V5.36) POPRAWIONO B£¡D: Przy edycji d³ugiego SMSa (oko³o 160 znaków)
+po naci¶niêciu klawisza Góra/Dó³ i przytrzymaniu (bez zwalniania), a¿ ca³y
+SMS (160 znaków) zostanie przewiniêty, telefon zresetuje siê... -
+informacja od SkyBoy
+<li>
+(V5.31) Memory game is named "memory", not "pairs" </li>
+</ul>
+
+<hr WIDTH="50%">
+<br>If you Activate and Deactivate the Phone Security (<b>Menu 4-3-4</b>)
+on Software versions 5.26 - 5.36 the tick is incomplete.
+<p>I have signals, that sometimes after making some things over cable (uploading
+logo, etc.), contrast of LCD is changed ! Probably using Logo Manager makes
+problem!
+<p>Interesting facts: firmware seems to be cut version of firmware from
+more expensive phones. There still some help texts inside, texts from some
+functions (does it mean, that phone support them ?) - ("Rename this set"
+- it can be done via cable !), text with name of "full" profiles - the
+same question (Meeting, Outdoor, Pager, General), texts "Save to another
+memory?, Saved to phone memory,Saved to SIM Card", "List of own numbers"...</td>
+</tr>
+
+<tr>
+<td><a NAME="#3310"></a>3310</td>
+
+<td>NHM-5</td>
+
+<td>*#0000#</td>
+
+<td>350005, 350101 (Finland)</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.24 22-08-00
+<p>BUG (NEWER TOO ?): With voice dialing and HF, when phone understand
+your voice, "hanges". You can see "Dialing too..." and "End". When you
+press "End" and keypad is locked, you will see "Press Unlock and then *"
+and then (something lika that) "Enable SIM application?". When press "OK",
+everything is again normal...
+<br>B³±d (Nowsze te¿ ?): Przy wybieraniu g³osowym (przez zestaw HF) i pozytywnym
+rozpoznaniu znaku, telefon "zamiera". Widaæ "Dzwoni do..." i "Zakoñcz".
+Gdy chcemy Zakoñczyæ i s± zablokowane klawisze pojawia siê "Naci¶nij odblokuj,
+a potem *", a nastêpnie (co¶ w rodzaju) "W³±czyæ aplikacje SIM?". Naciskamy
+"OK" i wszystko wraca do "normy"...
+<p>V4.02 05-10-00
+<p>V4.06 21-11-00
+<ul>
+<li>
+Handling (e.g. sorting/adding/replacing) of names in phonebook corrected
+in Turkish and Greek languages</li>
+
+<li>
+Special characters corrected in Danish language (when sent to 8210/3210)</li>
+
+<li>
+Improvements to SIM-ATK, e.g.:</li>
+
+<ul>
+<li>
+When USSD notify is send, the phone sends the response to the SIM card</li>
+
+<li>
+Long press 'C' and short press 'C' gives correct value to SIM card</li>
+
+<li>
+Call coming with SIM ATK gives correct result back to SIM</li>
+
+<li>
+Display Text works with scroll key</li>
+</ul>
+
+<li>
+Improvements to SMS and T9:</li>
+
+<ul>
+<li>
+Delivery report 'pending' in Chat-mode corrected</li>
+
+<li>
+Name were missing on delivery reports</li>
+
+<li>
+Changes in cursor movements in SMS (with active T9)</li>
+
+<li>
+Adding words to dictionary can be recognised</li>
+</ul>
+
+<li>
+Improvements to Reminder:</li>
+
+<ul>
+<li>
+Corrections on functionality when erasing one by one, pressing Clear during
+erase</li>
+
+<li>
+Receiving calendar requests from other phones improved</li>
+</ul>
+
+<li>
+USSD commands activated from AND (Abbreviated Dialling Numbers) when Speed
+Dial selected</li>
+
+<li>
+New code - you can Clear Operator Logo using <b>*#67705646#</b> command</li>
+
+<li>
+Returning from game settings improved</li>
+
+<li>
+Service numbers do not open anymore an empty screen</li>
+
+<li>
+Improvement to phonebook number query count</li>
+
+<ul>
+<li>
+Caller groups in names on SIM card were not always removed</li>
+</ul>
+
+<li>
+Improvements to OTA functionality</li>
+</ul>
+V4.18 12-01-01 (18-12-00 ?)
+<br>Support for new Power Amplifier added
+<p>V4.23 25-01-01
+<ul>
+<li>
+Improvements to SIM-ATK: Setup Call could reset phone, if text sent with
+Setup Call was very long </li>
+
+<li>
+Improvements to SMS and T9: </li>
+
+<ul>
+<li>
+Receiving Picture Messages with Euro sign </li>
+
+<li>
+Counter in Picture Messages when Unicode is selected (Adding character
+counter for message writen other than English ?)</li>
+
+<li>
+'Send to many' option after reply </li>
+
+<li>
+Not able to fetch Phonebook (blank display) when forward / reply to SMS </li>
+
+<li>
+Errors receiving Concatenated SMS </li>
+
+<li>
+Inserting a Smiley </li>
+</ul>
+
+<li>
+Improvements to Reminder: letter counter (earlier: when edit reminder text,
+number of free chars is displayed incorrectly. First: one additional byte
+is used for indicating coding (in fact you have maximally 35, not 36 chars),
+second: some chars are saved as two 8 bit chars (indicator doesn't show
+it) and when write only them, you can write only 17 chars. Summary: you
+can write 17 - 35 chars (number of it depends, what chars are in text)
+and indicator doesn't show number of free chars correctly...)</li>
+
+<li>
+Improvements to Settings: Light managing in carkit </li>
+
+<li>
+Improvements to Composer: Screen blanked when selecting Tempo option with
+some OTA ringing tones </li>
+
+<li>
+Improvements to Phonebook: </li>
+
+<ul>
+<li>
+Indicator shown while sending message </li>
+
+<li>
+Long number correction </li>
+</ul>
+</ul>
+V4.19 03-01-01
+<br>The same functionality as version 4.18
+<p>Note: New text strings (localisation), which were implemented in V4.23,
+contained some specific characters (i.e. Clear Key when writing SMS). Software
+version 4.19 will correct these failures.
+<p>V4.24 23-02-01
+<ul>
+<li>
+Note: When using V4.23, deleting character with 'C' key was not possible
+in language pack B, G and H. This has been corrected.</li>
+
+<li>
+Contains all improvements made in V4.23</li>
+
+<li>
+Support for RFMD Power Amplifier added </li>
+
+<li>
+Improvements to SIM-ATK: If Display text was (8n-1) long, an @ would show
+at the end </li>
+
+<li>
+Improvements to SMS and T9: </li>
+
+<ul>
+<li>
+Wrong counter in query </li>
+
+<li>
+Letter counter </li>
+
+<li>
+Euro-sign as second-last character in Reminder Text </li>
+</ul>
+
+<li>
+Improvements to Reminder: Euro-sign as second-last character in Reminder
+Text </li>
+
+<li>
+Improvements to ALS: Missing blinking indicator for non selected line </li>
+
+<li>
+Improvements to Phonebook: </li>
+
+<ul>
+<li>
+Voice Mailbox DDI Interface improved </li>
+
+<li>
+Corrections to Turkish language (menu items, translations, message in Voice
+dialling)</li>
+
+<li>
+(removed bug) Can read phonebook and other memories via cable</li>
+</ul>
+</ul>
+V4.35 29-03-01
+<ul>
+<li>
+'Insert SIM' problem with certain 32K SIM cards improved </li>
+
+<li>
+(?) 'Uppercase ABC' in Chinese Language package corrected </li>
+
+<li>
+(?) 'Multi Sim Lock' included</li>
+</ul>
+V4.45 21-06-01:
+<br>V4.45 05-07-01 (ROM6?):
+<ul>
+<li>
+Language: </li>
+
+<ul>
+<li>
+General update of Dictionary in all languages </li>
+
+<ul>
+<li>
+New T9-languages </li>
+
+<ul>
+<li>
+Czech</li>
+
+<li>
+<b><font color="#FF6666">Polish </font></b></li>
+
+<li>
+Hebrew </li>
+</ul>
+
+<li>
+New UI-language </li>
+
+<ul>
+<li>
+Ukrainian (No T9 input) </li>
+
+<li>
+Chinese </li>
+</ul>
+
+<li>
+Selected 'word' shown as "square" in traditional Chinese </li>
+
+<li>
+Special word not selectable when Bopomofo </li>
+
+<li>
+Vietnamese </li>
+
+<ul>
+<li>
+Translation to 'Countdown Timer' corrected </li>
+</ul>
+
+<li>
+German </li>
+
+<ul>
+<li>
+Translation of 'Highscore' corrected </li>
+</ul>
+
+<li>
+Hebrew </li>
+
+<ul>
+<li>
+input in all editors </li>
+</ul>
+</ul>
+
+<li>
+Composer </li>
+
+<ul>
+<li>
+Vibrating in Composer stops when receiving an SMS </li>
+
+<li>
+Vibra active when composing a ringing tone </li>
+
+<li>
+Not possible to forward received ringing tones anymore </li>
+</ul>
+
+<li>
+Phonebook </li>
+
+<ul>
+<li>
+Mixed case multitap ('Abc') in phonebook implemented </li>
+
+<li>
+Alphabetic sorting order corrected when spaces in the beginning of a name </li>
+
+<li>
+Search in Phonebook now starts from the top </li>
+
+<li>
+Scrolling error in Chinese Phonebook corrected </li>
+
+<li>
+Leading blanks ignored in sorting </li>
+
+<li>
+When trying to save "no. too long, max. 20" next screen is number editor
+but with name query </li>
+</ul>
+
+<li>
+Dictionary / SMS / GMS </li>
+
+<ul>
+<li>
+'Insert word' works without adding spaces </li>
+
+<li>
+'Insert symbol' will be placed at cursor position </li>
+
+<li>
+Mixed numbers and characters handeled correctly </li>
+
+<li>
+Phone freeze / reset when sending GMS if Message Center Number missing
+is corrected</li>
+
+<li>
+From Option menu in Write Message 'Upper / Lower' case latin </li>
+
+<br>input can be selected from menu in chinese language packs </ul>
+
+<li>
+MISC </li>
+
+<ul>
+<li>
+Calculator: Exchange rate now done with higher precision </li>
+
+<li>
+SIM ATK: Clear key is now working properly in Play Tone </li>
+
+<li>
+Shortcut: Missing functionality in Reminder and Tone menu implemented </li>
+
+<li>
+General update of Operator Name List (#41) and UI Text</li>
+</ul>
+</ul>
+</ul>
+Users info (corrected or changed things compared with V4.02):
+<ol>
+<li>
+the same:</li>
+
+<ol>
+<li>
+Picture Images:</li>
+
+<ol>
+<li>
+You can write Unicode chars. You can write, but when send image or get
+via cable, they're converted to latin chars (I quess: for backward compatibility
+with older phones)</li>
+
+<li>
+You can have sender number for each Picture. Phone can't put alphanumeric
+numbers (only "normal" and "international") there...</li>
+</ol>
+
+<li>
+SMS:</li>
+
+<ol>
+<li>
+Unicode SMS's saved in Outbox have Details in Options and "Sender" and
+"Message centre: 0" there (sometimes date too)...</li>
+
+<li>
+No differences between "Automatic" and "GSM alphabet" (<b>Menu 2-7-6-3</b>)
+- Unicode SMS chars are translated to chars from GSM alphabet. IMHO, when
+set to Automatic and write Unicode specific chars, Unicode should be used;
+if don't use such chars, GSM Alphabet should be used (you should see in
+editing screen info about this - different number of maximal chars)</li>
+
+<li>
+When edit SMS, have some contenst inside, T9 dictionary is disabled and
+write with large chars (ABC on the tope of the screen) and use any of functions
+from Options (at least enter into it and return to editing), size of chars
+for new text is set to small (abc on the top of the screen).</li>
+
+<li>
+When open SMS from Outbox for editing, T9 dictionary is disabled, size
+of chars for new text is set to small (abc on the top of the screen).</li>
+
+<li>
+When save Linked SMS in Outbox, they're visible double...</li>
+
+<li>
+(???) Some business cards (from 3210 ?), which contains some additional
+data after correct business card contents are not recognized and you have
+problems with editing them...</li>
+
+<li>
+(???) Blinking SMS Unicode messages (contains 0x00,0x01 chars) can be edit
+and forwared (GREAT!), but wrote appears few spaces in front of the cursor
+(as if cursor was there, but it's not - it's few characters behind!)</li>
+
+<li>
+T9 dictionary:</li>
+
+<ol>
+<li>
+When enable T9 dictionary, have "Insert number", "Insert symbol" and "Insert
+word" in Options during editing SMS. They don't seem to be connected with
+T9 (at least two first)</li>
+</ol>
+</ol>
+
+<li>
+Reminders menu (very limited version of Calendar) is like joke:</li>
+
+<ol>
+<li>
+When use <b>Menu 10-3-2</b> with empty reminders memory, phone goes out
+from Reminders menu</li>
+
+<li>
+when set notes via cable, year of them is set to 2090</li>
+
+<li>
+(???) can receive notes from more expensive models (61xx) and send them
+in one SMS (can not edit); when create reminder in phone and send it to
+more expensive model (61xx), two SMS are required...</li>
+
+<li>
+(???) don't display date from notes from more expensive models (61xx)</li>
+
+<li>
+(???) when send note to more expensive models (61xx), date of it is 13.07.2041</li>
+
+<li>
+(???) loss birthday date in note (in such situation: forward note from
+61xx to 3310, from 3310 to 61xx)</li>
+</ol>
+
+<li>
+Ringtones:</li>
+
+<ol>
+<li>
+Phone incorrectly decodes some tones (their scale) in received tones (only
+?) in Composer - to avoid this you must save Scale info with each ringtone
+(--scale option in --saveringtone/--sendringtone in mygnokii).</li>
+
+<li>
+(???) When receiving an over the air ringing tone and selecting playback
+directly, the first tone would be partially cut off during the playback
+(only when the keypad tones were activated)</li>
+</ol>
+
+<li>
+Games:</li>
+
+<ol>
+<li>
+Go into Bantumi game, select New Game, during animation press Navi key
+and then C, select Continue and press any key. Interesting...</li>
+
+<li>
+You must enable Warning Tones (<b>Menu 5-7</b>), when want to use Sound
+(<b>Menu 8-6-1</b>). Old code (in older Nokias these options were connected)</li>
+
+<li>
+You must enable Vibrating alert (<b>Menu 5-8</b>), when want to use Shakes
+(<b>Menu 8-6-3</b>)</li>
+
+<li>
+When select maze in Snake II, must play and end at least one game - maze
+state is saved then into EEPROM</li>
+
+<li>
+(???) Sometimes phones doesn't vibrate (with enabling shaking option) in
+Snake II after eating food</li>
+
+<li>
+(???) When play games (Space Impact only ?) and have "Battery full" message,
+phone leaves menu...</li>
+
+<li>
+(???) Sometimes doesn't write line in border in Snake II</li>
+
+<li>
+(???) When end game with high score and press key during displaying score
+info/animation, new score is not saved</li>
+</ol>
+
+<li>
+Language specific:</li>
+
+<ol>
+<li>
+PL: kiedy w <b>Menu 8-6-4</b> masz zapisany identyfikator i wybierzesz
+Wybierz, telefon pyta siê: Zastapic poprzedni identyfikator ? (niedok³adne
+t³umaczenie).</li>
+
+<li>
+PL: Niedok³adne t³umaczenie w <b>Menu 1-8-2</b> i <b>Menu 1-4-1</b> i <b>Menu
+10-3-1</b></li>
+
+<li>
+To use some chars specific for some languages you need to activate them
+(what, when phone doesn't have correct PPM package with specific language
+?)</li>
+
+<li>
+PL: Komunikat "Mikrofon wy³±czon"</li>
+</ol>
+
+<li>
+Warranty menu (<b>*#war0anty#</b>):</li>
+
+<ol>
+<li>
+if you haven't entered Purchasing date, press Edit, use up/down keys, press
+any digit char and then you will have menu for editing Purchasing date...</li>
+
+<li>
+(???) Life Timer doesn't work from the start (it starts showing correct
+values, when all calls were longer than 1 h)</li>
+</ol>
+
+<li>
+Other:</li>
+
+<ol>
+<li>
+In netmonitor (all versions ?) in <a href="../netmon/faq_net4.htm#Menu55">test
+55</a> you have small type (one 's' too much in last line) in help and
+info displayed in first line only</li>
+
+<li>
+(???) After changing SIM card, voice tags weren't erased (manual connected
+to phone writes, that they should be....) and T9 dictionary was enabled
+and first number selected on SIM card and Cell info display (<b>Menu 6-2-2</b>)
+set to off and and all tones assigned in <b>Menu 1-6</b> set to default
+(manual doesn't write about it).</li>
+
+<li>
+Where is <b>Menu 8-5</b> ?</li>
+
+<li>
+(???) well, in Reminders and phonebook can have numbers of chars < 0
+(indicator on top screen). If it happens, phone informs about it or cut
+some chars...</li>
+
+<li>
+(???) Shortcut to <b>Menu 6-1-1</b> doesn't work correctly</li>
+</ol>
+</ol>
+
+<li>
+corrected or changed:</li>
+
+<ol>
+<li>
+Phonebook:</li>
+
+<ol>
+<li>
+Better sorting of entries with national chars. Phonebook is also returned
+in Unicode now (via cable).</li>
+</ol>
+
+<li>
+SMS:</li>
+
+<ol>
+<li>
+(corrected - in some V4.02 it wasn't OK) In delivery reports don't have
+names, only numbers (even, if numbers are in the phonebook)</li>
+
+<li>
+T9 dictionary:</li>
+
+<ol>
+<li>
+(corrected) T9 dictionary state is not saved during disabling phone</li>
+</ol>
+</ol>
+
+<li>
+Other:</li>
+
+<ol>
+<li>
+(new) Abc mode when write texts, SMS, etc.</li>
+
+<li>
+(V4.06) when somebody calls you and will press "C" (drop a call or divert
+it), for a moment (one, two seconds) screen looks like after answering
+call...</li>
+</ol>
+
+<li>
+Ringtones:</li>
+
+<ol>
+<li>
+Phone is not compliant with Smart Messaging 2.0.</li>
+
+<br><b>Earlier: </b>For received ringtones with some speed values (according
+to SM2.0), when you edit them in Composer and use "Tempo", will see blank
+screen with indicator on the right side of screen. To change tempo must
+press any key.
+<br><b>In version 4.23 it was probably corrected</b>
+<br><b>Now:</b> when enter Composer, don't see even ringtone contenst</ol>
+
+<li>
+Reminders menu (very limited version of Calendar) is like joke:</li>
+
+<ol>
+<li>
+(corrected) sometimes doesn't delete notes (when memory is full):</li>
+
+<ol>
+<li>
+use Add new (<b>Menu 10-1</b>)</li>
+
+<li>
+phone will display: "Memory full. Replace old reminder ?" - press NaviKey
+(OK)</li>
+
+<li>
+you will be able to select, which reminder should be deleted (NaviKey=Erase).
+Select such reminder, which has default name (when created it, didn't write
+anything in "Remind about" and phone write "Reminder" now)</li>
+
+<li>
+Press NaviKey (Erase)</li>
+
+<li>
+Phone will ask "Erase ?"</li>
+
+<li>
+Press NaviKey (OK)</li>
+
+<li>
+Phone will display "Reminder erased" and will display empty screen. When
+will come back to viewing reminders, will see, that ist wasn't erased !</li>
+</ol>
+</ol>
+
+<li>
+Netmonitor:</li>
+
+<ol>
+<li>
+(new - earlier it was always equal 0) Works "TIM" parameter in <a href="../netmon/faq_net6.htm#Menu132">test
+132</a></li>
+
+<li>
+(new - earlier this test only reseted timers) <a href="../netmon/faq_net5.htm#Menu80">Test
+80</a> resets timers from <a href="../netmon/faq_net5.htm#Menu82">test
+82</a> and enables them (works as <a href="../netmon/faq_net5.htm#Menu81">test
+81</a>)</li>
+</ol>
+</ol>
+
+<li>
+Other: after upgrading firmware all Picture Images with sender numbers
+have them changed (last digit changed to "0")</li>
+</ol>
+V5.03 10-10-01
+<ul>
+<li>
+Possibility for user to delete SIM-created SMS from inbox </li>
+
+<li>
+Operator Name List updated (#44) </li>
+</ul>
+V5.11
+<ul>
+<li>
+Following T9 languages have been added: Arabic, Hungarian, Slovakian </li>
+
+<li>
+Dictionary/SMS:</li>
+
+<ul>
+<li>
+Phone virus (SMS with corrupt header) can be deleted and only deleted </li>
+
+<li>
+Chat: editing Chatname cursor placement is fixed </li>
+
+<li>
+Hebrew: Templates, Searching and Keymap (in 'spell' state) improved. Writing
+more than one capital letter is now possible </li>
+
+<li>
+Russian: Unicode and Latin letters in same SMS are now received correctly </li>
+
+<li>
+Picture Message: Blank screen after a call is now removed </li>
+
+<li>
+Improvement to Smiley editor counter </li>
+</ul>
+
+<li>
+Phonebook: </li>
+
+<ul>
+<li>
+Change Phone Line (with #) is now only possible from Idle </li>
+
+<li>
+Numbers matched even with + in it </li>
+
+<li>
+Incoming call is now indicated while erasing all in phonebook </li>
+
+<li>
+Possible to add new entries to internal Phonebook when FDN is on (but not
+possible to dial) </li>
+
+<li>
+Missing information note added when copying entries between SIM and Phone
+memory (Security level: Memory) </li>
+
+<li>
+Scrolling Phonebook entries with leading spaces possible for Latin as well
+as for Chinese names </li>
+
+<li>
+Keypad lock can no longer be unlocked using special key string </li>
+</ul>
+
+<li>
+Emergency call: During snooze softkey text is changed to 'call' Possible
+while entering new PIN-code </li>
+
+<li>
+Euro-sign in picture message received successfully on other phones </li>
+
+<li>
+Counter overflow corrected (language pack G) in Reminder and Phonebook </li>
+
+<li>
+Alignment corrected in Stop Watch and Unit Price Editor (when charging
+interrupted) </li>
+
+<li>
+Time: Improvement to 12-hour setting. Input contains now 4 digits in year
+in Russian Time/Date. Russian Date is with a colon instead of a dot </li>
+
+<li>
+Reminder: Calendar date corrected on receiving end. Now DISPLAY TEXT with
+the option 'wait for user to clear text' waits for user to clear the text
+(earlier it was cleared automatically after 5 sec.) </li>
+
+<li>
+Display Text length increased (it was too short for Send SS) </li>
+
+<li>
+General vibration level increased to make it easier to feel that the vibra
+function has been activated</li>
+
+<li>
+NITZ: (Automatic update of time/date) Time set, even if the user hasn't
+activated and set the clock </li>
+
+<li>
+SIM ATK: Refresh command no longer jams the keypad. Selectable header in
+SIM ATK menu has been removed</li>
+</ul>
+
+<hr WIDTH="50%">
+<br><b><font color="#FF6666">WARNING: IF YOU GIVE YOUR PHONE TO SERVICE
+FOR REPLACING FIRMWARE, DELETE ALL VOICE TAGS FROM ITS' MEMORY. IN OTHER
+CASE YOU CAN LOST THIS PLACE IN PHONE'S MEMORY. EXAMPLE: IF YOU HAD 2 VOICE
+TAGS IN MEMORY, WHEN PHONE WAS GIVEN TO SERVICE, AFTER REPLACING FIRMWARE
+YOU CAN HAVE ONLY 6 PLACES (NOT 8) FOR VOICE TAGS.</font></b>
+<p>Phone doesn't work correctly with some SAT (SIM Application Toolkit)
+SIM cards. I don't know, if problem depends on phone or these SIM cards
+bugs.... If I have correctly info, users of Polish Plus GSM (260-01) network
+with SIM cards with HRL 91 should change them...
+<p>Note: When use shortcut for <b>Menu 8-1, Menu 8-2</b>, <b>Menu 8-3,
+Menu 8-4,</b> <b>Menu 8-6</b>, for a moment displays incorrect data...
+<p>Interesting facts: firmware seems to be cut version of firmware from
+more expensive phones. There still some help texts inside, texts from some
+functions (does it mean, that phone support them ?) - ("Rename this set"-
+it can be done via cable !), texts from "full" calendar ("Meeting", "Birthday",
+etc.), texts "Save to another memory?, Saved to phone memory,Saved to SIM
+Card","List of own numbers" (update: own numbers memory is available via
+cable)...</td>
+</tr>
+
+<tr>
+<td><a NAME="3330"></a>3330</td>
+
+<td>NHM-6</td>
+
+<td>*#0000#</td>
+
+<td>350150</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V2.49 19-03-01
+<br>V3.05 05-04-01
+<p>BUG:
+<ul>
+<li>
+when have more than 3 voice tags, during using this function (voice dialling)
+phone hangs and resets</li>
+
+<li>
+Games:</li>
+
+<ul>
+<li>
+If you try to download (via wap) new "game levels". The problem is
+that after it phone do not display the "ranking list" of "snake2" and/or
+"space impact". Problem appeared after downloading new "labirints" and
+"new mission". When you try to download the same mission (promo 1, gratis)
+after it. Result was the phone always don't display the ranking list and
+also "space impact" don't run. "Bumper" runs ok.</li>
+
+<li>
+Snake, if you reach an high level of scoring, when you select "continue"
+the phone go locked.</li>
+</ul>
+
+<li>
+"ascending" attribute doesn' t work</li>
+
+<li>
+bug connected with assigning ringtones: when I changed a name with a specific
+ringtone, and I look at other names I see that also some one other name
+was changed the ringtone. The I changed back this second name to original
+ringtone, and also the first came back to original ring tone. It
+seems that you can change a ringtone for a specific position number, that
+is in use simultaneously in use in SIM and Phone memory, without possibility
+to distinguish them.</li>
+</ul>
+V3.10 12-05-01
+<p>Inprovements in Voice Tags
+<p>BUG removed: when trying to write a message with an uppercase accented
+character (i.e. character <?>) and saving SMS without sending
+it, then entering "Own messages" the charater <?> become an <E>.
+To solve this use "left accent" insetad of right accent. (Ú) instead of
+(À).
+<p>BUG: if I set the alarm clock, phone "reset" (it go off and then on).
+in about 20% when alarm clock ring, and I press a key, phone go OFF, and
+when I tryed to go ON it ask the calendar date.
+<p>V3.12
+<p>Changed operator names
+<p>Problems with games: snake, if you start a game and you exit from menu
+when you return to the game you don't find ther item "continue" but only
+a "new game".
+<p>V4.12
+<br>
+<ul>
+<li>
+Languages:</li>
+
+<ul>
+<li>
+General update of Dictionary in all languages</li>
+
+<li>
+New T9-languages: Check and Polish</li>
+
+<li>
+New UI-language: Ukrainian (no T9 input)</li>
+
+<li>
+In German language: Translation of 'Highscore' corrected</li>
+</ul>
+
+<li>
+Composer:</li>
+
+<ul>
+<li>
+Vibrating in Composer stops when receiving an SMS</li>
+
+<li>
+Vibra active when composing a ringing tone</li>
+
+<li>
+Not possible to forward received ringing tones anymore</li>
+</ul>
+
+<li>
+Phonebook</li>
+
+<ul>
+<li>
+It is now possible to erase all entries (earlier phone wrote "memory deleted"
+and didn't erase it)</li>
+
+<li>
+Mixed case multitap ('Abc') in phonebook implemented</li>
+
+<li>
+Alphabetic sorting order corrected when spaces in the beginning of a name</li>
+
+<li>
+Search in Phonebook now starts from the top</li>
+
+<li>
+Leading blanks ignored in sorting</li>
+</ul>
+
+<li>
+Dictionary/SMS/Picture Messaging</li>
+
+<ul>
+<li>
+Phone reset sending Picture Message + 120 char text corrected</li>
+
+<li>
+C-key no longer deletes all SMS if used twice in the end of a long SMS</li>
+
+<li>
+'Insert word' works without adding spaces</li>
+
+<li>
+'Insert symbol' will be placed at cursor position</li>
+</ul>
+
+<li>
+WAP</li>
+
+<ul>
+<li>
+Over The Air settings can now be saved and viewed</li>
+
+<li>
+Freeze/reset using WAP combined with FDN corrected</li>
+
+<li>
+Blank menu removed</li>
+
+<li>
+#-key press: stays in WAP-session</li>
+
+<li>
+Layout updated several places</li>
+
+<li>
+After saving bookmark phone now returns to idle state</li>
+</ul>
+
+<li>
+USSD</li>
+
+<ul>
+<li>
+Never ending request (spinning globe) corrected</li>
+
+<li>
+Connection timeout problem fixed</li>
+
+<li>
+Memory leak fixed</li>
+
+<li>
+Bearer setting "Address Type" removed</li>
+</ul>
+
+<li>
+Games</li>
+
+<ul>
+<li>
+Now it is possible to download games</li>
+
+<br>WML page replies with "Download failed" if there is an error</ul>
+
+<li>
+SIM ATK</li>
+
+<ul>
+<li>
+SIM ATK opened for WAP (send and receive SMS etc.)</li>
+
+<li>
+Now showing more than only first error message</li>
+
+<li>
+Clear key is now working properly in Play Tone</li>
+</ul>
+
+<li>
+Voicetag feature improved: 8 voicetags possible</li>
+
+<li>
+Screensaver selection improved</li>
+
+<li>
+Exchange rate now done with higher precision in Calculator</li>
+
+<li>
+In Shortcut, missing functionality in Reminder and Tone menu implemented</li>
+
+<li>
+Operator Name List and UI Text updated</li>
+</ul>
+BUG: If you are playing with "space impact", and a new SMS come in,
+and you try to read it, when you continue the game after the 1st startship
+lost, the game go on but without the starship.
+<p>V4.16 25-06-01
+<ul>
+<li>
+Operator Name List and UI Text updated</li>
+
+<li>
+Service indicator was missing totally with some new SIM-cards</li>
+</ul>
+V4.30 20-08-01 (ROM6?):
+<ul>
+<li>
+New features implemented</li>
+
+<ul>
+<li>
+Conference Call</li>
+
+<li>
+T9 in WAP - Based on CUI editors</li>
+
+<li>
+Languages:</li>
+
+<ul>
+<li>
+Chinese (T9 support)</li>
+
+<li>
+Czech (T9 support)</li>
+
+<li>
+<font color="#000000">Polish (T9 support)</font></li>
+
+<li>
+Hebrew (T9 support)</li>
+
+<li>
+Hungarian (T9 support)</li>
+
+<li>
+Slovak (T9 support)</li>
+
+<li>
+Ukrainian (no T9 support)</li>
+</ul>
+</ul>
+
+<li>
+Improvement to Phonebook</li>
+
+<ul>
+<li>
+Matching the dialled phone number containing special character "+" is now
+possible</li>
+</ul>
+
+<li>
+Improvements to SMS</li>
+
+<ul>
+<li>
+when changing T9 language</li>
+
+<li>
+under Message Write it is now possible to write in Insert Word more than
+one capital letter</li>
+
+<li>
+SMS Input indicator changed (showed '123' after Send cancellation)</li>
+
+<li>
+when receiving SMS containing special set-up</li>
+</ul>
+
+<li>
+Improvements to Tones</li>
+
+<ul>
+<li>
+possibility to save received OTA ringing tone</li>
+</ul>
+
+<li>
+in Profile menu Use of Warnings Tones changed</li>
+
+<li>
+Improvements in charging (using ACP-7U in 110V/60Hz environment)</li>
+
+<li>
+Improvements to Russian WML (Random Phone texts were shown)</li>
+
+<li>
+SIM ATK: Selectable Header (menu_display_item) removed</li>
+
+<li>
+Improvements to Activating/Deactivating of Cell Broadcast</li>
+
+<li>
+Emergency dialling snooze; softkey text appears changed from 'Clear' to
+'Call'</li>
+
+<li>
+Operator Name list (#42) and UI Text updated</li>
+</ul>
+V4.50:
+<ul>
+<li>
+Improvements to WAP</li>
+
+<ul>
+<li>
+Word wrapping default is active ('On')</li>
+
+<li>
+Input element indicator set up for numeric element dialog box added</li>
+</ul>
+
+<li>
+Improvements to Phonebook:</li>
+
+<ul>
+<li>
+Possible to edit/add/replace name/number in phonebook when SIM card memory
+is full</li>
+
+<li>
+Blank screen not shown anymore when replacing an entry and SIM card memory
+is full</li>
+
+<li>
+Scrolling Phonebook entries with leading spaces possible for Latin as well
+for Chinese names</li>
+
+<li>
+Missing information note added when copying entries between SIM and Phone
+memory (Security level: Memory)</li>
+
+<li>
+Possible to add new entries in Phonebook when FDN is no (.but not to dial)</li>
+
+<li>
+Erase all entries in Phonebook will continue in background when interrupted
+by a MT call</li>
+</ul>
+
+<li>
+Improvement to Dictionary/SMS</li>
+
+<ul>
+<li>
+Possible to save/view/send SMS containing only one character</li>
+
+<li>
+Reminder sending; Correct Calendar date on receiving end (e.g. NPE-3)</li>
+
+<li>
+Picture message: Euro-sign in message received successfully on other phones</li>
+
+<li>
+Stop Watch and Unit Price Editor: Correct alignment in editors (when charging
+interrupted)</li>
+</ul>
+
+<li>
+General vibration level increased, in order to make it easier to feel the
+vibra function has been activated</li>
+
+<li>
+Possibility for user, to delete SIM-created SMS from Inbox, added (if deleted
+SIM will recreate the items)</li>
+
+<li>
+Display Text length changed (it was too short for Send SS)</li>
+
+<li>
+Change Phone Line (with #) is now only possible from Idle</li>
+
+<li>
+DISPLAY TEXT with the option 'wait for user to clear text' now waits for
+user to clear text (was cleared automatically after 5 sec.)</li>
+
+<li>
+Operator Name list (#44) updated</li>
+</ul>
+
+<hr WIDTH="50%">
+<br>Note: When use shortcut for <b>Menu 8-3</b>, for a moment displays
+incorrect data...
+<p><b><font color="#FF6666">WARNING: THERE IS PROBABLY THE SAME PROBLEM
+WITH VOICE TAGS AND UPGRADING FIRMWARE LIKE IN NOKIA 3310</font></b></td>
+</tr>
+
+<tr>
+<td><a NAME="3350"></a>3350</td>
+
+<td>NHM-9</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4"></td>
+</tr>
+
+<tr>
+<td><a NAME="3390"></a>3390</td>
+
+<td>NPB-1</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V7.03 10-11-00
+<br>V7.05 05-01-01
+<br>
+<hr WIDTH="50%">
+<br><b><font color="#FF6666">WARNING: THERE IS PROBABLY THE SAME PROBLEM
+WITH VOICE TAGS AND UPGRADING FIRMWARE LIKE IN NOKIA 3310</font></b></td>
+</tr>
+
+<tr>
+<td><a NAME="#3810"></a>3810</td>
+
+<td>NHE-9</td>
+
+<td>*#3810#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V6.20 21-03-97
+<br>V6.32 06-06-97
+<br>V6.61 19-08-97</td>
+</tr>
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center><p>Here is table describing firmware in various Nokia 5xxx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#5110"></a>5110</td>
+
+<td>NSE-1</td>
+
+<td>*#0000#</td>
+
+<td>449218, 490520, 490542, 490546, 490547 (Germany), 490549 (Germany),
+490550 (Germany)</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.02 06-02-98
+<br>V3.06 04-03-98 (ROM3)
+<br>V4.51 26-03-98 (ROM3)
+<br>V4.59 01-06-98 (ROM3)
+<br>
+<ul>
+<li>
+Phone goes crazy if you scroll the received SMS with 160 dots.</li>
+
+<br>Telefon wariuje przy przewijaniu odebranego SMSa zawieraj±cego 160
+kropek.
+<li>
+Phone clears "Headset" text from display after disconnecting HF.</li>
+
+<br>Telefon kasuje napis "Mikrozestaw" z wy¶wietlacza po od³±czeniu zestawu
+s³uchawkowego.
+<li>
+<a href="../netmon/faq_net1.htm#HR">Half Rate</a> codes (<b>#HRC0#</b>
+and <b>*HRC0#</b>) don't work - to enable this channel you have to use
+WinTesla or other software</li>
+
+<br>Nie dzia³aj± kody do obs³ugi <a href="../netmon/faq_net1.htm#HR">Half
+Rate</a> (<b>#HRC0#</b> i <b>*HRC0#</b>) - do w³±czenia tego kana³u trzeba
+u¿yæ np. WinTesli albo innego oprogramowania</ul>
+
+<p><br>V4.62 14-08-98 (ROM3)
+<p>V5.04 14-09-98 (ROM3)
+<br>
+<ul>
+<li>
+<b>**04*pin*pin*pin#</b> code doesn't work</li>
+
+<br>Kod <b>**04*pin*pin*pin#</b> nie dzia³a
+<li>
+Added <a href="../netmon/faq_net5.htm#Menu89">test 89 in NetMonitor</a>.</li>
+
+<br>Dodano <a href="../netmon/faq_net5.htm#Menu89">test 89 w monitorze
+sieci</a>.
+<li>
+4 lines with parameters in <a href="../netmon/faq_net2.htm#Menu2">test
+2 in NetMonitor</a> (earlier there were 2 only there).</li>
+
+<br>4 linijki z parametrami w <a href="../netmon/faq_net2.htm#Menu2">te¶cie
+2 monitora sieci</a> (wcze¶niej by³y tam tylko dwie).
+<li>
+Added <b>*#sim0clock#</b> code</li>
+
+<br>Dodano kod <b>*#sim0clock#</b></ul>
+V5.07 22-11-98 (ROM3)
+<br>V5.07 20-11-98 (ROM4 ?)
+<br>
+<ul>
+<li>
+New 'Text version' parameter in <a href="../netmon/faq_net5.htm#Menu89">test
+89 of NetMonitor</a></li>
+
+<br>Nowy parametr 'Text version' w <a href="../netmon/faq_net5.htm#Menu89">te¶cie
+89 monitora sieci</a>
+<li>
+<a href="../netmon/faq_net2.htm#CCCH">CCCH channel</a> always used, when
+network doesn't support cell broadcasting (in V5.04 <a href="../netmon/faq_net2.htm#CBCH">CBCH
+channel</a> was used with enabled "Info service"or "Cell info display"
+options)</li>
+
+<br>U¿ywany jest zawsze <a href="../netmon/faq_net2.htm#CCCH">kana³ CCCH</a>,
+gdy sieæ nie obs³uguje nadawania komórkowego (w wersji 5.04 u¿ywany by³
+<a href="../netmon/faq_net2.htm#CBCH">kana³
+CBCH</a> po w³±czeniu opcji "Info service" albo "Cell info display")
+<li>
+When you set "Incoming call alert" to "Ascending" and "Ringing volume"
+to higher volume than 2, phone correctly changes volume from volume 1 to
+set (previously it changed it only one level)</li>
+
+<br>Przy ustawieniu "Sygna³ nadej¶cia po³±czenia" na "Rosn±co" i "G³o¶no¶æ
+dzwonka" na wiêcej ni¿ poziom 2, telefon poprawnie zmienia g³o¶no¶æ od
+poziomu 1 do ustawionego (wcze¶niej zmienia³ j± tylko o jeden poziom)
+<li>
+LAC and CID in <a href="../netmon/faq_net3.htm#Menu11">test 11 in NetMonitor</a>
+are in decimal format.</li>
+
+<br>LAC i CID w <a href="../netmon/faq_net3.htm#Menu11">te¶cie 11 monitora
+sieci</a> s± podawane dziesiêtnie.
+<li>
+Newer versions(?):</li>
+
+<ul>
+<li>
+set profile to "Silent"</li>
+
+<li>
+reset phone settings via cable</li>
+
+<li>
+Phone will display "silent" mark on display with "Personal" profile selected...</li>
+</ul>
+</ul>
+
+<p><br>V5.10 23-12-98 (ROM3)
+<br>V5.11 19-02-99 (ROM3)
+<br>V5.11 18-02-99 (ROM4)
+<p>(OLDER ?) Different meaning of Product Profile Settings - can't change
+LCD Contrast
+<br>(STARSZE ?) Inne znaczenie Product Profile Settings - nie mo¿na zmieniæ
+kontrastu LCD
+<p>V5.20 03-06-99 (ROM4)
+<br>V5.22 01-07-99 (ROM3)
+<br>V5.24 09-09-99 (ROM3)
+<br>V5.24 03-09-99 (ROM4)
+<br><!--
+Ringtones names changed: from "Polka" to "Polska", from "Knock knock" to "Knock again", from
+ "Tango" to "Tangoed", from 'Lamb' to 'Marry'
+ Zmiany nazw dzwonków: "Polka" na "Polska", "Knock knock" na "Knock again", 'Tango" na
+ 'Tangoed", 'Lamb' na 'Marry'
+-->
+<br>(NOWSZE TE¯ ?) B£¡D: Niedok³adne t³umaczenie w <b>Menu 1-7-2</b> i
+<b>Menu
+1-4-1</b>
+<p>(NEWER TOO ?) OTHER: This phone has working clock with date and interesting
+thing is, that you can't set date from menu (you have to use gnokii)
+<br>(NOWSZE TE¯ ?) INNE: Telefon ma poprawnie dzia³aj±cy zegar z dat±,
+przy czym daty nie mo¿na ustawiæ z menu (ale np. przy pomocy gnokii)
+<p>(NEWER TOO ?)ALARM BUGS:
+<ol>
+<li>
+first:</li>
+
+<ol>
+<li>
+set alarm</li>
+
+<li>
+disable phone</li>
+
+<li>
+when phone will alarm you, press "Snooze"</li>
+
+<li>
+enable phone, until will alarm you again (6 minutes)</li>
+
+<li>
+don't see "Snooze active" and alarm sign on the screen !</li>
+</ol>
+
+<li>
+when you're in the menu, alarm will enable, you will hear sound, but won't
+see any info ! When leave menu, will see message, but without sound...</li>
+
+<li>
+when keypad is locked and phone alarm you, you can disable it using 1-9,
+*, 0, # keys</li>
+</ol>
+V5.26 15-12-99 (ROM4)
+<br>V5.27 04-02-00 (ROM3)
+<br>V5.27 03-02-00 (ROM4)
+<p>Added code <b>*#7760#</b> for displaying Production Serial Number.
+<br>Dodano kod <b>*#7760#</b> do pokazywania numeru seryjnego.
+<p>V5.28 17-04-00 (ROM3 ?)
+<br>V5.28 18-02-00 (ROM4)
+<p>Can't open simlocks using NokiaTool only - must use EEPROM method
+<p>Added info new new GSM operators. For example:
+<br>Dodano identyfikatory nowych operatorów. Na przyk³ad:
+<p>ERONET, Mobilis, WATANIYA, K`CELL, LAO GSM, EMTEL, DHIMOBILE, Celtel,
+JAWWAL, CELLTEL, Swazi-MTN, TT, ZANTEL, DIGITEL, ECONET
+<p>Changes names for some GSM operators. For example:
+<br>Zmieniono nazwy niektórych operatorów. Na przyk³ad:
+<br>D1-TELEKOM ==> T-D1
+<br>D2 PRIVAT ==> D2
+<br>MaxTouch ==> Orange
+<br>SENTELgsm ==> SENTEL
+<br>HK TELECOM ==> C&W HKT
+<p>(NEWER TOO ?) BUG:When edit long SMS (about 160 chars) and press Up/Down
+key very long (until will scroll all SMS context - 160 chars) without releasing,
+phone will restart after it - info from SkyBoy
+<br>(NOWSZE TE¯ ?) B£¡D: Przy edycji d³ugiego SMSa (oko³o 160 znaków) po
+naci¶niêciu klawisza Góra/Dó³ i przytrzymaniu (bez zwalniania), a¿ ca³y
+SMS (160 znaków) zostanie przewiniêty, telefon zresetuje siê... -
+informacja od SkyBoy
+<p>V5.29 24-07-00 (ROM4)
+<br>MT Unicode USD activated
+<p>GSM operators field updated:
+<br>Uaktualnione nazwy operatorów:
+<br>CT-GSM ==> CMCC
+<br>LIBTEL ==> LIBERTEL
+<p>V5.30 28-09-00 (ROM4)
+<p>GSM operators field updated
+<br>Uaktualnione nazwy operatorów
+<p>(V5.07) "SIM card registration failed" message is shown when the SIM
+card or phone is unknown or rejected from the network.
+<br>(V5.07) Komunikat "Rejestracja karty SIM nieudana" , gdy karta SIM
+lub telefon nie mo¿e byæ zalogowany w sieci
+<br>
+<hr WIDTH="50%">
+<br>BUG (all versions ?): some SMS on SIM in Outbox can hang phone, when
+try to read them (checked for N5110). Example (mygnokii can be download
+from my www): try to use "<i>mygnokii --savesms "test" --hangsms < file"</i>
+and read saved SMS
+<p>Interesting facts: firmware seems to be cut version of firmware from
+more expensive phones. There still some help texts inside, texts from some
+functions (does it mean, that phone support them ?) - ("Anykey answer",
+"Rename this set"- it can be done via cable !), text with name of "full"
+profiles - the same question (Meeting, Outdoor, Pager, General), texts
+"Save to another memory?, Saved to phone memory,Saved to SIM Card"...</td>
+</tr>
+
+<tr>
+<td><a NAME="5110i"></a>5110i</td>
+
+<td>NSE-2</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4"></td>
+</tr>
+
+<tr>
+<td><a NAME="#5130"></a>5130</td>
+
+<td>NSK-1</td>
+
+<td>*#0000#</td>
+
+<td>495503, 495508, 495509, 449210</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.08 03-04-98
+<br>V4.11 12-06-98
+<br>V5.00 01-09-98
+<br>V5.30 23-04-99
+<br>V5.51 03-08-99
+<br>V5.60 14-10-99
+<br>V5.71 10-04-00
+<br>
+<hr WIDTH="50%">
+<br>Interesting facts: firmware seems to be cut version of firmware from
+more expensive phones. There still some help texts inside, texts from some
+functions (does it mean, that phone support them ?) - ("Anykey answer",
+"Rename this set"- it can be done via cable !), text with name of "full"
+profiles - the same question (Meeting, Outdoor, Pager, General), texts
+"Save to another memory?, Saved to phone memory,Saved to SIM Card"...</td>
+</tr>
+
+<tr>
+<td><a NAME="#5160"></a>5160</td>
+
+<td>NSW-1</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.47 15-07-99</td>
+</tr>
+
+<tr>
+<td><a NAME="#5190"></a>5190</td>
+
+<td>NSB-1</td>
+
+<td>*#5190#</td>
+
+<td>010063</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.41 07-02-98
+<br>V4.01 22-10-98
+<br>V5.01 02-11-98
+<p>V5.24
+<p><a href="../netmon/faq_net0.htm">NetMonitor</a> in <b>Menu 11 </b>(in
+older firmware in <b>Menu 10</b>).
+<br><a href="../netmon/faq_net0.htm">Monitor sieci</a> w <b>Menu 11</b>
+(w starszych wersjach w <b>Menu 10</b>).
+<p>V5.51 15-04-99
+<br>V5.81 20-09-99
+<p>Downloadable operator logo and ringtone
+<p>V6.11 28-04-00
+<p>V6.71 25-01-01</td>
+</tr>
+
+<tr>
+<td><a NAME="5210"></a>5210</td>
+
+<td>NSM-5</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.12 17-01-02
+<br>V5.13 27-01-02</td>
+</tr>
+
+<tr>
+<td><a NAME="5510"></a>5510</td>
+
+<td>NPM-5</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.43
+<ul>
+<li>
+Silence or annoying beep is removed, when starting player for the first
+time through menus. </li>
+
+<li>
+Improvement to headset connection timeout. (In some cases when recording
+had started from FM radio and then headset was removed, recorder should
+have stopped after three minutes, but it crashed). </li>
+
+<li>
+Language package M (Tagalog, Bahasa Indonesian, Bahasa Malaysian) added. </li>
+</ul>
+V3.45 04-12-01
+<p>V3.47
+<ul>
+<li>
+Improvements in Calculator. Dot is now handled in proper way, when setting
+exchange rates </li>
+
+<li>
+Line-in recording functionality has been improved </li>
+
+<li>
+Sometimes audio was not switched to phone's earpiece, if headset was removed
+during a phone call </li>
+
+<li>
+Music player did not always restart after a call was initiated and then
+ended </li>
+
+<li>
+Unplugging headset during a phone call turns now music player on Pause </li>
+
+<li>
+FDN now allows all calls to be made from FDN phonebook</li>
+
+<li>
+Improvements in showing Cl@ss 0 SMS messages </li>
+
+<li>
+USSD with more than 30 digits is now possible </li>
+
+<li>
+STK "Refresh" command improved </li>
+</ul>
+</td>
+</tr>
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center><p>Here is table describing firmware in various Nokia 60xx/61xx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#6050"></a>6050</td>
+
+<td>NME-1</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#6080"></a>6080</td>
+
+<td>NME-2</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.14 03-03-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#6081"></a>6081</td>
+
+<td>NME-2E</td>
+
+<td>*#170602112302#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.14 03-03-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#6090"></a>6090</td>
+
+<td>NME-3</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.00 30-11-99</td>
+</tr>
+
+<tr>
+<td><a NAME="#6110"></a>6110</td>
+
+<td>NSE-3</td>
+
+<td>*#0000#</td>
+
+<td>490518, 490523, 490526, 490527, 490545</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.11 14-11-97
+<br>V3.14 28-11-97
+<p>First shipping version of the software.
+<br>Pierwsza wersja oprogramowania w sprzedawanych telefonach.
+<p>V4.05 07-01-98
+<br>V4.06 16-01-98
+<br>V4.25 01-01-98
+<br>V4.33 11-03-98 (ROM3)
+<p>Improves the reception quality.
+<br>Poprawiona jako¶æ odbioru.
+<p>SMS message alert volume now linked to ringing volume.
+<br>G³o¶no¶æ sygna³u SMS po³±czona z g³o¶no¶ci± dzwonka.
+<p>Minor changes in Profiles menu.
+<br>Niewielkie zmiany w menu profili.
+<p>'Long & Loud' SMS alert is now called 'Ascending'
+<br>D¼wiêk dzwonka SMS 'Long & Loud' zmieniony na 'Ascending'
+<p>'Warning Tones' is now 'Warning and Games Tones'
+<br>'Warning Tones' zmienione na 'Warning and Games Tones'
+<p>The 'No Service' areas between cells seem to have disappeared.When the
+phone does go 'No Service', it will very quickly log onto a new cell, usually
+within a few seconds.
+<br>Telefon szybciej siê loguje do nowej komórki po odzyskaniu zasiêgu.
+<p>The desktop charger now works correctly when the phone is inserted with
+the battery connected.
+<br>£adowarka biurkowa pracuje poprawnie, gdy pod³±czany jest do niej telefon
+z w³o¿on± bateri±.
+<p>BUG: Nokia Cellular Data Suite 1.2 (NCDS) infra red function has now
+gone intermittent. This has been confirmed this by using a V3.14 phone
+which works perfectly with the installed version of the NCDS. Basically
+if I connect the phone using the RS232 cable the NCDS works fine. If you
+then disconnect and re-connect using IR, also no problem. If you then disconnect
+and re-connect a 2nd time using IR you get no connection. The IR symbol
+on the phone flashes, then goes static, then flashes again.
+<br>B£¡D: Po³±czenie przez podczerwieñ z NCDS 1.2 nie dzia³a dobrze (podczas
+gdy w telefonem z oprogramowaniem 3.14 nie ma problemów), natomiast po³±czenie
+kablem ci±gle funkcjonuje bez zarzutu. Je¿eli od³±czysz i po³±czysz ponownie
+podczerwieñ, nie ma problemu. Je¿eli próbujesz natomiast jeszcze raz, problem
+siê pojawia. Symbol podczerwieni w telefonie mruga, pó¼niej wy¶wietla siê
+na sta³e i znów mruga.
+<p>V4.51 26-03-98 (ROM3)
+<br>V4.59 01-06-98 (ROM3)
+<br>V4.73 22-04-98 (ROM3)
+<p>(V4.06) Correct call counters (Received+Dialled calls=All calls)
+<br>(V4.06) Poprawne liczenie d³ugo¶ci po³±czeñ (Odbierane+Wykonywane po³±czenia=Wszystkie)
+<p>(V4.33) IR-Software improved
+<br>(V4.33) Poprawnione oprogramowanie do obs³ugi IR
+<p>(V4.33) Charger recognition improved.
+<br>(V4.33) Poprawiono rozpoznawanie ³adowarek.
+<p>(V4.33) Headset features improved.
+<br>(V4.33) Poprawiono obs³ugê zestawu s³uchawkowego.
+<p>(V4.33) Same standard SMS alert as 8110i.
+<br>(V4.33) Niektóre d¼wiêki SMSów jak w Nokii 8110i.
+<p>(V4.33) Better energy saving functions.
+<br>(V4.33) Lepsze funkcje oszczêdzania energii.
+<p>(V4.33) Better conference call features.
+<br>(V4.33) Poprawiono obs³ugê po³±czeñ konferencyjnych.
+<p>(V4.33) Better SMS status report.
+<br>(V4.33) Lepsze raporty SMS.
+<p>(V4.33) Display of saving status (phone or SIM).
+<br>(V4.33) Wy¶wietlanie statusu zapisu (telefon albo karta SIM).
+<p>(V4.33) HFU-2 improved.
+<br>(V4.33) Poprawiona obs³uga zestawu samochodowego HFU-2.
+<p>(V4.33) Better charging with standard, car charger and "cold" battery.
+<br>(V4.33) Lepsze ³adowanie ze standardow± albo samochodow± ³adowark±
+i zimn± bateri±.
+<p>(V4.33) Faster network connection.
+<br>(V4.33) Szybsze po³±czenie z sieci±.
+<p>(V4.33) Safer network connection at a low signal strength.
+<br>(V4.33) Bezpieczniejsze po³±czenia z sieci± na obszarach o s³abym sygnale.
+<p>(V4.33) Longer single ringtone with vibra pack.
+<br>(V4.33) D³u¿szy sygna³ d¼wiêkowy przy u¿ywaniu baterii wibracyjnej.
+<p>(V4.33) Corrected the problem of the battery indicator bar flickering
+between one and two bars with a Li-ion battery.
+<br>(V4.33) Poprawiono problem ze wska¼nikiem poziomu na³adowania baterii
+(wcze¶niej przy baterii Li-ion miga³ pomiêdzy jedn± i dwoma kreskami)
+<p>(V4.33) No more changing <a href="../netmon/faq_net1.htm#HR">Half Rate</a>
+settings via keypad.
+<br>(V4.33) Nie dzia³aj± kody do aktywacji/deaktywacji kana³ów <a href="../netmon/faq_net1.htm#HR">Half
+Rate</a> z klawiatury.
+<p>(V4.33) Improved audio quality when using the <a href="../netmon/faq_net1.htm#EFR">EFR
+Speech Codec</a>.
+<br>(V4.33) Lepsza jako¶æ d¼wiêku przy u¿ywaniu <a href="../netmon/faq_net1.htm#EFR">EFR</a>.
+<p>(V4.33) Reception of CCH blocks after cell reselection in weak field
+has been improved.
+<br>(V4.33) Poprawiono odbiór bloków CCH po powtórnym wyborze komórki na
+obaszrach o s³abym sygnale.
+<p>(V4.33) Improved the maintenance charging when using the ACP-7 charger.
+<br>(V4.33) Poprawione ³adowanie podtrzymuj±ce z ³adowark± ACP-7.
+<p>(V4.33) More frequent battery low warning beeps added during a call
+made with a Li-ion battery.
+<br>(V4.33) Czêstsze ostrze¿enia o wy³adowaniu baterii przy po³±czeniu
+i baterii Li-ion.
+<p>(V4.33) Improved SMS storage time handling. If the user has not selected
+a storage time, the phone uses the maximum storage time set by the network.
+<br>(V4.33) Je¿eli uzytkownik nie wybra³ czasu wa¿no¶ci SMSa (przy wysy³aniu),
+telefon przyjmuje maksymaln± warto¶æ przyjmowan± przez sieæ.
+<p>(V4.33) Improved recovery of SIM card in error situations.
+<p>(V4.33) Fixed bug in SMS editing screen where the cursor is one character
+to far right.
+<br>(V4.33) Poprawiono b³±d przy edycji SMSów w sytuacji gdy kursor jest
+odleg³y jeden znak od prawej strony.
+<p>V5.00 28-05-98 (ROM3)
+<p>An updated GSM operators' list.
+<br>Uaktualniona lista operatorów.
+<p>V5.22 18-08-98 (ROM3)
+<p>An updated GSM operators' list.
+<br>Uaktualniona lista operatorów.
+<p>V5.24 19-09-98 (ROM3)
+<br>V5.24 14-09-98 (ROM4)
+<p>Implemented code <b>*#sim0clock#</b> which shows whether the SIM card
+inserted supports clock stopping.
+<br>Dodano kod <b>*#sim0clock#</b> do sprawdzania, czy zegar karty SIM
+mo¿e byæ zatrzymany.
+<p>Headset detection improved.
+<br>Poprawione wykrywanie zestawu s³uchawkowego.
+<p>Performance in weak signal area improved.
+<br>Poprawiono czu³o¶æ przy s³abym sygnale sieci.
+<p>Improvements to short message handling.
+<p>Tone levels tuned (distinct difference now between levels 5 and 4).
+<br>Zmieniono poziomy dzwonków (wyczuwalna ró¿nica miêdzy poziomem 4 i
+5).
+<p>(V4.73) Different energy consumption in <a href="../netmon/faq_net3.htm#Menu23">test
+23 of NetMonitor</a>.
+<br>(V4.73) Inne zu¿ycie energii w <a href="../netmon/faq_net3.htm#Menu23">te¶cie
+23 monitora sieci</a>.
+<p>V5.30 23-12-98 (ROM3)
+<p>An updated GSM operators' list.
+<br>Uaktualniona lista operatorów.
+<p>V5.31 19-02-99 (ROM3)
+<br>V5.31 18-02-99 (ROM4)
+<p>Added <b>Menu 4-3-6</b> ("Active line"), which allows to select active
+line on SIM card (ALS function)
+<br>Dodano <b>Menu 4-3-6</b>, które pozwala wybraæ numer na karcie SIM
+(funkcja ALS)
+<p>An updated GSM operators' list.
+<br>Uaktualniona lista operatorów.
+<p>V5.40 25-05-99 (ROM4)
+<p>V5.47 01-07-99 (ROM3)
+<br>V5.47 30-06-99 (ROM4)
+<p>(OLDER ?) Different meaning of Product Profile Settings - can't change
+LCD Contrast
+<br>(STARSZE ?) Inne znaczenie Product Profile Settings - nie mo¿na zmieniæ
+kontrastu LCD
+<p>Some phones with it (I don't know, if it's connected with firmware version
+or ROM) doesn't have more than 19 menus in <a href="../netmon/faq_net0.htm">NetMonitor</a>
+and some first tests are cut - see <a href="../netmon/faq_net6.htm#20">more</a>
+<p>V5.48 08-09-99 (ROM3)
+<br>V5.48 03-09-99 (ROM4)
+<p>New ringing tones.
+<br>Nowe dzwonki.
+<br>
+<hr WIDTH="50%">
+<br>Note: In very old firmware versions (3.x) you have <a href="../netmon/faq_net3.htm#Menu18">test
+18</a> in <a href="../netmon/faq_net0.htm">NetMonitor</a>. In newer (4.x,
+5.x) it was removed...
+<br>Informacja: W bardzo starych wersjach firmware (3.x) dostêpny by³ <a href="../netmon/faq_net3.htm#Menu18">test
+18</a> w <a href="../netmon/faq_net0.htm">monitorze sieci</a>. W nowszych
+(4.x, 5.x) zosta³ on usuniêty...
+<p>BUG: Some older/all (?) firmware had bug in Calendar in Birthday option:
+it it was set to the last day of February on non-leap-years (for example
+29.02.2000), calendar will inform about it 1'st March (1.03.2000). Must
+use "Reminder" instead of "Birthday".
+<p>BUG: Some older/all (?) firmware had bug: Phone goes crazy if you scroll
+the received SMS with 160 dots.
+<br>B£¡D: Niektóre starsze/wszystkie (?) wersje zawiera³y b³±d: Telefon
+wariuje przy przewijaniu odebranego SMSa zawieraj±cego 160 kropek.</td>
+</tr>
+
+<tr>
+<td><a NAME="#6120"></a>6120</td>
+
+<td>NSC-3</td>
+
+<td>*#6120#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.18 01-07-99</td>
+</tr>
+
+<tr>
+<td><a NAME="#6130"></a>6130</td>
+
+<td>NSK-3</td>
+
+<td>*#9999#</td>
+
+<td>495502</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.26 10-02-98 (ROM3)
+<br>V3.27 18-02-99 (ROM3)
+<br>V3.28 24-02-98
+<br>V3.32 03-04-98 (ROM3)
+<br>V4.11 10-06-98 (ROM3)
+<br>V5.00 08-09-98
+<p>(V4.11) <a href="../netmon/faq_net0.htm">NetMonitor</a> in <b>Menu 11
+</b>(in
+older firmware in <b>Menu 10</b>).
+<br>(V4.11) <a href="../netmon/faq_net0.htm">Monitor sieci</a> w <b>Menu
+11 </b>(w starszych wersjach w <b>Menu 10</b>).
+<p>V5.30 23-04-99 (ROM3)
+<br>V5.30 23-04-99 (ROM4)
+<br>V5.60 14-10-99 (ROM3)
+<br>V5.61 22-11-99 (ROM3)
+<br>
+<hr WIDTH="50%">
+<br>BUG: Some older/all (?) firmware had bug in Calendar in Birthday option:
+it it was set to the last day of February on non-leap-years (for example
+29.02.2000), calendar will inform about it 1'st March (1.03.2000). Must
+use "Reminder" instead of "Birthday".</td>
+</tr>
+
+<tr>
+<td><a NAME="#6138"></a>6138</td>
+
+<td>NSK-3</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#6150"></a>6150</td>
+
+<td>NSM-1</td>
+
+<td>*#0000#</td>
+
+<td>449208 (Finland), 493002, 493006 (Germany), 493009</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.02 08-07-98
+<br>V3.06 10-08-98
+<br>V4.01 23-09-98
+<br>V4.02 01-10-98
+<br>V4.11 05-11-98
+<br>V4.12 02-12-98
+<p>Added corect recognizing phase 2+ SIM cards.
+<br>Dodano poprawne rozpoznawania karty SIM fazy 2+ GSM.
+<p>V4.13 16-12-98
+<p>BUG: Calling <b>Menu 10-3</b> causes the phone to hang and you will
+have to remove the battery.
+<br>B£¡D: Wywo³anie <b>Menu 10-3</b> zawiesza telefon (pomaga dopiero wypiêcie
+baterii).
+<p>V4.14 18-12-98
+<br>V5.02 02-02-99
+<p>(V4.13) Added <b>Menu 4-4-6</b> ("Confirm SIM service actions") with
+<b>Menu
+4-4-6-1</b> ("Asked") and <b>4-4-6-2</b> ("Not asked") options.
+<br>(V4.13) Dodane <b>Menu 4-4-6 </b>("Powiadomienia o zmianach") z <b>Menu
+4-4-6-1</b> ("Widaæ") i <b>4-4-6-2</b> ("Nie widaæ").
+<p>V5.10 14-06-99
+<br>V5.16 22-06-99
+<p>(V4.13) <a href="../netmon/faq_net0.htm">NetMonitor</a> in <b>Menu 12
+</b>(in
+older firmware in <b>Menu 11</b>) - you have SIM Services (SIM Application
+Toolkit) in <b>Menu 11</b>.
+<p>V5.17 01-07-99
+<br>V5.20 20-09-99
+<p><a href="../netmon/faq_net0.htm">NetMonitor</a> in <b>Menu 13 </b>(in
+older firmware in <b>Menu 12</b>). <b>Menu 12</b> seems to be used for
+something called LifeChart or WellMate (it seems to be some service connected
+somehow with health - some device connected to phone and measured some
+health parameters ?)
+<p>V5.22 10-11-99
+<p>(V4.13) Better support for some 16kB SIM card with SIM Application Toolkit
+(example: SIM cards from Italian TIM)
+<p>(NEVER TOO ?) BUG: When receiving an over the air ringing tone and selecting
+playback directly, the first tone would be partially cut off during the
+playback (only when the keypad tones were activated)
+<p>Production Serial Number String added (<b>*#7760#</b> code)
+<br>Dodano kod <b>*#7760# </b>do pokazywania numeru seryjnego.
+<p>Calendar birthday reminder, related to the last day of February on non-leap-years,
+will now be set to right day
+<br>Notatki w kalendarzu dotycz±ce urodzin odnosz±ce siê ostatniego dnia
+Lutego w latach nieprzestêpnych jest teraz ustawiany we w³a¶ciwym dniu.
+<p>Improvement to character conversion. Earlier blank display was shown
+when UCS2 type (e.g. Greek characters) of SMS was received.
+<br>Poprawiono konwersjê znaków. Wcze¶niej pokazywany by³ pusty ekran,
+gdy SMS typu UCS2 (np.ze znakami greckimi) zosta³ odebrany.
+<p>Multiple multi-page Cell Broadcast reception improved.
+<br>Poprawiono odbiór wielostronicowych po³±czonych komunikatów nadawanaia
+komórkowego.
+<p>An updated GSM operators' list.
+<br>Uaktualniona lista operatorów.
+<p>(V5.17)Different names ringtone: "Polska" instead of "Polka"...
+<p>V5.23 20-03-00 (except NSM-1NY ORANGE, product code 0502581)
+<br>V5.23 17-05-00 (ROM6?)
+<p>(NEWER TOO ?) BUG:When edit long SMS (about 160 chars) and press Up/Down
+key very long (until will scroll all SMS context - 160 chars) without releasing,
+phone will restart after it - info from SkyBoy
+<br>(NOWSZE TE¯ ?) B£¡D: Przy edycji d³ugiego SMSa (oko³o 160 znaków) po
+naci¶niêciu klawisza Góra/Dó³ i przytrzymaniu (bez zwalniania), a¿ ca³y
+SMS (160 znaków) zostanie przewiniêty, telefon zresetuje siê... -
+informacja od SkyBoy
+<p>Jêzyk polski (wszystkie wersje ?): Niedok³adne t³umaczenie w trzech
+miejscach (Spis tel./Opcje/Stan pamiêci, Spis tel./Wykasuj oraz <b>Menu
+1-6-2</b>) i b³±d (albo rzadko u¿ywana forma) w pomocy do <b>Menu 6</b>
+(....Opcja dwóch graczy wymaga
+<u>dwu</u> telefonów....)
+<p>Partnership network search improved
+<p>"Grande walse" renamed as "Nokia tune"
+<p>(?) "Happy birthday" changed to "Auld lang syne"
+<p>GSM Operator list updated:
+<ul>
+<li>
+New Operators (new countries: LAO (457), MV(472), SZ (653), TN (605)):</li>
+
+<ul>
+<li>
+Operator name -> MNC/MCC</li>
+
+<li>
+ERONET -> 218/03</li>
+
+<li>
+Mobilis -> 624/02</li>
+
+<li>
+WATANIYA -> 419/03</li>
+
+<li>
+K`CELL -> 401/02</li>
+
+<li>
+LAO GSM -> 457/01</li>
+
+<li>
+EMTEL -> 617/10</li>
+
+<li>
+DHIMOBILE -> 472/01</li>
+
+<li>
+Celtel -> 650/10</li>
+
+<li>
+JAWWAL -> 425/05</li>
+
+<li>
+CELLTEL -> 413/03</li>
+
+<li>
+Swazi-MTN -> 653/10</li>
+
+<li>
+TT -> 605/02</li>
+
+<li>
+ZANTEL -> 640/03</li>
+
+<li>
+DIGITEL -> 734/02</li>
+
+<li>
+ECONET -> 648/04</li>
+
+<li>
+Vodafone -> 216/70</li>
+</ul>
+
+<li>
+Operator name changed</li>
+
+<ul>
+<li>
+Old name -> New name</li>
+
+<li>
+D1-TELEKOM -> T-D1 (262/01)</li>
+
+<li>
+D2 PRIVAT -> D2 (262/02)</li>
+
+<li>
+MaxTouch -> Orange (404/20)</li>
+
+<li>
+EMARTEL -> TMTTOUCH (502/13)</li>
+
+<li>
+SENTELgsm -> SENTEL (608/02)</li>
+
+<li>
+GT-BCS -> UA-GT (255/05)</li>
+
+<li>
+HK TELECOM -> C&W HKT (454/00)</li>
+
+<li>
+Blu S.p.A -> I BLU (222/98)</li>
+</ul>
+</ul>
+(V5.22):
+<ul>
+<li>
+can't send group graphic via IrDa -> "Group graphic sending failed" message</li>
+
+<li>
+all profiles displayed (including Car and Headset) in "Profiles" menu</li>
+</ul>
+Info from users: in PL language "Mikrofon wy³±czon" and "Odg³usz"
+<p>VP5.23, 25-09-00
+<br>with animated menus, picture messaging, T9 dictionary.
+<p>Problems with SIM Application Toolkit & netmonitor (tested with
+Italian SIM cards). With:
+<ol>
+<li>
+16k SIM from Wind (called Hi-Wind and working on 1800 Mhz networks only)
+- no services (no menu 10) and netmonitor on 11</li>
+
+<li>
+SIM from Omnitel Pronto Italia (OPI) shows only 9 menus, the 9th being
+Infrared, no netmonitor</li>
+</ol>
+
+<hr WIDTH="50%">
+<br>Some older firmware versions had problems with SMS from <a href="http://www.quios.com">Quios</a>
+(Alphanumeric SMS, I quess): when user tried to read, phone hang and removing/inserting
+battery was necessary.
+<p>Older firmware/all (?) had bug: "Received+Dialled calls" were different
+than "All calls"</td>
+</tr>
+
+<tr>
+<td><a NAME="#6160"></a>6160/6162</td>
+
+<td>NSW-3</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.12 01-02-99
+<br>V3.01 09-07-99
+<br>V3.02 10-12-99</td>
+</tr>
+
+<tr>
+<td><a NAME="#6185"></a>6185/6188</td>
+
+<td>NSD-3AX</td>
+
+<td>*#837#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V430SD3a2.nef 05-18-99
+<br>V440SD3a3.nef 10-26-99
+<br>V441SD3a3.nef 11-12-99
+<br>V542SD3d3.nef 08-02-00
+<br>
+<hr WIDTH="50%">
+<br>BUG: The earpiecie volume isn't the same for different phones:
+<ul>
+<li>
+For 435/441 firmware: If the phone is powered up with the volume set to
+level 10, you end up with markedly lower maximum volume. If the phone is
+powered up with the volume set at level 9 or lower, the maximum volume
+is much louder</li>
+
+<li>
+For 430: You needed to also power up the phone in Field Test Mode to get
+the maximum volume.</li>
+</ul>
+(?) Alpha Tag Menu (seen after *3001#12345# code) is not available ?</td>
+</tr>
+
+<tr>
+<td><a NAME="#6190"></a>6190</td>
+
+<td>NSB-3</td>
+
+<td>*#6190#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.02 06-04-98
+<br>V4.22 01-07-98
+<br>V4.30 19-08-98
+<br>V5.03 09-11-98
+<br>V5.10 14-06-99
+<br>V5.24
+<p><a href="../netmon/faq_net0.htm">NetMonitor</a> in <b>Menu 11 </b>(in
+older firmware in <b>Menu 10</b>).
+<br><a href="../netmon/faq_net0.htm">Monitor sieci</a> w <b>Menu 11</b>
+(w starszych wersjach w <b>Menu 10</b>).
+<p>V5.30
+<p>Support for caller groups logos.
+<br>Wsparcie dla log grupy.
+<p>V5.53 15-04-99
+<p>Custom ringtones and the Startup logo are all now uploadable to the
+phone directly using a data cable.
+<br>W³asne dzwonki i loga startowe mog± byæ teraz bezpo¶rednio wgrywane
+do telefonu przez kabel.
+<p>The max volume is slightler louder than previous
+<br>Maksymalna g³o¶no¶æ jest teraz wiêksza.
+<p>Added <b>Menu 4-3-7</b> (Notifications on SIM update)
+<br>Dodano <b>Menu 4-3-7.</b>
+<p>V5.83 17-09-99
+<p>Added support for operator logo (uploading via cable or general support)
+<br>Dodano obs³ugê loga operatora (mo¿liwo¶æ wgrywania przez kabel albo
+ogóln± obs³ugê)
+<p>V5.93 22-11-99
+<br>V6.13 28-04-00 </td>
+</tr>
+
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center>
+<p>Here is table describing firmware in various Nokia 62xx/63xx/65xx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#6210"></a>6210</td>
+
+<td>NPE-3</td>
+
+<td>*#0000#</td>
+
+<td>350138, 350147, 350612, 449333 (Germany), 449337, 449338</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V2.95 16-02-00
+<br>V3.00 16-08-00
+<br>V3.01 21-08-00
+<p>BUGS (NEWER TOO ?):
+<ol>
+<li>
+Sporadic vibrating during SMS receiving or calling although the vibration
+was switched off</li>
+
+<li>
+Call waiting service (<b>Menu 4-3-4</b>) doesn't work correctly (it should
+"Requests the network to send a beep during a call when another call is
+coming"). When use profile Meeting (with Incoming call alert = Beep once),
+during call can hear beep and phone is vibrating when another call is coming.
+But with another setup of "Incoming call alert" there isn't beep. Only
+on display another call is flashing.</li>
+
+<br>Temporary solution: Callers group have own icons. If you turn off showing
+icons, auditible signaling is OK. Other solution is to put off number from
+caller group
+<li>
+When profile is switched to "Meeting" where is "Incoming call alert" switched
+to "Beep once", don't hear beep during call when battery is low and double
+beep when battery is empty. Phone turn off unawares.</li>
+
+<li>
+When "Delivery reports (1-8-5)" is switched to "on" and phone receives
+a delivery report, menu item "Games-Settings (6-4)" disappears. It is showed
+again when turn off and turn on phone.</li>
+
+<li>
+When keypad is locked and you put phone into carkit, keypad is active.
+When take it from carkit then, it's sometimes locked again, sometimes not.</li>
+
+<li>
+When phone is in the carkit, you can sometimes lock keypad</li>
+
+<li>
+When you take from carkit phone with locked keypad, very often can't unlock
+keypad and you have to restart phone</li>
+
+<li>
+In Polish language in <b>Menu 5</b> ("Call diverts") there two the same
+submenus (3 and 5) "Divert when not answered" with different contenst</li>
+
+<li>
+When for example you received a SMS, when you unlock the phone's keypad,
+you must wait till you see "1 message received" before you can push 'read'.
+Otherwise you'll go to the menu.</li>
+
+<li>
+When you enable cell-info, you won't see any info anymore about which profile
+you're in.</li>
+
+<li>
+Sometimes, when receive SMS and starts to read it, you have info "menu
+contains...." (help for Inbox menu)</li>
+</ol>
+
+<hr WIDTH="50%">
+<br>SOME OLDER VERSIONS HAD BUG: sometimes the phone couldn't show the
+names of the person whose calling eventhough the person's name IS on the
+phonebook. So instead of showing the caller's name the phone was only showing
+"+62.... call"
+<p>BUG (all version ?):
+<ol>
+<li>
+Dropping the last character of the domain name when using relative URLs!
+Example: A link like <i>/cgi-bin/wap_news.pl</i> on a page <i>http://www.wapterror.de/wml/index.wml</i>
+sould be constructed as <i>http://www.wapterror.de/cgi-bin/wap_news.pl</i>.
+Phone makes it <i>http://www.wapterror.d/cgi-bin/wap_news.pl</i> (missing
+e on .de)</li>
+
+<li>
+Can't delete templates of SMS and Picture Images</li>
+
+<li>
+Sometimes, even when vibra is disabled in profile, it enables</li>
+
+<li>
+DTMF doesn't work , when have enabled keypad tones</li>
+
+<li>
+Phone sometimes doesn't want to connect to WAP (message "check settings")</li>
+
+<li>
+If you assigned downloaded ringtone for caller group and deleted if (ringtone)
+from phone, it stops ring and vibrate. Can't change ringtone from phone's
+menu then (must use Logo Manager or different software)</li>
+</ol>
+
+<hr WIDTH="50%">
+<br>V3.04 (16-10-00 ????)
+<ul>
+<li>
+Improved Half Rate audio quality</li>
+
+<li>
+Updated operator list</li>
+</ul>
+V3.08
+<ul>
+<li>
+(V3.04) Improvement to Arabic/Hebrew Memory status layouts</li>
+
+<li>
+(V3.04) Improvements to Voicetags </li>
+
+<li>
+(V3.04) Improvements to SMS </li>
+
+<li>
+(V3.04) Only one indicator is at the end of Selection window when moving
+to second candidate first time in the editing mode</li>
+
+<li>
+(V3.04) Input method indicator in top left corner is disappeared in Rename
+operation </li>
+
+<li>
+(V3.04) DLR-3 is detected as a headset after one headset call </li>
+
+<li>
+(V3.04) UNICODESIM: SDN only names of length less than 8 are shown </li>
+
+<li>
+(V3.04) Improvements to browser setup: \"Menu\" -> \"2\" -> \"Scroll\"
+corrected</li>
+</ul>
+V3.74 22-09-00
+<br>V4.04 06-10-00
+<p>BUG (NEWER TOO ?): Make these steps:
+<ol>
+<li>
+create new folder in Messages/My folders</li>
+
+<li>
+create message and move to this folder</li>
+
+<li>
+enter into this folder</li>
+
+<li>
+edit this message</li>
+
+<li>
+save it</li>
+</ol>
+You can't now enter to any folder. Must restart phone. Note, that bug exist
+only, if this folder is first on the folders' list. For other it's OK.
+<p>V4.08 25-10-00
+<p>V4.27 21-12-00
+<ul>
+<li>
+Turkish, Greek, Czech and <b>Polish</b> T9 added</li>
+
+<li>
+Spanish language and T9 added</li>
+
+<li>
+LCD temperature compensation</li>
+
+<li>
+LCD reset after powerup</li>
+
+<li>
+Spaces couldn't be put in front of text in Dealer Welcome Note (DWN)</li>
+
+<li>
+PIN-code couldn't be entered on a SIM-locked phone</li>
+
+<li>
+It wasn't possible to call a SS string beginning with a "*" (e.g. *#61#
+etc.) stored on the FDN phonebook</li>
+
+<li>
+Setup Menu command was not executed when already in SIM ATK menu</li>
+
+<li>
+SIM ATK minimum polling interval increased from 5 to 10 sec</li>
+
+<li>
+Improvements when trying to enter username in HTTP authentication</li>
+
+<li>
+Dynamic text case handling improved</li>
+
+<li>
+OPERATOR_NAME_MAX_LENGTH changed from 10 to 11</li>
+
+<li>
+Timeout killer didn't work on *+-key in number queries</li>
+
+<li>
+Games 'options' -menu disappeared when deleting delivery report in messages</li>
+
+<li>
+Missing/strange menu items when sending SMS</li>
+
+<li>
+Improvements to Arabic & Hebrew editor options</li>
+
+<li>
+Letter insertion direction change in Arabic</li>
+
+<li>
+Improvements to Arabic & Hebrew input (wrong ui-text was used for special
+characters)</li>
+
+<li>
+Improvements to calendar when using fetch service with birthday note</li>
+
+<li>
+Improvements when selecting Multiple copies</li>
+
+<li>
+In SMS: Improvements when storing more than 50 items in the Template folder</li>
+
+<li>
+Improved functionality in Names-list</li>
+
+<li>
+If T9 is active '#'-key toggles now between T9 and normal input in Arabic/Hebrew
+and Chinese languages</li>
+
+<li>
+Improved business card sending</li>
+
+<li>
+No characters were received if Euro-sign was first character in a picture
+message</li>
+
+<li>
+Improvements to Voice tag</li>
+
+<li>
+Correction of Arabic Name & Number view, RTL marker inserted</li>
+
+<li>
+Correction of number length for Idle number input</li>
+
+<li>
+Bottom margin changed in Arabic editor from '2' to '1'</li>
+</ul>
+BUGS:
+<ul>
+<li>
+PL specific: brak informacji o wolnej pamiêci telefonu (widaæ tylko "Wolne:
+")</li>
+
+<li>
+After enabling phone, entering PIN code (after "Enter PIN code" request)
+and when you will see network indicator, press many times (very fast) phone's
+keys (Red and Green key). You should see "Emergency calls only". It must
+done so fast, that Stop sign doesn't blink. If you don't see startup logo:
+phone doesn't give access to phone's menu and profiles, although it's logged
+into network.</li>
+
+<li>
+when keypad is locked and you will press any key, you will see "Press Menu
+and then *". You can now press longer Power button and phone will disable
+!</li>
+
+<li>
+when you make something, somebody call to you and you will press left soft
+key, phone hangs after receiving call...</li>
+
+<li>
+sometimes after WAP session you can't lock keypad</li>
+
+<li>
+after using Irda can't receive SMS</li>
+
+<li>
+<b><font face=""><font color="#FF6666">using BTS Test in netmonitor can
+damage phone (CONTACT SERVICE, etc.) !</font></font></b></li>
+</ul>
+V4.36 31-01-01
+<ul>
+<li>
+Handling of operator logo length improved</li>
+
+<li>
+AT commands updated</li>
+
+<li>
+Initialisation of Data SW when receiving/releasing the data switch</li>
+
+<li>
+Fixed Dialling Numbers - View details shows wrong number if it is longer
+than 12 digits. Although SSC-String for call forwarding is on FDN list,
+call forwarding can not be performed either via menu or via string</li>
+
+<li>
+Flashing panel when erasing a phonebook item</li>
+
+<li>
+Impossible to call to SMS 'use number'</li>
+
+<li>
+Delayed SMS</li>
+
+<li>
+SMS Delivery reports</li>
+
+<li>
+Wrong indication of max characters in SMS</li>
+
+<li>
+Font size selection not working for received SMS</li>
+
+<li>
+Error in DLR-3 usage in the middle of the IR usage</li>
+
+<li>
+Modified AT commands for DHU functionality (TCH Loopback)</li>
+
+<li>
+Automatic answer does not work in car profile</li>
+
+<li>
+Some spelling in languages improved</li>
+
+<li>
+Call without simcard, note "Emergency calls only" won't disappear</li>
+
+<li>
+Freezes when faulty Business Card is received</li>
+
+<li>
+Possible to switch phone off during keypad is locked</li>
+
+<li>
+Updated MoU list (DUAL_operators) (Operator Cosmorom)</li>
+
+<li>
+SIM ATK: submenus become trash</li>
+
+<li>
+Cancel all CF's at once:</li>
+
+<li>
+Performed on Line1: If CFU for Line2 is activated the sign is deleted too</li>
+
+<li>
+Performed on Line2: CF's for Line1, data and fax are cancelled: Line2 not
+affected</li>
+
+<li>
+*#06# should show IMEI even when SIM card is not inserted</li>
+
+<li>
+USSD short strings supported</li>
+
+<li>
+STP support (e.g. used in Mercedes)</li>
+
+<li>
+CLI logo over IR send/receive</li>
+
+<li>
+Ringing tones over IR - receive</li>
+
+<li>
+Shortcut on 'Send' for go to bookmark</li>
+</ul>
+Bug:
+<ul>
+<li>
+after ending Snake II game enter options and last view. When it will be
+displayed, the light will be not off.</li>
+
+<li>
+in German D2 Network problems with message receiving (after receiving one
+no more are received).</li>
+</ul>
+(?) Improvements in netmonitor
+<p>V5.01 15-03-01
+<ul>
+<li>
+The first WAP call cometimes fails after answering/missing a MT PSTN call</li>
+
+<li>
+When trying to delete a received picture message the phone sometimes freezes</li>
+
+<li>
+When erasing unread SMS from phone by cable or IrDA, SMS icon stays on
+display</li>
+
+<li>
+Added function for UI to check, if Data cable is connected or not</li>
+</ul>
+This version can cause following intermittent errors:
+<ul>
+<li>
+Divert freezes the phone</li>
+
+<li>
+SMS receive freezes the phone when reading</li>
+
+<li>
+SMS editing freezes the phone</li>
+</ul>
+V5.02 02-04-01
+<p>All changes from V4.36
+<ul>
+<li>
+(?) first three changes available in 5.01</li>
+
+<li>
+Not possible to change the date of the calendar</li>
+
+<li>
+DTMF tones stop working during call</li>
+
+<li>
+Memory overwrite when using Russian text</li>
+
+<li>
+When PC Suite changes the profile name it is not updated to phone UI before
+restarting the phone</li>
+
+<li>
+Strange behaviour when entering number and then <SEND> to PIN query
+in start-up</li>
+
+<li>
+By HSCSD data transfer is flow ctrl problems (data loss by upload and bi-directional)</li>
+
+<li>
+The first WAP call sometimes fails after answering/missing a MT PSTN call</li>
+
+<li>
+When trying to delete a received picture message the phone hangs</li>
+
+<li>
+When erasing unread SMS from phone by cable or IrDA, SMS icon stays in
+UI</li>
+
+<li>
+Wrong font used for emergency call</li>
+
+<li>
+Sometimes when phone is set to local mode (e.g. by WinTesla) the phonebook
+server is not initialised. This makes it impossible to store CLI icons</li>
+
+<li>
+Not possible to insert new words to the dictionary, if phone SW has been
+updated to 4.27</li>
+
+<li>
+Business card received over IR handled as a Ringing tone</li>
+
+<li>
+Speed dial not updated, if a SIM card entry's number is edited to NULL</li>
+
+<li>
+SMS Notifications are not routed to PC Suite</li>
+
+<li>
+Bluetooth implemented (there is also special hardware "Nokia Connectivity
+Pack" required for it !)</li>
+
+<li>
+Added support in the IrDA subsystem for sending CLI logos to Nokia 6110</li>
+</ul>
+Observations from users (V4.36):
+<ul>
+<li>
+new parameter in <a href="../netmon/faq_net3.htm#Menu8">test 8</a> in netmonitor</li>
+
+<li>
+when create note in calendar, default year is 2001 (not 2000)</li>
+
+<li>
+PL: zmieniona nazwa dla <b>Menu 5-5</b>. Wcze¶niej "kiedy nie odbieram",
+teraz "kiedy niedostêpny"</li>
+
+<li>
+BUG: when send SMS using phone memory (it should be empty), before receiving
+report, you have strange chars inside...</li>
+
+<li>
+"ERA GSM" changed to "PL ERA GSM"</li>
+</ul>
+Note: The correction for line 2 icon (mainly seen in UK and Ireland), which
+was implemented in 5.01, is not implemented in 5.02
+<p>V5.17 01-06-01
+<br>V5.17 05-07-01 (ROM6?)
+<ul>
+<li>
+Added support for Package M - Telekom Jingle - Operator specific ringing
+tone</li>
+
+<li>
+Changed language name spelling of Ukrainian language menu select</li>
+
+<li>
+Operators language files updated.</li>
+
+<li>
+Use one sort order for all languages in Q and S pack. Still problem with
+the letter "Q" in language pack Q!</li>
+
+<li>
+Startup texts/graphics priority changed to: 1 User Welcome Note Text, 2
+Dealer Welcome Note Text, 3 User Welcome Note Graphics.</li>
+
+<li>
+A "DDI Call Create" message on the Fbus (typically used in STP) cause 6210
+SW crash.</li>
+
+<li>
+When a busy number was called twice the third CALL_CREATE_REQ is not responded
+in any way</li>
+
+<li>
+Resets with WAP browsing and bookmark operations</li>
+
+<li>
+Strange behaviour when entering number +SEND to PIN query in startup</li>
+
+<li>
+Wrong font used for DTMF numbers when call is accepted. Now corrected to
+bold 8pt.</li>
+
+<li>
+An unknown DTMF tone is sent at the pause when using carkit.</li>
+
+<li>
+TWIN-BILL SIM Causes "SIM REJECTED" Error message when entering wrong PIN
+code.</li>
+
+<li>
+Heavy load of phone entries from AT command interface resets phone.</li>
+
+<li>
+Incorrect sub_block length in PND_NAME_FIELD</li>
+
+<li>
+Indications ordered from STP are not unsubscribed/cancelled when phone
+is disconnected, causing garbage in data calls.</li>
+
+<li>
+Wrong line 2 icon problem.</li>
+
+<li>
+Car radio mute when voice dialling.</li>
+
+<li>
+<b>New features:</b> WAP over USSD enabled.</li>
+</ul>
+Note: To restore WAP Bookmarks, WinTesla version 311.06.00 or later must
+be used!
+<p>(V4.27) New netmonitor <a href="../netmon/faq_net6.htm#Menu95">test
+95</a> and <a href="../netmon/faq_net6.htm#Menu130">130 (for Bluetooth)</a>
+<p>Note (probably for ALL firmware versions): light sometimes doesn't turn
+on, when keypad is locked and power button pressed (like in older models).
+For me is NOT BUG. It's rather feature, which allows to save some energy.
+It happens (light doesn't enable), when:
+<ol>
+<li>
+keypad is locked</li>
+
+<li>
+any key is pressed and "Press unlock and then *" or "Now press *" message
+will disappear</li>
+
+<li>
+power key is pressed</li>
+</ol>
+Press notice, that light is always enabled after pressing power key then,
+when message "Press unlock and then *" or "Now press *" is displayed. Because
+of it I think, it's good feature, which saves energy after accidentaly
+pressing this key (when press fast any key and power button or fast double
+power button, light is enabled).
+<p>BUG:
+<ul>
+<li>
+when change caller group data and set incorrect (not existing in this model)
+ID for ringtone, it's not possible to change it from phone's menu. Bug
+existing for example, when upload backup data made in other model to it.</li>
+
+<li>
+when have "Pending" delivery report, phone shows different contents (with
+"Pending" you have many strange chars)</li>
+
+<li>
+PL specific: niedok³adne t³umaczenie w pomocy do <b>Menu 3</b> (wykrzystania)
+and <b>Menu 6</b> (opcja dla dwu graczy)</li>
+</ul>
+V5.27 01-08-01
+<ul>
+<li>
+Improvements on key lock in combination with car kit. Keyboard will now
+lock correctly when removing the phone from car kit</li>
+
+<li>
+Improved functionality when enabling frequency hopping</li>
+
+<li>
+Improved speed for network search after power on, in a country different
+from the one where the phone was turned off</li>
+
+<li>
+Improvement to IR after sending a business card to 9110</li>
+
+<li>
+Dealer Welcome Note remains after the user has restored factory settings</li>
+
+<li>
+Improvement to SMS: pressing * in SMS options insert template does not
+any more stick the menu</li>
+
+<li>
+Voicetags improved restoring from PC</li>
+
+<li>
+Improved Data Download via SMS Cell Broadcast</li>
+
+<li>
+Call Barring service string accepts now an empty password</li>
+
+<li>
+SS requesting disabled, when a SIM has not been inserted</li>
+
+<li>
+Operator list updated:</li>
+
+<ul>
+<li>
+New operators</li>
+
+<ul>
+<li>
+"SPACETEL" (417/02)</li>
+
+<li>
+"VUT SMILE" (541/01)</li>
+
+<li>
+"GH-MOBITEL" (620/03)</li>
+
+<li>
+"ORENSOT" (250/11)</li>
+
+<li>
+"VODAFONE" (276/02)</li>
+
+<li>
+"TR AYCELL" (286/04)</li>
+
+<li>
+"CU/C_COM" (368/01)</li>
+
+<li>
+"U-CALL" (539/01)</li>
+
+<li>
+"GAB TELECEL" (628/02)</li>
+
+<li>
+"CELLCO" (630/05)</li>
+
+<li>
+"Digicel" (706/02)</li>
+</ul>
+
+<li>
+Operator names changed</li>
+
+<ul>
+<li>
+Old New</li>
+
+<li>
+"Dutchtone" "Orange NL" (204/20)</li>
+
+<li>
+"ERA GSM" "Era" (260/02)</li>
+
+<li>
+"TH WCS" "TH ORANGE" (520/10)</li>
+</ul>
+
+<li>
+New country name</li>
+
+<ul>
+<li>
+"VUT" (417)</li>
+</ul>
+</ul>
+</ul>
+Note 1: When flashing 05.27 into a phone, that has never been in service
+in normal network (e.g. a swap phone or other brand-new phone), flashing
+might not terminate correctly. This can be avoid by letting the phone to
+go into service before flashing or by using a normal SIM card (not test
+SIM) in the phone during flashing.
+<p>Note: To restore WAP Bookmarks, WinTesla version 311.06.00 or later
+must be used!
+<p>V5.36
+<br>When flashing 05.36 into a phone that has NEVER BEEN IN SERVICE ON
+A LIVE NETWORK (e.g. a swap phone or other brand new phones) the flashing
+might not terminate correctly. The problem only occurs when using WinTesla
+for flashing. A work around for this problem is to make the phone go into
+service before flashing or having a live SIM in the phone while flashing.
+<p>In order to restore WAP Bookmarks, the latest WinTesla version (311.06.00)
+must be used!
+<ul>
+<li>
+Changes to operator and country names: </li>
+
+<ul>
+<li>
+New operator: </li>
+
+<ul>
+<li>
+XFERA (214/04)</li>
+
+<li>
+TELE2 (246/03)</li>
+
+<li>
+MCM (262/13) </li>
+
+<li>
+Quam (262/14) </li>
+
+<li>
+SI VEGA 070 (293/70) </li>
+
+<li>
+Telcell GSM (362/51) </li>
+
+<li>
+UTS (362/91) </li>
+
+<li>
+PK-UFONE (410/03) </li>
+
+<li>
+SyriaTel (417/93) </li>
+
+<li>
+DIGITEL (515/05) </li>
+
+<li>
+ORANGE (520/99) </li>
+
+<li>
+FSM Telecom (550/01) </li>
+
+<li>
+OTA NET (603/02) </li>
+
+<li>
+GAMCEL (607/01) </li>
+
+<li>
+ECONET NG (621/20) </li>
+
+<li>
+NG NITEL (621/40) </li>
+
+<li>
+COG LIBERTIS (629/10) </li>
+
+<li>
+MOBITEL - TZ (640/02) </li>
+
+<li>
+CELTEL TZ (640/05) </li>
+
+<li>
+Itineris RUN (647/00) </li>
+
+<li>
+F-OMT (647/02) </li>
+
+<li>
+Cell C (655/07) </li>
+
+<li>
+PORT-HABLE (722/35) </li>
+</ul>
+
+<li>
+Name changed: </li>
+
+<ul>
+<li>
+AIRTEL -> E VODAFONE (214/0 </li>
+
+<li>
+Orange -> orange (228/03) </li>
+
+<li>
+TDK-MOBIL -> TDC MOBIL (238/01) </li>
+
+<li>
+mobilix -> Orange (238/30) </li>
+
+<li>
+Q GSM -> TELE2 (248/03) </li>
+
+<li>
+TELECEL -> P VODAFONE (268/01) </li>
+
+<li>
+AMERIS -> F-Orange (340/01) </li>
+
+<li>
+INA SPICE -> INA AIRTEL (404/31) </li>
+
+<li>
+M.PLUS -> BATELCO (426/01) </li>
+
+<li>
+DiGi 1800 -> DiGi (502/16) </li>
+
+<li>
+EXCELCOM -> proXL (510/11) </li>
+
+<li>
+ORANGE -> Orange (520/99) </li>
+
+<li>
+OMEGA -> LoneStar (618/01) </li>
+
+<li>
+CAMNET -> MTN CAM (624/01) </li>
+
+<li>
+CELLCO -> CELLCO GSM (630/04) </li>
+
+<li>
+Itineris RUN -> Orange re (647/00) </li>
+</ul>
+
+<li>
+New country name: </li>
+
+<ul>
+<li>
+NA (362) </li>
+
+<li>
+PK (410) </li>
+
+<li>
+FSM (550) </li>
+
+<li>
+GMB (607) </li>
+
+<li>
+ARG (722) </li>
+
+<li>
+BRA (724) </li>
+</ul>
+
+<li>
+Country name changed: </li>
+
+<ul>
+<li>
+NIG -> NG (255) </li>
+
+<li>
+NA -> ANT (362) </li>
+
+<li>
+F -> REU (647) </li>
+</ul>
+</ul>
+
+<li>
+Improper UI-disconnection of data cable causing IrDA to disconnect corrected. </li>
+
+<li>
+Locked UI while in call on Mobilkom Austria network using A1 Plus SIM corrected. </li>
+
+<li>
+Missing Chinese punctuation characters in WAP corrected. </li>
+
+<li>
+Problem with Phone Book reading via AT commands corrected. </li>
+
+<li>
+Problem with SMS indicator reading via AT commands corrected. </li>
+
+<li>
+Chinese sorting in Phone Book when using the letter Q improved. </li>
+
+<li>
+Wrong text in Call Cost Limit query corrected. </li>
+
+<li>
+Problem with making calls from Name&Number display in Arabic corrected.</li>
+</ul>
+V5.44 29-11-01
+<br>
+<ul>
+<li>
+Possibility of acoustic feedback from keypad and warning tones in HFU-2
+reduced. Typically that feedback appeared when the car radio speakers were
+used for phone audio </li>
+
+<li>
+Handling of long numbers in the Abbreviated Dialling </li>
+
+<li>
+Number list on SIM improved. The last digit of a very long number string
+might have changed in some cases </li>
+</ul>
+V5.56 25-01-02
+<ul>
+<li>
+Improvement to Network Identity over the air in NITZ (Network Identity
+and Time Zone)</li>
+</ul>
+
+<p><br>
+<hr WIDTH="40%">
+<br>Note:
+<ul>
+<li>
+after changing SIM card memory type is set to "SIM card". Correct it manually
+or set security level to "phone" (when SIM card was used earlier, memory
+type won't be changed).</li>
+
+<li>
+after calling WAP WAP access number is added to Called Numbers</li>
+</ul>
+BUGS:
+<ul>
+<li>
+Menu shortcuts problem: <b>Menu 1-8-x</b> (example <b>Menu 1-8-7</b>) directs
+to <b>Menu 1-8-1</b></li>
+
+<li>
+Shotcut <b>Menu 2-5-1-1-1</b> hangs phone !</li>
+</ul>
+</td>
+</tr>
+
+<tr>
+<td><a NAME="#6250"></a>6250</td>
+
+<td>NHM-3</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1C54 23-02-00
+<br>V3.00 15-09-00
+<br>V3.12 08-11-00
+<ul>
+<li>
+(V3.00) Improvement in weak field</li>
+
+<li>
+(V3.00) Improvements to sound level meter and keyguard code</li>
+
+<li>
+(V3.00) Service dialing numbers in SIM read correctly</li>
+</ul>
+<b>Menu 14</b> doesn't have picture
+<p>V4.00 06-12-00
+<ul>
+<li>
+Improvements to Task Journal:</li>
+
+<li>
+Searching 'by customer' was shown 'by work'</li>
+
+<li>
+Default value was missing when entering amount of materials</li>
+
+<li>
+Flaw in information note when pausing a task</li>
+
+<li>
+When entering the material id, last given id is being default</li>
+
+<li>
+Shortcuts did not work</li>
+
+<li>
+SMS sending did not work with special characters</li>
+
+<li>
+Arabic SMS sending couldn't turn up and down the pages</li>
+
+<li>
+Wrong number font in language packages R and S</li>
+
+<li>
+Phone came from clock menu to Automatic keylock -menu with 'Back' button</li>
+
+<li>
+When adding comment there was text 'OK' instead of 'Save' in left softkey</li>
+
+<li>
+Speed dial names touched service/battery bar</li>
+
+<li>
+Improvements to Automatic keylock:</li>
+
+<li>
+Keypad was locked while in menu</li>
+
+<li>
+Strange behaviour when simultaneous alarm and calendar remainder</li>
+
+<li>
+In Stopwatch shortcuts did not work</li>
+
+<li>
+Charger activated and deactivated the vibra</li>
+
+<li>
+Keyguard not activated when timed profile & missed calls</li>
+
+<li>
+Improvement to Arabic/Hebrew Memory status layouts</li>
+
+<li>
+Improvements to Voicetags</li>
+
+<li>
+Improvements to SMS</li>
+
+<li>
+Only one indicator is at the end of Selection window when moving to second
+candidate first time in the editing mode</li>
+
+<li>
+Input method indicator in top left corner is disappeared in Rename operation</li>
+
+<li>
+DLR-3 is detected as a headset after one headset call</li>
+
+<li>
+UNICODESIM: SDN only names of length less than 8 are shown</li>
+
+<li>
+Improvements to browser setup: - "Menu" -> "2" -> "Scroll" corrected</li>
+</ul>
+V4.01 28-12-00
+<ul>
+<li>
+Timed profile now stays activated after power off/on</li>
+
+<li>
+Impression to be able to same more than 250 names corrected</li>
+
+<li>
+Wrong header text in stopwatch erasing in some languages ("Erase times")
+corrected</li>
+</ul>
+V4.04:
+<ul>
+<li>
+Improvements in SMS: phonebook memory re-configuration</li>
+
+<li>
+Improvements in Task Journal: "Task active on background" notification
+now displayed also when exiting the Task Journal by pressing "Back"</li>
+
+<li>
+Display contrast factory default value changed from 6 to 4</li>
+
+<li>
+Improved Keylock code shortcut</li>
+
+<li>
+Operator name list updated (Cosmorom / Romania)</li>
+</ul>
+V4.05
+<ul>
+<li>
+Turkish, Greek, Czech and <b>Polish</b> T9 added</li>
+
+<li>
+LCD temperature compensation</li>
+
+<li>
+LCD reset after powerup</li>
+
+<li>
+Spaces couldn't be put in front of text in Dealer Welcome Note (DWN)</li>
+
+<li>
+PIN-code couldn't be entered on a SIM-locked phone</li>
+
+<li>
+It wasn't possible to call a SS string beginning with a "*" (e.g. *#61#
+etc.) stored on the FDN phonebook</li>
+
+<li>
+Setup Menu command was not executed when already in SIM ATK menu</li>
+
+<li>
+SIM ATK minimum polling interval increased from 5 to 10 sec</li>
+
+<li>
+Improvements when trying to enter username in HTTP authentication</li>
+
+<li>
+Dynamic text case handling improved</li>
+
+<li>
+Timeout killer didn't work on *+-key in number queries</li>
+
+<li>
+Games 'options' -menu disappeared when deleting delivery report in messages</li>
+
+<li>
+Missing/strange menu items when sending SMS</li>
+
+<li>
+In SMS: Improvements to calendar when using fetch service with birthday
+note</li>
+
+<li>
+In SMS: Improvements when selecting Multiple copies</li>
+
+<li>
+In SMS: Improvements when storing more than 50 items in the Template folder</li>
+
+<li>
+Improved functionality in Names-list</li>
+
+<li>
+If T9 is active '#'-key toggles now between T9 and normal input in Arabic/Hebrew
+and Chinese languages</li>
+
+<li>
+Improved business card sending</li>
+
+<li>
+No characters were received if Euro-sign was first character in a picture
+message</li>
+
+<li>
+Improvements to Voice tag</li>
+
+<li>
+Correction of Arabic Name & Number view, RTL marker inserted</li>
+
+<li>
+Correction of number length for Idle number input</li>
+
+<li>
+Handling of operator logo length improved</li>
+
+<li>
+AT commands updated</li>
+
+<li>
+Initialisation of Data SW when receiving/releasing the data switch</li>
+
+<li>
+Fixed Dialling Numbers - View details shows wrong number if it is longer
+than 12 digits. Although SSC-String for call forwarding is on FDN list,
+call forwarding can not be performed either via menu or via string</li>
+
+<li>
+Flashing panel when erasing a phonebook item</li>
+
+<li>
+Earlier it was impossible to call to SMS 'use number'</li>
+
+<li>
+Improved SMS Delivery reports</li>
+
+<li>
+Wrong indication of max characters in SMS</li>
+
+<li>
+Font size selection not working for received SMS</li>
+
+<li>
+Error in DLR-3 usage in the middle of the IR usage</li>
+
+<li>
+Modified AT commands for DHU functionality (TCH Loopback)</li>
+
+<li>
+Automatic answer does not work in car profile</li>
+
+<li>
+Some spelling in languages improved</li>
+
+<li>
+Call without simcard, note "Emergency calls only" won't disappear</li>
+
+<li>
+Freezes when faulty Business Card is received</li>
+
+<li>
+Possible to switch phone off during keypad is locked</li>
+
+<li>
+Updated MoU list (DUAL_operators)</li>
+
+<li>
+SIM ATK: submenus become trash</li>
+
+<li>
+Cancel all CF's at once:</li>
+
+<ul>
+<li>
+Performed on Line1: If CFU for Line2 is activated the sign is deleted too</li>
+
+<li>
+Performed on Line2: CF's for Line1, data and fax are cancelled: Line2 not
+affected</li>
+</ul>
+
+<li>
+*#06# should show IMEI even when SIM card is not inserted</li>
+
+<li>
+USSD short strings supported</li>
+
+<li>
+STP support (e.g. used in Mercedes)</li>
+
+<li>
+CLI logo over IR send/receive</li>
+
+<li>
+Ringing tones over IR - receive</li>
+
+<li>
+Shortcut on 'Send' for go to bookmark</li>
+
+<li>
+In Task Journal: User data memory reconfiguration (now more space for user
+data)</li>
+
+<li>
+Reconfiguration to language packages:</li>
+
+<ul>
+<li>
+LP C: Turkish T9 added, Spanish menu and T9 removed</li>
+
+<li>
+LP F: Greek T9 added, Spanish T9 removed</li>
+
+<li>
+LP H: Czech T9 added, German T9 removed</li>
+
+<li>
+LP I: Russian menu removed</li>
+
+<li>
+LP J: <b>Polish</b> T9 added, German menu added</li>
+
+<li>
+LP L: created for Spain and Portugal</li>
+</ul>
+
+<li>
+New text release 130301</li>
+</ul>
+V5.00 10-07-01 (ROM6?)
+<ul>
+<li>
+Mainly update to get GCF approva</li>
+
+<li>
+Operator max. name lenght change 11 a 1</li>
+
+<li>
+SIM Poll Interval chang</li>
+
+<li>
+New text release 160301</li>
+
+<li>
+Dual Operator list update</li>
+</ul>
+V5.02
+<ul>
+<li>
+SMS sending improved (SMS sending jammed occasionally)</li>
+
+<li>
+Light stayed on occasionally</li>
+
+<li>
+Improvement to alternate speech-fax call</li>
+
+<li>
+O- language package added</li>
+
+<li>
+Operator list updated (#44)</li>
+</ul>
+</td>
+</tr>
+
+<tr>
+<td><a NAME="6310"></a>6310</td>
+
+<td>NPE-4</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.23 19-03-01
+<br>V4.10 04-01-02
+<p>BUGS:
+<br>the phone crashed when i recorded a second voice message after an older
+one which is 1 minute of length. after i did that, i couldnt delete the
+second recording, and the screen would turn black.. another [ok] and the
+phone would restart.
+<p>V4.15
+<ul>
+<li>
+RS232 Serial Cable connection improved (connection did not work properly
+during startup) </li>
+
+<li>
+Wakeup graphics implemented (support for operator variants added) </li>
+
+<li>
+When voice dialled in a car, the radio did not mute </li>
+
+<li>
+Memory improvements </li>
+
+<li>
+Long pressing power button first turned phone off and then on. Now no matter
+how long time the power button is pressed to turn off the phone, the phone
+stays off. </li>
+
+<li>
+Support for Language package T (Australia and New Zealand) added </li>
+
+<li>
+Support for Arabic UI added </li>
+
+<li>
+Improvements to SMS </li>
+</ul>
+</td>
+</tr>
+
+<tr>
+<td><a NAME="6510"></a>6510</td>
+
+<td>NPM-9</td>
+
+<td>*#0000#</td>
+
+<td>350697</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.22 10-01-02</td>
+</tr>
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center><p>Here is table describing firmware in various Nokia 7xxx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#7110"></a>7110</td>
+
+<td>NSE-5</td>
+
+<td>*#0000#</td>
+
+<td>448895</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.07 20-10-99
+<p>Internal Nokia test version
+<br>Wersja testowa Nokii
+<p>V4.51 18-06-99
+<br>V4.58 14-07-99
+<br>V4.61 23-08-99
+<br>V4.62 24-08-99
+<br>V4.67 28-09-99
+<p>First shipping version of the software.
+<br>Pierwsza wersja oprogramowania w sprzedawanych telefonach.
+<p>V4.69 05-10-99 (not in German language)
+<p>Improvements in WAP browser (with WML)
+<p>V4.70 28-10-99
+<br>V4.72 10-11-99 (not in German language)
+<br>V4.73 15-11-99
+<p>(V4.70) BUG REMOVED: Earlier: Max. 12 messages can be stored in self
+created SMS-folders.
+<p>V4.75 23-11-99 or 07-01-00
+<p>V5.11 16-12-99
+<p>Internal Nokia test version
+<br>Wersja testowa Nokii
+<p>V4.76 13-01-00
+<p>(V4.73) Improvement to Manual Network selection search
+<br>(V4.73) Poprawiono wyszukiwanie sieci przy rêcznym ich wyborze
+<p>(V4.73) Improvements to CLI Graphics:
+<br>(V4.73) Poprawki nastêpuj±cych b³êdów:
+<ul>
+<li>
+CLI group tone can't be changed</li>
+
+<br>D¼wiêk nie mo¿e byæ zmieniony w grupach osób
+<br>
+<li>
+Can't make call by pressing "send" key in CLI member list</li>
+
+<br>Nie mo¿na zadzwoniæ przez naci¶niêcie "wy¶lij" w menu grupy osób cz³onkowie
+<br>
+<li>
+"End" key doesn't work right in Caller Group General Note</li>
+
+<br>Klawisz "Koniec" nie dzia³a poprawnie w ogólnych notatkach grupy osób
+dzwoni±cych
+<br>
+<li>
+Phone reset when there are two or more active downloaded ringing tones
+in Caller groups</li>
+
+<br>Telefon siê resetuje, gdy s± dwa albo wiêcej wgranych przez u¿ytkownika
+dzwonków w grupach osób dzwoni±cych
+<br>
+<li>
+CLI group tones list problems</li>
+
+<br>Problemy z list± dzwonków grupy (pozycje s± przesuniête - po wybraniu
+jakiego¶ telefon faktycznie ustawia kolejny na li¶cie)</ul>
+(V4.73) The Call Waiting functionality in the car kit is now improved concerning
+radio mute
+<br>(V4.73) Poprawiono funkcjê po³±czeñ oczekuj±cych w zestawie samochodowym
+<p>(V4.73) Dialled numbers removed in Roller menu.
+<br>(V4.73) Wybierane numery zosta³y usuniête z Roller menu.
+<p>(V4.73) The user is now able to insert a phone number into a SMS message
+by searching the phonebook for the number.
+<br>(V4.73) U¿ytkownik mo¿e teraz wstawiæ numer telefonu do wiadomo¶ci
+SMS przez znalezienie go w ksi±¿ce telefonicznej.
+<p>(V4.73) Improvement of Calendar using am/pm clock
+<br>(V4.73) Poprawki w kalendarzu przy u¿ywaniu 12-godzinnego formatu czasu
+<p>(V4.73) Improvement of speed dial function when same name is assigned
+to speed dial twice
+<br>(V4.73) Poprawki w funkcji szybkiego dzwonienia, gdy ta sama pozycja
+jest przypisana do dwóch klawiszy szybkiego wyboru.
+<p>(V4.73) BUG REMOVED: Earlier:
+<ul>
+<li>
+"?" (Euro) and "\" are converted to space characters when storing or sending
+a SMS</li>
+
+<li>
+Inserting a phonebook-number into a SMS: Total crash. Sometimes self-reset
+after 1-2 mins. If you're activting IR-receive, yo'll get a error ""remove
+datacable"" even it is not connected."</li>
+
+<li>
+When deleting an entry from a call register list and closing the slide
+while the deletion is in progress (after 'ok') the phone hangs up when
+changing the menukey from 'Lock keys' to Menu'.</li>
+
+<li>
+When deleting a space before a uppercase char with active T9-dictionary,
+the char will be changed to lowercase</li>
+
+<li>
+Clock: hour/minute separator "." instead of ":"</li>
+
+<li>
+Sometimes when sending a SMS: SMS get sent (will be received, too), phone
+is crashing. Remove battery, afterwards the SMS isn't in the outbox. Maybe
+more often when sending sms to more receivers. At power-up alleged no PIN-request.</li>
+</ul>
+BUG (ONLY THIS VERSION): Crash with deactivated PIN-request
+<p>V4.77 25-01-00
+<p>BUG FIXED: "Clear operator logo" works now (from Operator Logo Uploader).
+<p>BUG REMOVED: Earlier: Cell Broadcasts: Settings are cleared after power
+cycling.
+<p>V4.80 23-02-00
+<p>Improvement of browsing after ending an incoming call.
+<p>Wakeup Graphic is now maintained after 'Restore Factory Settings'
+<p>Changed ringing tones - Grande Valse renamed to Nokia tune
+<p>Phone alert for a future calendar note, which has been transferred during
+flashing, is now improved.
+<p>Improvement of birthday notes expiry when having birthday notes in the
+past. In previous release two birthday notes were shown if having note
+in the past and other note expires.
+<p>OTA ringing tones is not playing continuously after being saved.
+<p>Tone loop with OTA tones. OTA tones are now being played in full length
+when it is being tested in profiles.
+<p>Indication of incoming FAX call improved. Profile dependant indications
+is now corrected. e.g. Beep in Meeting Profile.
+<p>Ringing Tone Check in Profile setting is now also only played twice
+as an example when the phone is 'charging' or another message is displayed.
+<p>BUG REMOVED: Earlier:
+<ul>
+<li>
+In the profile "Conference" calls , that numbers are in a callergroup,
+are ringing not "short", but normal. Looks like the previous used profile's
+settings are used again.</li>
+
+<li>
+In profile "Quiet": phone is ringing at calendar-appointments. Should be
+quiet, too. "Conference" is ok (short tone)</li>
+
+<li>
+In firmware 4.76 and 4.77 (4.73 and earlier were OK) phone crashed
+when received more (3) Vcards or calendar-appointments over IR</li>
+
+<li>
+(V4.70) After removing the battery, the currency and unit-settings are
+lost often.</li>
+</ul>
+V4.84 07-04-00
+<p>Improvement to Advice of Charge. Charging on prepaid SIM cards is now
+improved
+<p>Improvements to Manual Network Selection
+<p>Improvement to Operator Logo in display. The operator logo is now shown
+when the service provider is read from SIM
+<p>Call waiting tone can now be heard in silent mode
+<p>Longer vibrating time. When phone is in "Beep once" mode and vibra is
+on, the phone will now vibrate 250 times before stopping
+<p>Animation in Services menu too fast. Changed timing from 125 to 160
+milliseconds
+<p>Improvement to warranty transfer of WAP settings
+<p>Car Radio Mute is now activated when continuing a handheld call in the
+cradle (car kit)
+<p>(NEWER TOO ?) BUG: Send a calendar note from Nokia 6110 via a SMS to
+your 7110. The calendar in 7110 will stop showing calendar notes...
+<p>Test for size of SMS memory (from <a href="http://www.vosper.prv.pl">http://www.vosper.prv.pl</a>):
+<br>SMS messages - 47 in different folders
+<br>Templates - 10
+<br>Delivery reports - 36
+<br>Additional folders - 2
+<br>After 39 SMS phone deactivated function Move !
+<br>Full size of memory is 93 (including 10 templates)
+<br>-------
+<br>Second test for SMS only: 84 SMS + 10 templates
+<p>BUG REMOVED. Earlier:
+<ul>
+<li>
+Vibration is running in the rhythm of the music, at very quiet or short
+ringtones it is vibrating extrem short or not at all</li>
+
+<li>
+(V4.70) After disconnecting battery (without power-off) the volume is often
+set to standard.</li>
+</ul>
+V4.85
+<p>Info from <a href="http://www.linux.org.uk/diary/">http://www.linux.org.uk/diary/</a>:
+Seems firmware 4.7x randomly dies on some AT commands. With 4.85 wait for
+'OK' then delay 1/10th second before sending a command. If you imediately
+respond to OK with a reply the phone misses it.
+<p>V4.88 19-06-00 or 16-06-00 or 02-06-00
+<p>(V4.84) User setting transfer improved (Permanent Memory Management
+update). All data saved apart from wake-up graphics
+<p>(V4.84) Test for size of SMS memory (from <a href="http://www.vosper.prv.pl">http://www.vosper.prv.pl</a>):
+<br>SMS messages - 62 in different folders
+<br>Templates - 10
+<br>Delivery reports - 18
+<br>Additional folders - 2
+<br>After 49 SMS phone deactivated function Move !
+<br>Full size of memory is 90 (including 10 templates)
+<br>-------
+<br>(V4.84) Second test for SMS only: 80 SMS + 10 templates
+<p>BUG REMOVED: Earlier
+<ul>
+<li>
+The phone freezes sometimes, when assigning rintones to callergroups. Maybe
+depending somehow on the settings of callergroups and groupgraphics. Sometimes
+continue after 1-2 mins. Maybe better results when using the power-key
+than with Menu 3.</li>
+
+<li>
+"Opposite: the levels are in wrong order (1-3-4-2; 2 is the most complicated
+one)"</li>
+</ul>
+
+<p><br>(V4.80) BUG REMOVED: Earlier:
+<ul>
+<li>
+Names of loaded ringtones were shown as rectangles sometimes, i.e. after
+a firmwareupgrade, when ringtones were deleted, but the callergroups still
+pointed to them.</li>
+
+<li>
+""Confirmations of SIM service actions"" is not working sometimes, although
+enabled - phone is sending SMS without asking.</li>
+
+<li>
+Reminder-alert rings loud even while doing a call.</li>
+</ul>
+(V?.??) BUG REMOVED. Earlier: "No connections possible after a Wap-Call
+(for approx. 15 min), although receiving-level is up. Alleged the phone
+is still sending then (noticeable on the noise in a radio). If you have
+a failed login attempt ('no response' or 'page cannot be displayed') only
+?
+<p>Changed text while sending SMS
+<br>from
+<br><i>letter bar (shorter)</i>
+<br><i>Sending</i>
+<br><i>message</i>
+<br>to
+<br><i>letter bar (longer)</i>
+<br><i>Sending message</i>
+<p>V4.94 02-10-00 or 27-09-00 or 28-09-2000
+<p>Carkit Audio optimisation
+<p>Text files in language packages updated (localised group names, ...)
+<p>IRDA data transmission improved
+<p>Correction to Viag Homezone
+<p>Operator list updated
+<p>Update of WAP browser:
+<ul>
+<li>
+Handling of "No cache" and "Redirect" commands</li>
+
+<li>
+Handling of WAP session after an incoming call</li>
+
+<li>
+Handling of <onenterforward> command</li>
+
+<li>
+Handling of long URLs</li>
+
+<li>
+Handling of HTTP post size limitation</li>
+
+<li>
+Handling of deep navigating</li>
+</ul>
+Now max. 838 chars (earlier only 160) can be written into inputfields...
+<p>Update of SIM handling SW, including SIM ATK corrections
+<p>BUG: In WTLS mode sends an additional byte in the Client-KeyExchange
+packet. Some WAP gateways seem to have a workaround for this bug (E-Plus
+works, Debitel not). Netlife WAP-Server has a workaround too...
+<p>Can render tables in WAP now.
+<p>Jeden z u¿ytkowników na polskich grupach dyskusyjnych porówna³ j± ze
+starszymi wersjami tak:
+<br>One of 7110 compared it to the earlier firmware:
+<ul>
+<li>
+WAP browser organised like in N6210</li>
+
+<br>W³a¶ciwie przegl±darka WAP zorganizowana jest podobnie, a w³a¶ciwie
+chyba tak samo jak przegladarka WAP w N6210.
+<li>
+added <CENTER> support</li>
+
+<br>Dodano obs³ugê tagu <CENTER>
+<li>
+Added function "Go to the address" in menu</li>
+
+<br>Dodano mo¿liwo¶æ wpisania adresu strony bezpo¶rednio z menu (wcze¶niej
+trzeba by³o najpierw za³o¿yæ zak³adkê) - opcja "Id¼ do adresu"
+<li>
+You can NOT LOAD images - new <b>Menu 10-3-2</b> (previous <b>10-3-2</b>
+moved to <b>10-3-3</b>) <i>Appereance settings</i> with <i>Show Images
+Yes/No</i></li>
+
+<br>Dodano mo¿liwo¶æ NIEWCZYTYWANIA grafiki - opcja w nowym <b>Menu 10-3-2</b>
+<li>
+Image can be link</li>
+
+<br>Dodano obs³ugê grafiki jako linka
+<li>
+When phone read pages, you don't see "snake" and "Connecting with...",
+but globe</li>
+
+<br>Podczas wczytywania stron nie pojawia siê "wê¿yk" i napis "³±czy siê
+z us³ugami" tylko w prawym górnym naro¿niku globusik
+<li>
+WAP connections are MORE STABLE</li>
+
+<br>generalnie DU¯O STABILNIEJSZE po³±czenia WAP ni¿ dotychczas
+<li>
+Can send and receive bookmarks in WAP settings</li>
+
+<br>mo¿liwo¶æ wysy³ania i odbierania zak³adek w ustawieniach WAP</ul>
+Test for size of SMS memory (from <a href="http://www.vosper.prv.pl">http://www.vosper.prv.pl</a>):
+<br>SMS messages - 128 in different folders
+<br>Templates - 10
+<br>Delivery reports - 52
+<br>Additional folders - 3
+<br>Phone didn't deactivate function Move !
+<br>Full size of memory is 190 (including 10 templates)
+<br>-------
+<br>Second test for SMS only: 142 SMS (or more - test wasn't end) + 10
+templates
+<p>(V 4.88) BUG REPAIRED: In older versions more numbers for one name broke
+call with Green button:
+<ol>
+<li>
+Add more numbers to one name (standard number other than type 'general').</li>
+
+<li>
+Change "Type of view" to "Name and number".</li>
+
+<li>
+Press Green button (Call) or the NaviRoller long with this number.</li>
+
+<li>
+Phone "starts" to call, but instead of printing the number, it prints only
+name and after few seconds it returns to name.</li>
+
+<li>
+Go to "last calls" (or "Redial" and "Options - Edit Number").</li>
+
+<br>The called name has number starting with "/".</ol>
+Solution for it was: use the NaviRoller 2 times to get through the menu
+<p>BUG REMOVED: Earlier:
+<ul>
+<li>
+When made these steps: Receiving Vcard - show - break off by closing slide
+-> the Vcard-name appeared in some menus, until power cycling (i.e. in
+a SMS-folder, while the display is building up a SMS, in the top line,
+instead of the SMS-title)</li>
+
+<li>
+When a number, which was assiged to a speeddial, was deleted, the speeddial
+remained and pointed to nothing. When called such a speeddial the phone
+crashed sometimes (after the Error message "Number missing").</li>
+
+<li>
+When deleting a phonebook-entry with a assigned speeddial (but let the
+name itself stored), pressing the NaviRoller (set to speeddial), and closing
+the slide while the "Number missing" Message is displayed, the display
+gets empty when the slide is closed and the Text has changed from "Lock.
+Keys" to "Menu". When someone calls, the display gets on again. Ok after
+powercycling.</li>
+
+<li>
+Assigning ringtones to callergroups after a firmwareupgrade: sometimes
+some of the ringtones are deleted, but the callergroups and profiles still
+pointing to them -> Phone crashes when trying to assign the tones.</li>
+
+<br>Solution for it was: assign all profiles and callergroups to a standard-tone,
+power cycle the phone, load the individual 5 tones new, and assign profiles
+and groups new.
+<li>
+If you renamed group, the old (preset) name was still shown in menus (i.e.
+"Alert for").</li>
+
+<li>
+"?" (Euro) and "\" in the SMS listview are shown as rectangles.</li>
+
+<li>
+When entering CAPTIALS with active T9-dictionary, and a word with the german
+Umlaut ""ß"" is found, this letter is leaved noncaps.</li>
+
+<li>
+After Wap access sometimes the display gets empty when the slide is open,
+normal display only for a short time when it is closed. Ok after powercycling.
+(i.e. when opening the 'suchmaschine' link at <http://mopilot.com/wml/index.wml>)</li>
+
+<li>
+Data-calls using IR breaks down after some Minutes (""IR connection lost"").
+Alleged only when sending data, receiving works. Alleged ok, when using
+a ir-speed of 9600 baud.</li>
+
+<li>
+When security-level set to "Phone": you can't get the Memory Status. When
+set to "Memory", it is possible. Should be vice versa.</li>
+
+<li>
+The call divertion icon is cleared after powercycling, or no service condition.
+Appears again after status-check.</li>
+
+<li>
+Autoanswer with the headset does not work if the keyboard is locked (altough
+activated in the profile).</li>
+
+<li>
+(was OK in V4.73 and earlier, not OK in 4.88) Closed user group: after
+entering the groupnumber, the left OK-button doesn't work, only the NaviRoller.</li>
+
+<li>
+(V4.80) german text wrong: "auf Netzant- wort <new line> warten" (english:
+"Requesting")</li>
+</ul>
+NaviRoller for Redialing (Menu 4-3-5) official not possible anymore since
+FW v4.73 not possible again...
+<p>Keyboard can only be locked after closing the slide with the Softkey
+only, not anymore with the NaviRoller (like earlier).
+<p>BUG (ONLY THIS VERSION):
+<ul>
+<li>
+Changing a Speeddial-Entry with 'search' does not work (''selected memory
+empty'). Deleting and assigning new works.</li>
+
+<li>
+"WAP: Bug in relative URL's with leading ""/"": ""http://www.abc.com/""
+and the Link to ""/sub.wml"" targets to ""http://www.abc.co/sub.wml"""</li>
+
+<li>
+Snake2: after playing, the cup is shown without the reached points.</li>
+</ul>
+BUG (IN THIS AND NEWER VERSIONS):
+<ul>
+<li>
+When receiving a SMS with locked keypad, unlock it, and immediately press
+the left softkey, the phone shows the menu instead of the SMS. ('Menu'
+instead of 'Show')</li>
+
+<li>
+all (Infrared-) "Print" menu's are missing</li>
+
+<li>
+If the keyboard is locked with "Menu *", it is not unlocked when opening
+the slide.</li>
+
+<li>
+SMS with more numbers - Options/Use number - Number is shown - Options/Add
+to name: Namelist is empty and softkeys are not working</li>
+
+<li>
+French language: reply text ""Sans/Avec"" in Jeux/Param?tres/Audio mixed
+up (i.e. when selecting ""Sans"" the phone replys ""Avec Audio"") (Games/Settings/Sounds
+On/Off)</li>
+
+<li>
+Games: start-animation is not smooth</li>
+</ul>
+V5.00 09-11-00
+<p>Improvements to Data/Fax call functionality
+<p>Extended URL length
+<p>Improved cache control (max age=0 functionality improved)
+<p>Weak encryption (40 bit) now displayed correctly
+<p>DTMF tones usable during emergency call
+<p>Vibra settings adjusted (it doesn't enable/disable, when want)
+<p>Improvements to the phonebook search function (use Search function and
+press some key (phone will jump do the first entry starting with this char),
+now use Delete function - cursor doesn't return to names starting on A)
+<p>'PIN code request change to PUK code request after emergency call' corrected
+<p>Games (two players): Text for winners/losers added
+<p>Different alghoritms for games ? On the page <a href="http://www.vosper.prv.pl">http://www.vosper.prv.pl</a>
+you can find, how to win in Opposite in 4'th level in firmware 4.77, 4.84
+and 4.94. Author writes, that in 5.00 it doesn't work.
+<p>(V4.88) Games: in Games menu have new setting, which can enable/disable
+sounds (earlier you had to change it in settings of profiles)
+<p>(V4.88): in WAP can enable wrapping long texts - new <i>Text wrapping
+On/Off</i> option in <b>Menu 10-3-2</b>
+<p>(V4.88). BUG: when download correctly group logo to phone, right half
+of first line to the bottom of the screen is clean....
+<p>(V4.88) if you receive SMS you <b>CAN'T</b> type twice left function
+key to get message, you HAVE to wait second between keystrokes.
+<p>Test for size of SMS memory (from <a href="http://www.vosper.prv.pl">http://www.vosper.prv.pl</a>):
+<br>SMS messages - 112 in different folders
+<br>Templates - 10
+<br>Delivery reports - 68
+<br>Additional folders - 2
+<br>Phone deactivated function Move after 171 SMS !
+<br>Full size of memory is 190 (including 10 templates)
+<p>(V4.88) Different menu: earlier in "Phonebook->Options" there was "Print"
+function
+<p>BUG REMOVED: Earlier:
+<ul>
+<li>
+Vcard sent from 7110 to 61x0 with SMS is received as normal SMS instead
+of a Vcard (mostly "not showable") Combinations 61x0 to 7110, 61x0 to 61x0
+and 7110 to 7110 worked OK in earlier versions.</li>
+
+<li>
+When searching the phonebook, the displayed list should jump to the given
+letters, but should not be filtered with them.(like on 2110 or 61x0). After
+pressing 'options' and 'back', or waiting 30 seconds, the phone switches
+into this mode. In this version the phone holds the position after clearing
+the entry.</li>
+
+<li>
+While playing games (ringtone and message alerts are beep once, light is
+enabled), the lights turn off after few seconds when an SMS is received.
+In this version game is interrupted...</li>
+
+<li>
+(V4.88) If someone called you with CLIP active and you had no time to answer,
+this call will be under Missed Calls, displayed with (no number). If you
+try to erase it, over 50% chance will be that on display will be something
+like (sequence of squares) and if you press Ok phone hangs. Only battery
+removing helps.</li>
+
+<li>
+(V4.88) in Norwegian language only: phonebook search with more than 1 char
+will give a "No match" error-reply</li>
+</ul>
+BUGS (which still exists):
+<ol>
+<li>
+It is not possible to add a pbx extention to a stored number.Only possibility:
+call - hang up immediately - redial - options - edit number - correct -
+dial</li>
+
+<li>
+When editing names, after "Done" you're in the standby-mode, instead of
+been put into the names-list. Very annoying when editing much names, one
+after the other.</li>
+
+<li>
+Vcard sent from 7110 to 61x0 with IR: german Umlauts incorrect (i.e. ä
+-> =E4). Works with 61x0 to 7110, 61x0 to 61x0 and 7110 to 7110</li>
+
+<li>
+Received Vcards are stored in the internal Phonememory, even when "SIM-Card"
+is selected.</li>
+
+<li>
+When keying in a character into a textbox (phonebook, WAP) using the num-keys,
+and you want to key in the same character again, you'll have to wait until
+the Cursor jumps to the next position, even when this 2nd input is done
+using the naviroller. This must-wait is not necessary.</li>
+
+<li>
+SMS-alert "Ascending" does not ascend, it is loud from the beginning, just
+longer then standard.</li>
+
+<li>
+Profile name is overwritten by the cell info (displayed in the same line,
+although the display is big enough). On the 6150, 2 lines were used (as
+long as the opeartor logo wasn't enabled).</li>
+
+<li>
+Roller functions set to speeddial - select a name (Number is displayed)
+- dial with pressing the NaviRoller twice shortly doesn't work (only with
+green Key, or pressing the NaviRoller long).</li>
+
+<li>
+Call waiting message is shown on the display, but the phone doesn't beep,
+if number is assigned to caller group with caller logo. If caller group
+logo is turned off, it works correctly.</li>
+
+<li>
+(V4.94 and NEWER) Long names are clipped after the last visible blank space
+since 4.94, if they are too long to display (i.e. in the quick-dial list).
+Formerly the Names were simply clipped on the end of line. It's more 'pretty'
+now, but longer names with same begin can't be told apart any more. Best
+thing would be a automatic adjustion of the fontsize to the textlenght.</li>
+
+<li>
+When the Phonebook is set to be viewed by "Name and Number", it's still
+shown "Name only" when sending a SMS.</li>
+
+<li>
+Press NaviRoller (set to "quick menu") 1x (Messages), press "Write", key
+in something, press "Options" and "Send options" --> not working, you're
+in writing mode again and only writing, deleting and red key are still
+working</li>
+
+<li>
+SMS: blank characters on the begin of a new line are not visible (i.e.
+ASCII-Art SMS)</li>
+
+<li>
+"SMS folders: lists are not sorted They are listed in the order, when the
+SMS have been moved into the folder. But when some SMS have been deleted,
+the 'gaps' are filled first."</li>
+
+<li>
+"Moving and deleting of SMS templates doesn't work.When moving, a copy
+is made. (""Delete"" should not be displayed, and instead of ""move"" ""copy
+"")"</li>
+
+<li>
+Cell Broadcasts: Settings are replacing the SIM-card</li>
+
+<li>
+When the SMS-memory is full, and you try to store another SMS, you'll get
+the errormessage "Sent, no space to copy" (although nothing was sent).</li>
+
+<li>
+When Alarm is on, the phone does a short slight beep at midnight, if it
+is switched off. After that, it can't powered on for about 20 seconds.</li>
+
+<li>
+sending groupgraphics via IR should be possible according to the manual,
+but the menu is missing (via SMS it's ok). Receiving via IR is also not
+possible - only via SMS. With 61x0 sending and receiving via IR works.</li>
+
+<li>
+WAP: In hidden password-inputfields (with *s, like yahoo's email page)
+digits can only be keyed in by pressing the respective key several times,
+and not (like anywhere else) by holding the key for a second.</li>
+
+<li>
+security-level set to "Memory": when viewing the internal phonememory,
+the securitycode should be requested.</li>
+
+<li>
+"After sending DTMF-tones, you cant set the volume. (You'll have to clear
+the digits first, otherwise it acts as Cursormovement, what is not useful
+in DTMF)"</li>
+
+<li>
+After power on, when turning the NaviRoller the first time, or opening
+the slide (without pressing any other key before, so disable PIN), the
+phone beeps shortly. Later, it never beeps when doing this.</li>
+
+<li>
+(V4.88) When turning the NaviRoller while displaying a helpscreen, the
+lights are flickering.</li>
+
+<li>
+NaviRoller as "Quick Menu", on "Home" and "Bookmarks" the right Softkey
+changes from "Exit" to "Back" (like in online-mode), but is without a function
+then.</li>
+
+<li>
+When replying to a SMS, and an other message profile than the standard
+one is selected, the phone numer is not proposed anymore.</li>
+
+<li>
+"Reminders" in te calendar have no alert, even not a time. Was ok on the
+61x0.</li>
+
+<li>
+Calendar-birthdays sent from 61x0 to 7110 with IR: year is not imported
+to the 7110.</li>
+
+<br>Works with 8210 to 7110, 7110 to 7110, 61x0 to 61x0, and 7110 to 61x0.
+<li>
+leap year bug: birthday i.e. on 3.3.2000, remind-date before 28.2. I.e.
+15.2. Store and edit again -> remind-date has changed to 14.2., and with
+every edit one additional day.</li>
+</ol>
+V5.01 08-12-00
+<br>V5.01 09-01-01 (ROM6?)
+<ul>
+<li>
+Optimal Operator name length changed from 10 to 11 characters</li>
+
+<li>
+Enabling of inserting space in subject when writing e-mail via WAP in Australia</li>
+
+<li>
+Improved dual SIM handling</li>
+
+<li>
+New UI Text release</li>
+
+<li>
+Operator list updated</li>
+</ul>
+
+<hr WIDTH="50%">
+<br>BUG: <a href="../netmon/faq_net4.htm#Menu45">Test 45 in NetMonitor</a>
+doesn't work correctly.
+<br>B£¡D: <a href="../netmon/faq_net4.htm#Menu45">Test 45 w monitorze sieci</a>
+nie dzia³a poprawnie.
+<p><b>There are/were also some other bugs. I can't tell, if they're corrected
+or not. If have experiences with it, please report it to me:</b>
+<p><b>WAP</b>: if you have call waiting enabled, use WAP and somebody will
+call to you, he will heard busy signal
+<p><b>Alarm Clock</b>: If the alarm goes when the phone is switched off,
+and the "Snooze" button is pressed, the phone will not turn back on until
+the alarm resounds, or the phone is rebooted.
+<p><b>Phone Book</b>:
+<ol>
+<li>
+When someone calls only the number is displayed. This doesn't happen to
+every name. It also doesn't matter if there are multiple or single entries
+under the name or in which caller group it is. The number's aren't
+in the memory twice. </li>
+
+<li>
+If you use the roller for speed dialing, sometimes when you scroll to a
+number other than the first one and press the green call key, the phone
+automatically phones the number at position one.</li>
+
+<li>
+When using the phonebook with the SIM card, sometimes when trying to select
+a number to dial, the screen goes blank and the phone shuts down. The battery
+needs to remove to get it to work again.</li>
+
+<li>
+How to delete more names from phonebook (the same to roller => select name
+=> Options => Delete => confirm):</li>
+
+<ol>
+<li>
+Names => Delete => One by one</li>
+
+<li>
+First entry of phonebook is shown</li>
+
+<li>
+Select name to delete by roller</li>
+
+<li>
+Press Delete & confirm</li>
+
+<li>
+Goes to 2. (first entry again!!!) instead of printing next name</li>
+</ol>
+</ol>
+<b>Back Light</b>: The back light has been known to refuse to turn off,
+until the battery is removes.
+<p><b>Answer Phone</b>: If you get an answer phone message on line two,
+the phone does not select the correct line as it pretends to, you have
+to select the correct line before attempting to listen to your message.
+<p><b>SMS</b>:
+<ol>
+<li>
+If you write an SMS and then choose options, insert number you can happily
+insert a number that you type, but if you select 'search' to allow you
+to insert a number from the address book the address book is displayed
+but with corrupt menu options and no screen border, the phone crashes and
+requires a reboot. Occasionally it will either a) reboot itself or b) (if
+the Network Monitor is active) perform a memory dump to the screen. The
+phone works fine with the insert name option.</li>
+
+<li>
+E-mail longer than 21 chars in cutted off (checked for 4.77, 4.80, 4.84)</li>
+
+<ol>
+<li>
+Add e-mail longer than 21 chars to some name.</li>
+
+<li>
+Go to: Roller => select the name => Options => Send e-mail.</li>
+
+<li>
+Only first 21 chars is pasted into SMS.</li>
+
+<li>
+Go to: Roller => select the name => Roller => select e-mail entry => Roller
+=> Send e-mail.</li>
+
+<li>
+E-mail is pasted correctly.</li>
+</ol>
+
+<li>
+It's not possible to store logo, graphics or ringtone into SMS inbox, you
+can only send it as SMS (function "Store-to-sms-inbox" is some programs
+doesn't work). Checked for 4.73, 4.76, 4.77</li>
+
+<li>
+When SMS beep (any mode - normal, ascending etc.) is enabled in Silent
+profile, phone doesn't make any sound when the message is received. Checked
+for 4.84</li>
+</ol>
+<b>IRDA</b>:
+<ul>
+<li>
+After ending of data tranfer over IrDA, it's not possible to send SMS over
+IrDA, you have to switch off & on the phone (Palm V on other side).
+Checked for 4.73</li>
+
+<li>
+When you send reminder to Nokia 6110 via IrDa, date of it 1.01.2050...</li>
+</ul>
+<b>Call Standby</b>: When you are on the phone, and someone else tries
+to phone you the phone beeps (Warning tones have to be on) there are three
+ways to deal with this either send the incoming caller to your answer phone,
+hang-up on the current call and take the new on or conference call both
+together. However it has been known that when the current caller hangs
+up, you lose both calls, or at least your can not activate the waiting
+call. and if one person hangs up in conference calling, they all go!
+<p><b>Roller</b>: Assign function "short menu" to roller, press roller,
+go to "menu". There is no menu 11 (SIM toolkit, Paegas Info etc.). Checked
+for 4.73, 4.77, 4.80, 4.84
+<p><b>Vibrating call alert</b>:
+<ol>
+<li>
+If your battery is low, then there isn't enough power to use the Vibrate
+mode so the phone switches it of automatically to save energy. Very Clever.</li>
+
+<li>
+Vibrate ringing sometimes turn on or off even it's disabled/enabled in
+profile. Checked for 4.70, 4.80, 4.84. Solution: enable vibra again, or
+powercycle the phone.</li>
+
+<li>
+No vibrating, although enabled, and even power-cycling doesn't help.</li>
+
+<br>Solution: select an other ringtone in the profiles.</ol>
+<b>Games</b>:
+<ul>
+<li>
+The back light turns off during a games of opposite or racket, even if
+the option is set for the lights to be on.</li>
+
+<li>
+Either the light doesn't turn on at all, or the light switches of in the
+middle of the game.</li>
+</ul>
+<b>Groups</b>: If you assigned downloaded ringtone for caller group and
+deleted if (ringtone) from phone, it stops ring and vibrate. Can't change
+ringtone from phone's menu then (must use Logo Manager or different software).
+Checked for 4.94
+<p><b>Language specific</b>:
+<ol>
+<li>
+When Czech is selected, y' is not in the "standard chars" list. It's in
+"special chars". So you can't type it with pressing 9 & rolling to
+y'. It's correct when Slovak language is selected. Checked for 4.70, 4.80,
+4.84</li>
+
+<li>
+When Czech is selected, it's not possible to look up name starting with
+"Ch" in phone book by typing "ch" in list... Checked for 4.80, 4.84</li>
+
+<li>
+Order of chars on key 3 in Composer is "d, d~, e, e', f, 3" and depends
+on Language settings. Fixed for Czech from 4.76 (correct d, e, f, d~, e',
+3), but Slovak is still broken... Checked for 4.70, 4.73, 4.76, 4.77, 4.80,
+4.84</li>
+</ol>
+<b>Ringtones</b>:
+<ul>
+<li>
+Change of ringtone for group Family returns from menu and it's not possible
+to open this group till next power-on. Checked for 4.77, 4.80, 4.84. Use
+Logomanager to alter the ringtone. this fixes the bug. After using Logomanager
+you can then manually change it via the phone.</li>
+
+<li>
+If you assign downloaded ringtone to group, you have active call waiting
+function and somebody from this group will call to you, you don't have
+info about it. Must assign one original ringtones and then is OK. Checked
+for 4.84</li>
+</ul>
+<b>DLR-3 support and AT (all versions ?):</b>
+<ul>
+<li>
+you have to wait minimum 400 millisecs after DTR drop before you send an
+AT command to the phone or it will hang.</li>
+
+<li>
+earlier firmware versions were unable to return SMS from the phone memory
+but returned the SIM ones.</li>
+</ul>
+</td>
+</tr>
+
+<tr>
+<td><a NAME="7160"></a>7160</td>
+
+<td>NSW-5</td>
+
+<td>*#9999#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V1.05 22-11-00
+<br>V1.07 22-03-01</td>
+</tr>
+
+<tr>
+<td><a NAME="7190"></a>7190</td>
+
+<td>NSB-5 </td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.30 06-11-00</td>
+</tr>
+
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center><p>Here is table describing firmware in various Nokia 8xxx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#8110"></a>8110</td>
+
+<td>NHE-6, NHE-6BX</td>
+
+<td>*#8110#</td>
+
+<td>490137</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.24 13-08-96
+<br>V4.25 09-09-96
+<br>V4.36 23-10-96
+<br>V5.31 06-01-96
+<br>V5.62 05-05-97
+<br>V6.01 27-02-98
+<br>V6.21 16-10-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#8110i"></a>8110i</td>
+
+<td>NHE-6, NHE-6BM</td>
+
+<td>*#8110#</td>
+
+<td>490502</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V24.03 16-07-97
+<ul>
+<li>
+First known version.</li>
+
+<li>
+This version had some problems showing the service provider in the display.
+Instead it showed some empty space. ??? </li>
+</ul>
+V24.04 08-08-97
+<ul>
+<li>
+An updated GSM operators' list.</li>
+
+<li>
+Problem with missing service provider name in display solved.</li>
+</ul>
+V24.11 09-09-97
+<ul>
+<li>
+An updated GSM operators' list.</li>
+</ul>
+V24.23 21-10-97
+<ul>
+<li>
+An updated GSM operators' list.</li>
+</ul>
+V25.00 12-02-98
+<ul>
+<li>
+An updated GSM operators' list.</li>
+
+<li>
+Ringtone 10 was changed..</li>
+</ul>
+V25.10 03-06-98
+<ul>
+<li>
+An updated GSM operators' list.</li>
+</ul>
+V25.20 16-10-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#8146"></a>8146</td>
+
+<td>NHK-6</td>
+
+<td>*#170602112302#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.02 06-02-97
+<br>V5.00 13-03-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#8148"></a>8148</td>
+
+<td>NHK-6</td>
+
+<td>*#8110#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.02 06-02-97
+<br>V5.00 13-03-98</td>
+</tr>
+
+<tr>
+<td><a NAME="#8148i"></a>8148i</td>
+
+<td>NHK-6V</td>
+
+<td>*#8110#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.10 09-12-97</td>
+</tr>
+
+<tr>
+<td><a NAME="#8210"></a>8210</td>
+
+<td>NSM-3</td>
+
+<td>*#0000#</td>
+
+<td>449306</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.08 16-11-99 or 17-11-99
+<br>V5.11 09-12-99
+<br>V5.16 15-02-00
+<p>BUG: When you edit a large SMS, and you move the cursor for about 60-70
+characters, when you stop moving the cursor, and try to write in that place,
+wrote appears 3 spaces in front of the cursor (as if cursor was there,
+but it's not - it's 3 characters behind!). Info from <a href="http://www.zamir.net/~josipm/Nokia/nokiafaq/">jsp_m</a>
+<p>V5.20 17-04-00
+<p>BUGS AVAILABLE:
+<ol>
+<li>
+if someone call from a number that end with "88", you can't see the name
+of caller even if there is a name in memory. Another user claims same problem
+but with number ending with "98".</li>
+
+<li>
+if you activate "silent mode", from power-on key, than receiving a call,
+than come back to "Normal mode", the "ringer" will be to level 1 instead
+of default of 4 or 5</li>
+
+<li>
+Recharge time to much long (5 hours, manual says 2.30 hours) this not a
+bug, really (you can see with netmonitor), during first 2.30 hours there
+is the main recharge of battery (BLB2 Li-Ion 650 mA), and last 2.30 hours
+is a maintenance charge. (this if powered-off phone).</li>
+
+<br>If you recharge with power-on phone, needed time will be 2.30 hours,
+(charge indicators stop flashing)
+<br>If you recharge with power-off phone, needed time will be 5.00 hours,
+(charge indicators stop flashing)
+<li>
+voice tags: somethings, even if voice tags are on phone-memory, (instead
+of SIM-memory), when you change SIM card, you miss all voice tags (deleted).</li>
+
+<li>
+T9: if you should use a different language for menus and T9, every time
+you change the SIM the T9 language are re-setted to menus language.</li>
+</ol>
+V5.21 03-05-00 or 25-04-00
+<ul>
+<li>
+Support for Intel ComboMemory</li>
+
+<li>
+Fixed "buzzing" sound heard sometimes while establishing a call</li>
+</ul>
+
+<p><br>BUG AVAILABLE: If you activate "silent mode", from power-on key,
+than receiving a call, than come back to "Normal mode", the "ringer" will
+be to level 1 instead of default of 4 or 5)
+<p>V5.25 20-09-00
+<ul>
+<li>
+Tone "Orient" replaced with "Moon & Clouds"</li>
+
+<li>
+Improved copying long phonebook entries from SIM to phone (increased speed)</li>
+
+<li>
+Default ringing tone after menu reset was changed into "Ring ring" in every
+PPM package </li>
+
+<li>
+No more than 5 ringing tones (and other OTA things) can be received in
+a row without saving or discarding them </li>
+
+<li>
+Left softkey now activates IR link during incoming datacall</li>
+
+<li>
+Improvement to printing from 7110 to 8210/8850 </li>
+
+<li>
+Datacalls possible after using PC Suite without rebooting the PC </li>
+
+<li>
+Operator list updated </li>
+</ul>
+Info from users: in PL language "Mikrofon wy³±czon" and "Odg³usz"
+<p>V5.26 19-10-00
+<ul>
+<li>
+Corrections to cases where the ringing tone/keypad tone stayed at lowest
+level</li>
+
+<li>
+COLP Note display increased 1.5 s to 30 s (help screens of menus apear
+twice faster than before)</li>
+
+<li>
+Improvements to emergency calls</li>
+
+<li>
+Operator list updated</li>
+</ul>
+
+<p><br>V5.27 16-02-01
+<ul>
+<li>
+Support for DSP code for ROM6 added</li>
+
+<li>
+Earlier, when using PPH-1 in certain circumstances, a tapping sound could
+be heard via loudspeaker</li>
+
+<li>
+Operator name length changed from 10 to 12 characters</li>
+
+<li>
+New text release in use (there was key-9 spelling mistake in Russian language)</li>
+
+<li>
+Earlier in certain circumstances SMS editor was left in a wrong (Unicode)
+mode</li>
+
+<li>
+Operator list updated</li>
+
+<ul>
+<li>
+Operator name changed</li>
+
+<ul>
+<li>
+<tt>Old name New name MNC/MCC</tt></li>
+
+<li>
+<tt>Vodafone Vodafone HU 216/70</tt></li>
+
+<li>
+<tt>GSM-MS1 GSM MS1 218/05</tt></li>
+
+<li>
+<tt>FEast Far East
+250/12</tt></li>
+
+<li>
+<tt>ERA GSM PL ERA GSM 260/02</tt></li>
+
+<li>
+<tt>DIGIFONE IRL Digifone 272/02</tt></li>
+
+<li>
+<tt>Mobilkom FL1
+295/05</tt></li>
+
+<li>
+<tt>MODICOM INA SPICE 404/14</tt></li>
+
+<li>
+<tt>MobileNet INA SPICE 404/31</tt></li>
+
+<li>
+<tt>EAE KSA EAE
+420/07</tt></li>
+
+<li>
+<tt>C&W HKT HK TELECOM 454/00</tt></li>
+
+<li>
+<tt>UNICOM CHN-CUGSM 460/01</tt></li>
+
+<li>
+<tt>GTGSM GH ONEtouch 620/02</tt></li>
+
+<li>
+<tt>Celtel CELTEL GA 628/03</tt></li>
+
+<li>
+<tt>Celtel CELTEL CD 630/02</tt></li>
+
+<li>
+<tt>ANTARIS BUSAFA
+642/02</tt></li>
+</ul>
+
+<li>
+New operator added</li>
+
+<ul>
+<li>
+<tt>Operator name MNC/MCC</tt></li>
+
+<li>
+<tt>ProMonte 220/02</tt></li>
+
+<li>
+<tt>YUG 03 220/03</tt></li>
+
+<li>
+<tt>MONET 220/04</tt></li>
+
+<li>
+<tt>FI AMT 244/14</tt></li>
+
+<li>
+<tt>RUS DTC 250/10</tt></li>
+
+<li>
+<tt>Primtel 250/92</tt></li>
+
+<li>
+<tt>TXXI 250/93</tt></li>
+
+<li>
+<tt>MD MOLDCELL 259/02</tt></li>
+
+<li>
+<tt>Viking 274/04</tt></li>
+
+<li>
+<tt>go mobile 278/21</tt></li>
+
+<li>
+<tt>GEO 03 282/03</tt></li>
+
+<li>
+<tt>TELE GRL 290/01</tt></li>
+
+<li>
+<tt>telecom FL 295/01</tt></li>
+
+<li>
+<tt>Montel 295/02</tt></li>
+
+<li>
+<tt>LI TANGO 295/77</tt></li>
+
+<li>
+<tt>JM DIGICEL 338/50</tt></li>
+
+<li>
+<tt>MPTGSM 414/01</tt></li>
+
+<li>
+<tt>JO MobCom 416/77</tt></li>
+
+<li>
+<tt>MN MobiCom 428/99</tt></li>
+
+<li>
+<tt>IR-TCI 432/11</tt></li>
+
+<li>
+<tt>IR KISH 432/14</tt></li>
+
+<li>
+<tt>BUZTEL 434/01</tt></li>
+
+<li>
+<tt>ISAT M3 510/21</tt></li>
+
+<li>
+<tt>MALITEL ML 610/01</tt></li>
+
+<li>
+<tt>CI CORA 612/01</tt></li>
+
+<li>
+<tt>BF CELTEL 613/02</tt></li>
+
+<li>
+<tt>BJ BENINCELL 616/03</tt></li>
+
+<li>
+<tt>TD CELTEL 622/01</tt></li>
+
+<li>
+<tt>TD LIBERTIS 622/02</tt></li>
+
+<li>
+<tt>CELTEL RC 629/01</tt></li>
+
+<li>
+<tt>CELTEL CD 630/02</tt></li>
+
+<li>
+<tt>CD OASIS 630/89</tt></li>
+
+<li>
+<tt>Safaricom 639/02</tt></li>
+
+<li>
+<tt>UTL_TELECEL 641/11</tt></li>
+
+<li>
+<tt>ZM ZAMCELL 645/01</tt></li>
+
+<li>
+<tt>MG Madacom 646/01</tt></li>
+
+<li>
+<tt>MG ANTARIS 646/02</tt></li>
+
+<li>
+<tt>MTC NAMIBIA 649/01</tt></li>
+
+<li>
+<tt>BW VISTA 652/02</tt></li>
+</ul>
+
+<li>
+Country name changed</li>
+
+<ul>
+<li>
+<tt>Old name New name MCC</tt></li>
+
+<li>
+<tt>H HU
+216</tt></li>
+
+<li>
+<tt>BA BIH
+218</tt></li>
+
+<li>
+<tt>I IT
+222</tt></li>
+
+<li>
+<tt>M MT
+278</tt></li>
+
+<li>
+<tt>FIJ FJ
+542</tt></li>
+
+<li>
+<tt>GO GA
+628</tt></li>
+</ul>
+
+<li>
+New countries added</li>
+
+<ul>
+<li>
+<tt>Country name MCC</tt></li>
+
+<li>
+<tt>JM 338</tt></li>
+
+<li>
+<tt>MM 414</tt></li>
+
+<li>
+<tt>MN 428</tt></li>
+
+<li>
+<tt>IR 432</tt></li>
+
+<li>
+<tt>ML 610</tt></li>
+
+<li>
+<tt>BF 613</tt></li>
+
+<li>
+<tt>BJ 616</tt></li>
+
+<li>
+<tt>TD 622</tt></li>
+
+<li>
+<tt>RC 629</tt></li>
+
+<li>
+<tt>CD 630</tt></li>
+
+<li>
+<tt>ZM 645</tt></li>
+
+<li>
+<tt>MG 646</tt></li>
+
+<li>
+<tt>NA 649</tt></li>
+</ul>
+
+<li>
+Mobile Network Code changed</li>
+
+<ul>
+<li>
+<tt>Old code New code Operator</tt></li>
+
+<li>
+<tt>634/1 634/10 MobiTel</tt></li>
+</ul>
+</ul>
+</ul>
+Here are observations from <a href="http://www.zamir.net/~josipm/Nokia/nokiafaq/">jsp_m</a>:
+<ul>
+<li>
+new <a href="../netmon/faq_net6.htm#Menu140">netmonitor test 140</a></li>
+
+<li>
+no helps in netmonitor</li>
+
+<li>
+net monitor tests cycle much faster now</li>
+
+<li>
+(NEWER TOO ?) BUG:When edit long SMS (about 160 chars) and press Up/Down
+key very long (until will scroll all SMS context - 160 chars) without releasing,
+phone will restart after it - info from SkyBoy</li>
+
+<br>(NOWSZE TE¯ ?) B£¡D: Przy edycji d³ugiego SMSa (oko³o 160 znaków) po
+naci¶niêciu klawisza Góra/Dó³ i przytrzymaniu (bez zwalniania), a¿ ca³y
+SMS (160 znaków) zostanie przewiniêty, telefon zresetuje siê... -
+informacja od SkyBoy</ul>
+V5.28 24-05-01
+<br>V5.28 27-06-2001 (ROM6?)
+<ul>
+<li>
+'Sending picture message' note stays anymore on the screen after the picture
+message has been sent, when there is an incoming call, while sending the
+message</li>
+
+<li>
+New text release: Slovakian key text's alphabet order same as Czech</li>
+
+<li>
+Part of SMS-tone in Class 0 messages was missing. There were two simultaneous
+tones at once (SMS message received and note tone) when Class 0 SMS was
+received</li>
+
+<li>
+In certain situations, when active call was on hold and business card was
+received, the 'Business card received' disappeared too quickly</li>
+
+<li>
+When business cards/calendar notes are sent via IR more characters are
+now received</li>
+
+<li>
+When sending Birthday notes over IR, the year was sometimes received incorrectly
+if the year included 0 (zero)</li>
+
+<li>
+Operator list updated</li>
+
+<ul>
+<li>
+Operator name changed</li>
+
+<ul>
+<li>
+<tt>Old name New name MNC/MCC</tt></li>
+
+<li>
+<tt>Macau SMC SmarTone 455/00</tt></li>
+
+<li>
+<tt>ADAM TIMECel
+502/17</tt></li>
+
+<li>
+<tt>Itineris Orange F 208/01</tt></li>
+
+<li>
+<tt>PL ERA GSM ERA GSM 260/02</tt></li>
+
+<li>
+<tt>B-COM LV TELE2
+247/02</tt></li>
+
+<li>
+<tt>ALJAWWAL ALJAWAL
+420/01</tt></li>
+
+<li>
+<tt>WP-1800 DTAC
+520/18</tt></li>
+
+<li>
+<tt>MG ANTARIS ANTARIS 646/02</tt></li>
+
+<li>
+<tt>Ben-NL Ben NL
+204/16</tt></li>
+
+<li>
+<tt>MOBILAND STA-MOBILAND 213/03</tt></li>
+
+<li>
+<tt>WIND I WIND
+222/88</tt></li>
+
+<li>
+<tt>Connex GSM CONNEX 226/01</tt></li>
+
+<li>
+<tt>DiAx Swiss sunrise 228/02</tt></li>
+
+<li>
+<tt>GLOBTEL SVK GT
+231/01</tt></li>
+
+<li>
+<tt>One ONE
+232/05</tt></li>
+
+<li>
+<tt>one2one One 2 One 234/30</tt></li>
+
+<li>
+<tt>ZAO SMARTS SMARTS 250/07</tt></li>
+
+<li>
+<tt>Kuban-GSM KUGSM
+250/13</tt></li>
+
+<li>
+<tt>VODA M VODAFONE MLA 278/01</tt></li>
+
+<li>
+<tt>AirTel AIRTEL
+404/45</tt></li>
+
+<li>
+<tt>AirTel AIRTEL
+404/49</tt></li>
+
+<li>
+<tt>HK TELECOM CSL
+454/00</tt></li>
+
+<li>
+<tt>HK SMC HK SMARTONE 454/06</tt></li>
+
+<li>
+<tt>KGT-ONLINE KGT-Online 466/88</tt></li>
+
+<li>
+<tt>Hello HELLO
+520/23</tt></li>
+
+<li>
+<tt>TT TUNTEL
+605/02</tt></li>
+
+<li>
+<tt>Alize ALIZE
+608/01</tt></li>
+
+<li>
+<tt>Omega OMEGA
+618/01</tt></li>
+
+<li>
+<tt>Rwandacell R-CELL 635/10</tt></li>
+
+<li>
+<tt>KenCell KENCELL
+639/03</tt></li>
+
+<li>
+<tt>SFR RU SFR REUNION 647/10</tt></li>
+
+<li>
+<tt>CelTel CELTEL
+650/10</tt></li>
+</ul>
+
+<li>
+New operator added</li>
+
+<ul>
+<li>
+<tt>Operator name MNC/MCC</tt></li>
+
+<li>
+<tt>ARIA 286/03</tt></li>
+
+<li>
+<tt>Macau SMC 455/00</tt></li>
+
+<li>
+<tt>HT Macau 455/03</tt></li>
+
+<li>
+<tt>NE CELTEL 614/02</tt></li>
+
+<li>
+<tt>FI 2G 244/12</tt></li>
+
+<li>
+<tt>NTC 250/16</tt></li>
+
+<li>
+<tt>FO FT-GSM 288/01</tt></li>
+
+<li>
+<tt>SPACETEL 421/02</tt></li>
+
+<li>
+<tt>LIPPO TEL 510/08</tt></li>
+
+<li>
+<tt>SGP-M1-3GSM 522/04</tt></li>
+
+<li>
+<tt>LIBERTIS 628/01</tt></li>
+
+<li>
+<tt>SPACETEL BI 642/01</tt></li>
+</ul>
+
+<li>
+Country name changed</li>
+
+<ul>
+<li>
+<tt>Old name New name MCC</tt></li>
+
+<li>
+<tt>UKR UA
+255</tt></li>
+
+<li>
+<tt>FR FO
+288</tt></li>
+
+<li>
+<tt>MDG BI
+642</tt></li>
+</ul>
+
+<li>
+New countries added</li>
+
+<ul>
+<li>
+<tt>Country name MCC</tt></li>
+
+<li>
+<tt>NE 614</tt></li>
+
+<li>
+<tt>YE 421</tt></li>
+</ul>
+
+<li>
+Mobile Network Code changed</li>
+
+<ul>
+<li>
+<tt>Old code New code Operator</tt></li>
+
+<li>
+<tt>338/50 338/05 JM DIGICELL</tt></li>
+</ul>
+</ul>
+</ul>
+Here are observations from <a href="http://www.zamir.net/~josipm/Nokia/nokiafaq/">jsp_m</a>:
+<ul>
+<li>
+no helps in netmonitor</li>
+
+<li>
+no more "Pending" delivery reports (?)</li>
+</ul>
+V5.29 18-09-01
+<ul>
+<li>
+Improved network scanning (Earlier when the phone was out of network coverage
+and keys were pressed too fast, in some cases the phone made a reset, because
+each key press caused a network search. Now key presses cause a new network
+search only once a minute) </li>
+
+<li>
+Operator list updated</li>
+
+<ul>
+<li>
+Operator name changed</li>
+
+<ul>
+<li>
+Old name New name MNC/MCC</li>
+
+<li>
+ONE one 232/05</li>
+
+<li>
+ERA GSM era 260/02</li>
+
+<li>
+TH WCS TH ORANGE 520/10</li>
+
+<li>
+Dutchtone Orange NL 204/20</li>
+
+<li>
+TDK-MOBIL DK TDC 238/01</li>
+
+<li>
+M.PLUS BATELCO 426/01</li>
+
+<li>
+CAMNET MTN CAM 624/01</li>
+
+<li>
+CELLCO CELLCO GSM 630/04</li>
+</ul>
+
+<li>
+New operators added</li>
+
+<ul>
+<li>
+Operator name MNC/MCC</li>
+
+<li>
+ORENSOT 250/11</li>
+
+<li>
+VODAFONE 276/02</li>
+
+<li>
+TR AYCELL 286/04</li>
+
+<li>
+CU/C_COM 368/01</li>
+
+<li>
+U-CALL 539/01</li>
+
+<li>
+GAB TELECEL 628/02</li>
+
+<li>
+CELLCO 630/05</li>
+
+<li>
+Digicel 706/02</li>
+
+<li>
+SPACETEL 417/02</li>
+
+<li>
+VUT SMILE 541/01</li>
+
+<li>
+GH-MOBITEL 620/03</li>
+
+<li>
+DIGITEL 515/05</li>
+
+<li>
+ORANGE 520/99</li>
+
+<li>
+ECONET NG 621/20</li>
+
+<li>
+COG LIBERTIS 629/10</li>
+
+<li>
+MOBITEL - TZ 640/02</li>
+
+<li>
+CELTEL TZ 640/05</li>
+
+<li>
+Itineris RUN 647/00</li>
+
+<li>
+F-OMT 647/02</li>
+
+<li>
+Cell C 655/07</li>
+</ul>
+
+<li>
+Country name changed</li>
+
+<ul>
+<li>
+Old name New name MCC</li>
+
+<li>
+NIG NG 255</li>
+
+<li>
+F REU 647</li>
+</ul>
+
+<li>
+New countries added</li>
+
+<ul>
+<li>
+Country name MCC</li>
+
+<li>
+CU 368</li>
+
+<li>
+VUT 417</li>
+</ul>
+
+<li>
+Mobile Network Code changed</li>
+
+<ul>
+<li>
+Old code New code Operator</li>
+
+<li>
+621/00 621/30 MTN NG</li>
+
+<li>
+634/10 634/01 MobiTel</li>
+</ul>
+</ul>
+</ul>
+V5.30
+<ul>
+<li>
+Improvement to eliminate horizontal black line across the display when
+the phone is switched off </li>
+
+<li>
+Operator list updated </li>
+</ul>
+
+<hr WIDTH="50%">
+<br>In netmonitor (all versions ?) in <a href="../netmon/faq_net4.htm#Menu55">test
+55</a> you have small type (one 's' too much in last line) in help and
+info displayed in first line only
+<p>On some V 5.11 and 5.16 once you have missed the signal, the phone make
+difficult to re-sync it, and you must turn off and then on to re-sync.
+This is no a bug of this firmware, because there are many 8210 v5.11 and
+5.16 that works much-fine
+<p>Another bug (feature ? ;-)): when save Name entry to phonebook in phone's
+memory, you see "Saved to phone" display. It has icon from older Nokia
+phones (unchanged) - phone with the antenna drawn...
+<p>Bug (all versions ? - tested for 5.25): when send too long ringtone
+for phone, in "preview" menu it's cut and played, after saving to location
+playes only one note...</td>
+</tr>
+
+<tr>
+<td><a NAME="8250"></a>8250</td>
+
+<td>NMS-3D</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.12 19-01-01
+<br>V3.08 13-12-00
+<p>V3.12
+<p>Improvements in Irda and activating voice dial via on/off button in
+HDC-5...
+<p>V3.18 03-04-01
+<p>Improvements in Irda, SIM Toolkit, OTA calendar notes...
+<p>V3.20 29-05-01
+<p>Better support for Nokia PC Suite over IrDA
+<p>V5.00 16-09-01</td>
+</tr>
+
+<tr>
+<td><a NAME="8290"></a>8290</td>
+
+<td>NSB-7</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V5.07 08-08-00
+<br>V5.06 19-06-00
+<br>V5.15 30-01-01</td>
+</tr>
+
+<tr>
+<td><a NAME="8310"></a>8310</td>
+
+<td>NHM-7</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V2.90 08-09-01
+<br>V3.05 23-09-01
+<br>V3.07
+<br>
+Improvements in voice recorder stability
+<br>
+Improvements in SIM card reading stability
+<br>
+Improvements in SIM Application toolkit dynamic menu
+<br>
+Improvements in SEND USSD
+<br>
+Changes to meet some test cases
+<p>V4.04
+<ul>
+<li>
+Call and network management: </li>
+
+<ul>
+<li>
+Operator name not shown if service provider name has the priority </li>
+
+<li>
+UCS2 support for service provider name added </li>
+
+<li>
+CPHS feature: operator name reading from SIM support added </li>
+
+<li>
+Exception handling for Operator name showing improved </li>
+
+<li>
+Minor improvements to multi call handling </li>
+</ul>
+
+<li>
+GPRS: </li>
+
+<ul>
+<li>
+Handling of GPRS indicators improved </li>
+
+<li>
+Block Check Sum error while using CS2. Values of the spare bit field are
+changed to mach all network implementations </li>
+
+<li>
+Cell re-selection in case of lost of service </li>
+
+<li>
+Occasional service drop while Extended BCCH blocks used </li>
+
+<li>
+MT call failures, while Extended Paging used </li>
+
+<li>
+Old TLLI deleted too early, causing breaks in data transmission </li>
+</ul>
+
+<li>
+Phonebook: </li>
+
+<ul>
+<li>
+Improvements to search functionality </li>
+
+<li>
+Improvements to caller group logo sending and receiving </li>
+
+<li>
+Improvements to Service Dialling Numbers </li>
+
+<li>
+Minor improvements to phone number showing </li>
+</ul>
+
+<li>
+Messages: </li>
+
+<ul>
+<li>
+Stability improvements to message erasing and picture message handling </li>
+
+<li>
+Voice mailbox improvements </li>
+</ul>
+
+<li>
+Call Register:</li>
+
+<ul>
+<li>
+Lists cleaned if new SIM card used </li>
+
+<li>
+AoC Currency showing and default limits showing improved </li>
+</ul>
+
+<li>
+Profiles and settings: </li>
+
+<ul>
+<li>
+Ringing tone order changed </li>
+
+<li>
+Improvements to OTA ringing tone handling </li>
+
+<li>
+Louder alarm tone </li>
+
+<li>
+Fixed dialling number stability improvements </li>
+
+<li>
+Help text for fixed dialling numbers added </li>
+
+<li>
+Hands free indicator didnåt disappear in some cases </li>
+
+<li>
+Minor improvements to Automatic language selection </li>
+</ul>
+
+<li>
+Games and calculator: </li>
+
+<ul>
+<li>
+Snowboard game added </li>
+
+<li>
+Game tones follow only the games tone setting </li>
+
+<li>
+Exception handling in high score sending improved </li>
+
+<li>
+Improvements to lights handling and some text modifications </li>
+
+<li>
+Minor calculator look&feel improvements </li>
+</ul>
+
+<li>
+To-do list and calendar: </li>
+
+<ul>
+<li>
+Minor look&feel To-do-list improvements </li>
+
+<li>
+Some text and look&feel improvements e.g. current date highlighting </li>
+</ul>
+
+<li>
+Radio and extras: </li>
+
+<ul>
+<li>
+Exception handling of radio improved </li>
+
+<li>
+Font modifications in Countdown timer </li>
+
+<li>
+Indexing in Voice recordings list improved </li>
+
+<li>
+Stability improvements to voice recorder alarm support </li>
+
+<li>
+Voice recognition can be activated only when in idle mode </li>
+
+<li>
+Exception handling in voice commands and voice recorder improved </li>
+</ul>
+
+<li>
+Services and SIM toolkit: </li>
+
+<ul>
+<li>
+Header lines added to services </li>
+
+<li>
+Improvements to Send USSD functionality </li>
+
+<li>
+SIM ATK CB download support added </li>
+</ul>
+
+<li>
+WAP push: </li>
+
+<ul>
+<li>
+16-bit characters in title corrected and some denial of service vulnerabilities
+corrected </li>
+
+<li>
+Manual login mode Now possible also with GPRS </li>
+
+<li>
+Screen backlight turned on when username/p@ss word prompt displayed </li>
+</ul>
+
+<li>
+WAP bookmarks and cookies: </li>
+
+<ul>
+<li>
+Some denial of service vulnerabilities corrected </li>
+
+<li>
+Problems with maximum length of bookmark URLÃ¥s corrected </li>
+
+<li>
+In certain WAP pages Cookies were causing problems </li>
+
+<li>
+Over the air (OTA) set-up: Mal formatted set-up messages were causing problems
+while viewing the set-up content </li>
+
+<li>
+WTAI public library: </li>
+
+<li>
+GPRS PDP Context unnecessarily closed after mobile originated voice call </li>
+
+<li>
+Voice call establishment from WAP bookmarks corrected </li>
+</ul>
+
+<li>
+Error messages: </li>
+
+<ul>
+<li>
+"Unknown abort" messages correctly mapped to descriptive error notes </li>
+
+<li>
+Two separate error messages displayed next to each other </li>
+
+<li>
+Viewing business card through WAP: </li>
+
+<li>
+Icons corrected for WORK and CELL numbers </li>
+</ul>
+
+<li>
+WML Scripting: </li>
+
+<ul>
+<li>
+Problems with pressing End key while script were running corrected </li>
+
+<li>
+WML variables now updated correctly while WML script is running </li>
+</ul>
+
+<li>
+Other changes: </li>
+
+<ul>
+<li>
+Support for new languages / market areas added </li>
+
+<li>
+5 Volt SIM cards blocked by 8310, ref. GSM 11.12 section 4.5. 'SIM card
+not supported' text displayed </li>
+
+<li>
+CPHS support improved </li>
+
+<li>
+Plug-in HF Car Kit PPH-1 recognition improved </li>
+
+<li>
+Showing of battery low warning note improved </li>
+
+<li>
+Several text, font and other minor look&feel improvements</li>
+
+<li>
+Several minor stability improvements </li>
+</ul>
+</ul>
+V4.53
+<ul>
+<li>
+Call and network management: </li>
+
+<ul>
+<li>
+Private in Conference call improvement </li>
+
+<li>
+Speed dial number recognition improvement </li>
+
+<li>
+AoC improvements </li>
+
+<li>
+Field strength signal bar configuration changed </li>
+
+<li>
+"SIM card registration failed" text added in the case when IMSI not found
+in HLR </li>
+</ul>
+
+<li>
+GPRS: </li>
+
+<ul>
+<li>
+Improvements in inter-SGSN RAU/unexpected N-PDU functionality </li>
+
+<li>
+Continuous timing advance improvement </li>
+
+<li>
+Improvements in handling of Extended BCCH </li>
+
+<li>
+Improvements in combined attach in network mode I </li>
+
+<li>
+Always online functionality changed: When Always online is selected from
+WAP settings and the phone is powered up only GPRS attach is performed
+PDF context is made when the user makes WAP over GPRS connection and context
+is deactivated when user exists the WAP browser </li>
+
+<li>
+Recommended PBCCH/PCCCH feature set activated, Nokia has tested the Recommended
+PCCCH Feature Set functionality against basic configurations available
+in IOT laboratories</li>
+</ul>
+
+<li>
+WAP: </li>
+
+<ul>
+<li>
+Improvement to OTA bookmarks </li>
+
+<li>
+Bookmark sending fails when SMS center number is not given in advance </li>
+
+<li>
+Problems when entering maximum length bookmarks </li>
+
+<li>
+Improvement to bitmap downloading </li>
+
+<li>
+WAP over GPRS with manual login improvement </li>
+
+<li>
+WAP Push </li>
+
+<li>
+Unicode support added to WAP Push Messages </li>
+
+<li>
+Push message reception by default ON </li>
+
+<li>
+GPRS related corrections </li>
+
+<li>
+Corrections to end-key functionality when having voice call during WAP
+browsing </li>
+
+<li>
+Support for WTAI-call from bookmarks </li>
+</ul>
+
+<li>
+DATA: </li>
+
+<ul>
+<li>
+Improvements to AT-command interpreter: ATZ, AT&F, +CGDCONT, +CGQMIN
+and +CGQREQ, ATE, AT+CREG, AT*99#, AT&V </li>
+
+<li>
+Change in handling of GPRS dial-up when CSD dial-up is active </li>
+
+<li>
+Correction to WAP connection over CSD </li>
+
+<li>
+Improvement in resetting of CID values </li>
+
+<li>
+Improvement in V.120 data call </li>
+</ul>
+
+<li>
+Phonebook: </li>
+
+<ul>
+<li>
+Improvements when copying entries </li>
+
+<li>
+Improvements in Pop-up search (mainly in APAC languages) </li>
+
+<li>
+Improvements when browsing phonebook memory </li>
+
+<li>
+Hungarian and Slovak alpha order improvements </li>
+</ul>
+
+<li>
+Games: </li>
+
+<ul>
+<li>
+Menu shortcuts added to games </li>
+
+<li>
+Score Sending removed from Snowboard </li>
+
+<li>
+Minor game functionality improvements </li>
+</ul>
+
+<li>
+Messages: </li>
+
+<ul>
+<li>
+Message waiting indicators improvements (CPHS) </li>
+
+<li>
+Voice mailbox number saving to SIM (CPHS) </li>
+
+<li>
+Corrections in languages with Unicode characters </li>
+
+<li>
+Stability and look improvements in SMS editor </li>
+
+<li>
+Cell broadcast improvement with GPRS Always online </li>
+</ul>
+
+<li>
+Other changes: </li>
+
+<ul>
+<li>
+Opening and closing parenthesis correction in Hebrew </li>
+
+<li>
+Improvements in SIM ATK </li>
+
+<li>
+Improvements in handling line 2 (ALS) </li>
+
+<li>
+Voice volume control corrections </li>
+
+<li>
+Caller Group Ringing Tone correction </li>
+
+<li>
+Improvements to operator name display </li>
+
+<li>
+NITZ improvements </li>
+</ul>
+</ul>
+</td>
+</tr>
+
+<tr>
+<td><a NAME="#8810"></a>8810</td>
+
+<td>NSE-6</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.01 08-07-98
+<br>V4.03 10-08-98
+<br>V4.05 26-11-98
+<br>V5.00 29-09-99
+<br>V6.02 31-03-00
+<ul>
+<li>
+improvements in displaying CB</li>
+
+<li>
+improvements in calendar - non lap year</li>
+
+<li>
+....</li>
+</ul>
+
+<hr WIDTH="50%">
+<br>BUG: Some older/all (?) firmware had bug in Calendar in Birthday option:
+it it was set to the last day of February on non-leap-years (for example
+29.02.2000), calendar will inform about it 1'st March (1.03.2000). Must
+use "Reminder" instead of "Birthday".</td>
+</tr>
+
+<tr>
+<td><a NAME="#8850"></a>8850</td>
+
+<td>NSM-2</td>
+
+<td>*#0000#</td>
+
+<td>448901</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">Look to the info for Nokia 8210 - they have almost identical
+firmware (with some details)</td>
+</tr>
+
+<tr>
+<td><a NAME="#8890"></a>8890</td>
+
+<td>NSB-6</td>
+
+<td>*#0000#</td>
+
+<td></td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V11.01 14-02-00
+<br>V12.05 22-05-00
+<br>V12.07 08-08-00
+<br>V12.15 21-02-01
+<ul>
+<li>
+Improvements to USSD</li>
+
+<li>
+RELEASE COMPLETE message is sent to network to end the USSD dialogue, when
+a NULL USSD string is received from UI</li>
+
+<li>
+Releasing USSD dialogue with 'Back' softkey fixed</li>
+
+<li>
+Cell selection improved (Sometimes it took long time for the phone to acquire
+the network when the phone was out of coverage for long time)</li>
+
+<li>
+Improvements to IrDA (IrPhonet fixed)</li>
+
+<li>
+Improvements to SIM Application toolkit (handling of Provide Local Information
+improved, handling of Setup Call Redial improved)</li>
+
+<li>
+Handling of downloaded ringtone improved</li>
+
+<li>
+Strange characters are not displayed (when the special character screen
+was not full, highlighting the last characters caused strange characters
+displayed on the screen)</li>
+
+<li>
+Improvement to handling of IR (Left softkey didn't activate IR-link while
+incoming data call)</li>
+
+<li>
+Calling Name Presentation (CNAP) supplementary service support added</li>
+
+<li>
+Caller group list feature added</li>
+
+<li>
+Czech and Russian removed from PPM package D</li>
+
+<li>
+New PPM package G created with languages English, German, Czech and Russian</li>
+</ul>
+V12.20
+<ul>
+<li>
+Plug-in HF Car Kit PPH-1 </li>
+
+<ul>
+<li>
+Audio tasks changed. There was incorrect handling of the case when accessory
+was off </li>
+</ul>
+
+<li>
+SIM card </li>
+
+<ul>
+<li>
+Sometimes there was an 'insert SIM card' error, if connection to SIM were
+lost for more than approximately 30 seconds e.g. because of movement of
+the battery. Now if last indication from SIM to phone is "SIM removed",
+then the phone does not care about the SIM init failed indication </li>
+</ul>
+
+<li>
+HPLMN </li>
+
+<ul>
+<li>
+Phone lost service after HPLMN search, because it did not notice the situation,
+where only forbidden location areas were found in periodic HPLMN search.
+Checking has been modified, when HPLMN is on the list. </li>
+</ul>
+
+<li>
+Phone reset </li>
+
+<ul>
+<li>
+When phone was out-of-coverage, excessive searching caused reset. Now searching
+mechanism has been modified </li>
+</ul>
+
+<li>
+Emergency call </li>
+
+<ul>
+<li>
+Changes in Current country indication. It was not possible to make an emergency
+call to a special emergency call number (e.g. 999), after phone was switched
+on in a new country, before current country was told to the phone. </li>
+</ul>
+
+<li>
+Multiparty call </li>
+
+<ul>
+<li>
+During call clearing multiparty connections were checked. Now if only one
+connection in multiparty is found, its multiparty status is cleared </li>
+</ul>
+
+<li>
+SMS </li>
+
+<ul>
+<li>
+There was wrong time in SMS report. Pending status has been now changed </li>
+
+<li>
+Part of SMS-tone in cl@ss 0 message was not heard, because there were two
+simultaneous tones at once (SMS message received and note tones). The message
+received information note has been changed now into a note without tone </li>
+</ul>
+
+<li>
+Picture message </li>
+
+<ul>
+<li>
+Sending picture message note stayed on screen after sending. Sending control
+has been changed now </li>
+</ul>
+
+<li>
+Phonebook </li>
+
+<ul>
+<li>
+Phone number comparison has been decreased from 10 digits to 7 digits </li>
+</ul>
+
+<li>
+Calendar </li>
+
+<ul>
+<li>
+Calendar Item sending via SMS/IR did not work correctly (characters were
+lost). The definition of note length has been changed now </li>
+</ul>
+
+<li>
+Calendar/IR </li>
+
+<ul>
+<li>
+Year of birth was miscalculated when it was sent via IR, when the year
+contained zeroes (e.g. 1970, 2000 etc). Decoding variables has been changed
+now </li>
+</ul>
+
+<li>
+Voice dialling </li>
+
+<ul>
+<li>
+Voice dialling did not work when headset was connected and the phone was
+in sleep mode. Now polling of voice tapping is removed, when headset is
+connected </li>
+</ul>
+
+<li>
+Operator names and wake-up graphics has been updated </li>
+
+<li>
+Email over SMS -feature added </li>
+
+<ul>
+<li>
+Possibility to add an email address to up to 50 phone book entries </li>
+
+<li>
+When you want to send an email, scroll through the phone book to the names
+with the @ symbol. This is network dependent service</li>
+</ul>
+
+<li>
+Service menu </li>
+
+<ul>
+<li>
+Service (TTML browser) main menu removed </li>
+</ul>
+</ul>
+</td>
+</tr>
+
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="firmware.htm#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="firmware.htm#2">Ogólne informacje o IMEI/General info about
+IMEI</a></b></li>
+
+<li>
+<b><a href="firmware.htm#3">Czy mogê wgraæ sobie oprogramowanie/Can I download
+firmware to my phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#6">Jakie s± b³êdy/zmiany w kolejnych wersjach
+?/What are bugs/changed things in next versions ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#7">Jak zmieniæ wersjê jêzykow±?/How to change
+language in phone ?</a></b></li>
+
+<li>
+<b><a href="firmware.htm#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<center><p>Here is table describing firmware in various Nokia 9xxx phones
+<br>You can also see table for
+<br><a href="firm12.htm">Nokia 1xxx/2xxx</a>, <a href="firm3.htm">Nokia
+3xxx</a>, <a href="firm5.htm">Nokia 5xxx</a>, <a href="firm6_1.htm">Nokia
+60xx/61xx</a>,
+<br><a href="firm6_2.htm">Nokia 62xx/63xx/65xx</a>, <a href="firm7.htm">Nokia
+7xxx</a>, <a href="firm8.htm">Nokia 8xxx</a>, <a href="firm9.htm">Nokia
+9xxx</a></center>
+
+<table BORDER WIDTH="100%" >
+<tr>
+<th ALIGN=LEFT WIDTH="340" HEIGHT="46"><b>Phone (telefon)</b></th>
+
+<th ALIGN=LEFT WIDTH="429" HEIGHT="46"><b>Model number (Oznaczenie)</b></th>
+
+<td><b>Firmware version code (kod do sprawdzania wersji oprogramowania)</b></td>
+
+<td><b>TAC in IMEI (TAC w IMEI)</b></td>
+</tr>
+
+<tr>
+<td><a NAME="#9000"></a>Communicator 9000</td>
+
+<td>RAE-1</td>
+
+<td>*#682371158412125#</td>
+
+<td>490169</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V4.01 15-09-97
+<br>V4.55 04-02-97
+<br>
+<hr WIDTH="50%">
+<br>Some older firmware had BUG: When phone received SMS, it didn't display
+correctly its' date, if it was after 1.1.2000
+<p>Some older/all (?) firmware had BUG: in sleep mode after 28.02 change
+date change always to 1.03 (not to 29.02 in non-leap-years). Date must
+be set manually then.</td>
+</tr>
+
+<tr>
+<td><a NAME="#9000i"></a>Communicator 9000i</td>
+
+<td>RAE-4</td>
+
+<td>*#682371158412125#</td>
+
+<td>490169</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V6.34 16-09-97
+<br>V6.51 02-02-98
+<br>V6.70 15-07-98
+<br>
+<hr WIDTH="50%">
+<br>Some older/all (?) firmware had BUG: in sleep mode after 28.02 change
+date change always to 1.03 (not to 29.02 in non-leap-years). Date must
+be set manually then.</td>
+</tr>
+
+<tr>
+<td><a NAME="#9000il"></a>Communicator 9000il</td>
+
+<td>GE-9</td>
+
+<td>*#682371158412125#</td>
+
+<td>010024</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V6.34 16-09-97
+<br>
+<hr WIDTH="50%">
+<br>Some older/all (?) firmware had BUG: in sleep mode after 28.02 change
+date change always to 1.03 (not to 29.02 in non-leap-years). Date must
+be set manually then.</td>
+</tr>
+
+<tr>
+<td><a NAME="#9110"></a>Communicator 9110</td>
+
+<td>RAE-2</td>
+
+<td>*#0000#</td>
+
+<td>490143, 490543</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V3.07 17-01-99
+<br>V4.01 02-02-99
+<br>(???)V4.05 19-03-99
+<p>V4.15:
+<p>(V4.02) In clock application, home contry 'United Kingdom' is shown
+completely.
+<br>(V4.02) Careline numbers updated.
+<br>(V4.02) Apostrofe to Finnish keyboard.
+<br>(V4.02) Numbers in French keyboard.
+<br>(V4.02) Home country list changed.
+<br>(V4.02) Internet access improvements in some IAPs.
+<br>(V4.02) Print settings improvements in image printing.
+<br>(V4.02) Composed tunes can be sent via SMS also if contact selected
+from SIM.
+<br>(V4.02) WWW performance improvements.
+<br>(V4.02) Keyboard scanning times adjusted.
+<br>(V4.02) BIOS v2.22
+<p>V5.01 08-06-99
+<ul>
+<li>
+Improvements for audio in car kit use. </li>
+
+<li>
+Backlight is deactivated when locked device is removed from cradle. </li>
+
+<li>
+Empty list situation, in list of own numbers-application, now handled correctly. </li>
+</ul>
+V5.02 28-08-99
+<br>V5.06 09-12-99
+<br>V5.10 06-10-00
+<br>
+<hr WIDTH="50%">
+<br>After receiving some Smart Messaging SMS in older/all (?) firmware
+versions the communicator-side changes to mail-application <b>WITHOUT ANY
+SIGN</b> of a received SMS. </td>
+</tr>
+
+<tr>
+<td><a NAME="9210"></a>Communicator 9210</td>
+
+<td>RAE-3</td>
+
+<td>*#0000# (?)</td>
+
+<td>350149 (Finland)</td>
+</tr>
+
+<tr>
+<td COLSPAN="4">V2.91P 12-03-01
+<br>V2.97 02-04-01
+<br>V3.03 25-04-01
+<br>V3.18 05-06-01
+<br>V3.54 05-07-01
+<ul>
+<li>
+Perbaikan untuk membuka email yang sudah didelete secara lokal</li>
+
+<li>
+Call masuk tidak berbunyi di PDA setelah reboot</li>
+
+<li>
+Perbaikan di bagian contact sehingga bisa menampung banyak nomor telephone,
+sebelumnya bisa jadi hang</li>
+
+<li>
+PDA bisa dikunci tanpa password</li>
+
+<li>
+Autolock UNtuk interval "1 minute" and "2 minutes" tidak bekerja</li>
+
+<li>
+PIN di SIM hanya ditanyakan pada telephone di bagian luar tidak di PDA</li>
+
+<li>
+PIN Code diminta 2 kali</li>
+
+<li>
+Aplikasi SMS langsung ditutup setelah mengirim SMS sebagai reply</li>
+
+<li>
+Layar tidak menjadi blank ketika autolock aktif</li>
+
+<li>
+Call masuk tanpa nomor ringtone yang dimainkan hanya Nokia Tune</li>
+
+<li>
+Proses restore berhenti ketika ada call masuk.</li>
+</ul>
+V3.62:
+<ul>
+<li>
+Device reset improved (In some cases device did not restart when battery
+was removed)</li>
+
+<li>
+Network tone routing improved (When PDA cover was open, all network tones
+were not routed correctly to Hands Free Speaker)</li>
+
+<li>
+The User Busy (Engaged) Tone playtime changed (When a call is made to busy
+number User Busy Tone playtime is longer)</li>
+
+<li>
+Java Telephone API tests improved</li>
+
+<li>
+SMS alphanumeric address improvement (SMS message sender name is shown
+correctly also when name is used as sender instead of number)</li>
+
+<li>
+PDA Telephone displays call even phone is idle (PDA display was sometimes
+showing call active even though call ended from phone side)</li>
+
+<li>
+Timer improved (Ocassionally jamming in games reduced by improved timers)</li>
+</ul>
+V4.13
+<ul>
+<li>
+General stability improvements </li>
+
+<li>
+SIM card detection improvement </li>
+
+<li>
+Call costs management improvement </li>
+
+<li>
+PIN code request handling improvement </li>
+
+<li>
+Volume control was not working in CMT if you got "missed calls" when answering
+a call </li>
+
+<li>
+Call register (recent calls) functionality improved and lists length reduced </li>
+
+<li>
+Device lock functionality improvement </li>
+
+<li>
+When Clock alarm was deactivated on PDA side, CMT light was not switched
+off </li>
+
+<li>
+Deactivation of keypad lock produces squares to screen</li>
+
+<li>
+Receiving and saving cl@ss 0 messages improvement</li>
+
+<li>
+Messages were able to sent to number in Tel field (not only Tel GSM) </li>
+
+<li>
+Memory management improvement </li>
+
+<li>
+Clock Time management improvement </li>
+
+<li>
+Keypad lock functionality improvement </li>
+
+<li>
+Power reset management improvement </li>
+
+<li>
+Speed dialling functionality improvement </li>
+
+<li>
+Call divert indicator behaviour improvement </li>
+
+<li>
+Ringing tone functionality improvement </li>
+
+<li>
+Charging functionality improvement </li>
+
+<li>
+SIM lock functionality improvement </li>
+
+<li>
+Formatting + application installation behaviour improvement </li>
+
+<li>
+ALS: Activating/Deactivating call waiting for Line2 correction </li>
+
+<li>
+Backup restore functionality to/from memory card improvement </li>
+
+<li>
+World clock time zones updated </li>
+
+<li>
+FDN location numbers modified </li>
+
+<li>
+Spanish version: Event entries can now be cleared from log </li>
+
+<li>
+Now all stored numbers on SIM card are displayed </li>
+
+<li>
+UI texts (incl. Notes and error messages and help texts) updated </li>
+
+<li>
+Incoming SMS with sender number is now displayed correctly </li>
+
+<li>
+Voice mailbox list functionality improvement </li>
+
+<li>
+Line Selection functionality improvement </li>
+
+<li>
+Turkish special character conversion in Mail sending improvement </li>
+
+<li>
+Copy message centre number from SIM improvement </li>
+
+<li>
+Self made profile functionality improvement (in some situations you were
+not able to activate or delete self made profile) </li>
+
+<li>
+Nokia Tune is not played in Meeting profile anymore </li>
+
+<li>
+'Conference commands' button not anymore dimmed when calling to busy number </li>
+
+<li>
+Phone number max length set now correctly when response is received from
+SIM </li>
+
+<li>
+WAP: Image loading improvement </li>
+
+<li>
+WWW: default value for "Empty history on exit" changed to "Yes" </li>
+
+<li>
+WAP Browser accepts now also source port 66 </li>
+
+<li>
+Printing: Page setup improvement </li>
+
+<li>
+Functionality of short message with alphanumeric address in From field
+improvement </li>
+
+<li>
+WAP mail functionality improvement </li>
+
+<li>
+SMS functionality improved (includes several minor improvements e.g. Reading
+SIM messages, deleting concatenated SMS handled better, SMS sending from
+outbox etc.) </li>
+
+<li>
+Web: In some situations the file download was done twice, now it is done
+only once </li>
+
+<li>
+WAP OTA message settings can now be saved </li>
+
+<li>
+WAP: Prefix "https://" URL handling improvement </li>
+
+<li>
+Calendar booking functionality improved </li>
+
+<li>
+Character conversion between GSM alphabet and Unicode improvement </li>
+
+<li>
+Email: Move and copy & some other functionality in IMAP remote mailbox
+improvement </li>
+
+<li>
+PPP call-back idle timeout is increased </li>
+
+<li>
+Word Processor does not save unnecessary extra empty document anymore </li>
+
+<li>
+Memory handling improvement </li>
+
+<li>
+WAP OTA Setting Home page is now using the correct access point </li>
+
+<li>
+Creating folders in remote IMAP4 inbox is now possible </li>
+
+<li>
+The maximum size per message field is not applicable, when "Get mail" is
+defined to fetch "message titles and stay online". The option is now dimmed
+in this situation </li>
+
+<li>
+WAP: Scandinavian character support in WAP mail sending improvement </li>
+
+<li>
+WEB/PPP: Authentication to PPP-servers improved</li>
+
+<li>
+Mail: .html attachment handling improvement </li>
+
+<li>
+Calendar: Alarms adjusted now correctly when changing from set time "No"
+to set time "Yes" </li>
+
+<li>
+Ending of data call handling improvement </li>
+</ul>
+Language variants are supported according to following table: Europe NA
+English, Europe NB German, Europe NS Finnish, Europe NO Orange, Europe
+NX Scandinavian ( English ), Europe NH German ALS, Europe NC French, Europe
+NF Spanish, Europe NR Italian, Europe NE Swedish, Europe NM Danish, Europe
+NN Norwegian, Europe NG Portuguese, Europe NT Turkish, Europe NP Dutch,
+Europe NV Hungarian, Europe NQ Czech, Europe NJ Polish, Europe NVF Vodafone,
+Europe NK Movistar, Europe ND TIM, APAC NU English
+<p>This release requires also that the memory card application software
+be updated, before using the 9210 with the new MCU software upgrade.
+<p>You should not use older sw version applications (3.18, 3.54 or 3.62)
+from the sales package CD-ROM.
+<p>These old application versions will not work correctly with this new
+4.13 SW version and you should delete any old backup that you might have
+in your PC, and not restore to the updated 9210 as this will effectively
+"downgrade" the memory card applications.
+<p>You should also make a new backup of the upgraded 9210 device, and upgraded
+memory card to the PC.
+<p>All_memory_card_data.SIS file and the new version of PC Suite V1.20
+is also available from Forum Nokia web page <a href="http://www.forum.nokia.com">http://www.forum.nokia.com</a></td>
+</tr>
+
+<tr>
+<td><a NAME="#ncp1"></a>Card Phone 1.0</td>
+
+<td>RPE-1</td>
+
+<td></td>
+
+<td></td>
+</tr>
+
+<tr>
+<td><a NAME="#ncp2"></a>Card Phone 2.0</td>
+
+<td>RPM-1</td>
+
+<td></td>
+
+<td>449144</td>
+</tr>
+</table>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font></div>
+
+</body>
+</html>
--- /dev/null
+<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="konwerter" content="Ogonki97 1.3">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="KeyWords" content="9000, 9110, 8210, 8250, Firmware, Software, Version, Update, 3210, GSM, DCS, Nokia, 5110, 5130, 6110, 6130, 6150, 9110, 7110, 8110, 3110, 2110, 1610, 1611, 6190, 5190, 8110, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <meta name="GENERATOR" content="Mozilla/4.79 [en] (Windows NT 5.0; U) [Netscape]">
+ <title>Nokia identification & firmware/Identyfikacja i oprogramowanie telefonów Nokia</title>
+<link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body text="#2B2B69" bgcolor="#FFFFFF" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+<a NAME="Top"></a>
+<div align=right><a href="../../index.htm" class="autoremail">Main page/Strona
+g³ówna</a></div>
+
+<center>
+<p><br><font color="#1F409F"><font size=+2>Nokia identification & firmware/Identyfikacja
+i oprogramowanie telefonów Nokia</font></font></center>
+
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<ol>
+<li>
+<b><a href="#1">Ogólne b³êdy/General bugs</a></b></li>
+
+<li>
+<b><a href="#2">Ogólne informacje o IMEI/General info about IMEI</a></b></li>
+
+<li>
+<b><a href="#3">Czy mogê wgraæ sobie oprogramowanie/Can I download firmware
+to my phone ?</a></b></li>
+
+<li>
+<b><a href="#4">Czy to kosztuje ?/Does it cost ?</a></b></li>
+
+<li>
+<b><a href="#5">Gdzie tego dokonaæ ?/Where to make it ?</a></b></li>
+
+<li>
+<b><a href="#6">Jakie s± b³êdy/zmiany w kolejnych wersjach ?/What are bugs/changed
+things in next versions ?</a></b></li>
+
+<li>
+<b><a href="#7">Jak zmieniæ wersjê jêzykow±?/How to change language in
+phone ?</a></b></li>
+
+<li>
+<b><a href="#8">U¿yte materia³y/Information sources</a></b></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<br>First: what is firmware ? It's program (like in computer - in fact
+phone is small computer) saved somewhere inside phone.
+<p>Na pocz±tku: co to jest firmware ? Jest to program (jak w komputerze
+- w³a¶ciwie telefon to taki ma³y komputer) zapisany gdzie¶ w ¶rodku telefonu.
+<p>On this page you can find information about:
+<ul>
+<li>
+model numbers for Nokia phones</li>
+
+<li>
+codes to see their firmware versions</li>
+
+<li>
+different firmware revisions and changes among them (I think, it will help
+to answer, if firmware upgrade for your phone will give you something and
+correct some bugs).</li>
+
+<li>
+description for IMEI. For example TAC numbers (first 6 digits of IMEI)
+given for various Nokia phones (if I will have them, I will be able to
+tell you your phone model from its IMEI).</li>
+</ul>
+Na tej stronie znajdziesz informacje o:
+<ul>
+<li>
+oznaczeniach Nokii</li>
+
+<li>
+kodach pozwalaj±cych sprawdziæ ich wersje oprogramowania</li>
+
+<li>
+jakie s± wersje ich oprogramowania i czym siê ró¿ni± (mam nadziejê, ¿e
+pomo¿e to odpowiedzieæ, czy upgrade oprogramowania w Twoim telefonie da
+co¶ i czy np. poprawi jakie¶ dokuczliwe b³êdy)</li>
+
+<li>
+informacje o IMEI telefonu.. Przyk³adowo numery TAC (pierwsze 6 cyfr IMEI)
+nadawane ró¿nym modelom (je¿eli je bêdê mia³, bêdê móg³ podaæ model telefonu
+wy³±cznie na podstawie jego IMEI).</li>
+</ul>
+If you want to add or correct something to this list, please <a href="mailto:marcin-wiacek@topnet.pl">write
+me</a> (for example:
+<ol>
+<li>
+when you changed firmware in your phone and noticed some changes, inform
+me about them and write, what is phone model, old and new firmware version</li>
+
+<li>
+if you have access to two phones with different firmware and notice any
+differences, inform me about them and write, what is phone models, and
+their firmware versions).</li>
+</ol>
+Je¿eli masz co¶ dodania do tej listy albo znalaz³e¶(a¶) na niej b³êdy,
+proszê do mnie <a href="mailto:marcin-wiacek@topnet.pl">napisaæ</a> w tej
+sprawie (przyk³adowo:
+<ol>
+<li>
+je¿eli wymieni³e¶ oprogramowanie w swoim telefonie i zauwa¿y³e¶ jakie¶
+zmiany, napisz mi o nich podaj±c równie¿ model telefonu, star± i now± wersjê
+oprogramowania</li>
+
+<li>
+je¿eli masz dostêp do dwóch telefonów z ró¿nym oprogramowaniem i zauwa¿y³e¶
+ró¿nice, napisz mi o nich podaj±c równie¿ model telefonów, ich wersjê oprogramowania).</li>
+</ol>
+Informacja dla polskich czytelników tej strony: mia³a ona byæ w za³o¿eniu
+i po polsku i po angielsku. Niestety, od którego¶ momentu nie by³em w stanie
+tworzyæ lepszego czy gorszego jej t³umaczenia i w obecnej chwili czê¶æ
+przet³umaczon± pozostawi³em, a reszta jest wstawiana TYLKO po angielsku.
+<p><b><font color="#FF6666"><font size=+1>I want also to thank Tomasz Stêpski
+(admin of newsgroup server <a href="news://212.160.228.194">news://212.160.228.194</a>)
+for special help in creating this page...and some other people too (Martin
+F. Schlögl, <a href="http://www.zamir.net/~josipm/Nokia/nokiafaq/">jsp_m</a>,
+<a href="http://www.cro-web.com/maroon/">marOOn</a>,
+etc.) :-)))</font></font></b>
+<p><i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="1"></a><font size=+2><font color="#1F409F">1. </font>Ogólne
+b³êdy/General bugs</font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>Here are some bugs (or features), which can exist in (almost) ALL new
+models:
+<ul>
+<li>
+<b>DIVERTS</b>: "Call divert if not available" (Menu 5-5): "Check
+status" is missing. It's not bug. It's because it's combined diverting
+(N6210, 7110...)</li>
+
+<li>
+some SMS saved on SIM can look different, when read them from phone's menu
+(checked for N5110, 6150). Example (mygnokii can be download from my www):
+try to use "<i>mygnokii --savesms "test" --bug < file"</i> and read
+saved SMS</li>
+
+<li>
+char 0x00, 0x00 in Unicode SMS hides SMS contents, when try to read it
+from phone's menu (feature ?)</li>
+
+<li>
+char 0x00, 0x01 in Unicode SMS enables/disables blinking of chars in SMS,
+when try to read it from phone's menu (feature ?). Confirmed for N51xx,
+61xx, 8210, 3210. Doesn't blink in N7110 (4.77), but can edit them there.</li>
+
+<li>
+after receiving some SMS phone enables light/vibra (like after receiving
+SMS), but doesn't display anything. Example (mygnokii can be download from
+my www): try to use "<i>mygnokii --savesms "test" --voidsms < file"</i>
+and forward it to phone.</li>
+
+<li>
+SMS delivery reports are received twice: first ""... at work"", later a
+second ""... transmitted"</li>
+
+<br>Solution: the SMS-center number used for sending should be the same
+than the one, that is sending back the delivery reports.
+<li>
+When have unreaded messages (let's say 4 SMS and one delivery report) and
+you will receive next one, you will see "6 messages received", not "1 message
+received". Changed for last models like 6210, ...</li>
+
+<li>
+PL: s³owa "Og³usz" (w modelach z zielon± i czerwon± s³uchawk±) i komunikat
+"Mikrofon wy³±czon". Wystêpuje nawet w 3310 wersja 4.45 i 8210 wersja 5.25
+(sprawdzone przez Artura Heise)</li>
+
+<li>
+After deactivating netmonitor using 241 code, you have sometimes to reset
+phone. In other case Up and Down arrows don't work...</li>
+
+<li>
+When you set such ID for ringtone in caller group, which doesn't exist
+in phone, you can't set it (ringtone) from phone's menu... Checked for
+6210 (5.17) and 8210 (info from jsp_m).</li>
+
+<li>
+Try few times, because sometimes doesn't work:</li>
+
+<ol>
+<li>
+unlock keypad</li>
+
+<li>
+press Power button (should go to the Profiles menu)</li>
+
+<li>
+press Power button double</li>
+
+<li>
+scroll menu to "Switch off" (or similiar) using Down key</li>
+
+<li>
+wait second or longer</li>
+
+<li>
+when press Power button now, phone will jump always to "Switch off" (not
+go into next position)</li>
+</ol>
+</ul>
+And some other tips:
+<ul>
+<li>
+when want to delete SMS Centre Number (you don't want to see it from phone's
+menu), write "*" inside. Tested for N5110, 3310</li>
+
+<li>
+when you put "#" char as SMS Centre Number, phone will replace it by "3".
+Tested for N5110, 3310</li>
+
+<li>
+(in models with two functions keys, for example 6110): when you see network
+name/logo, press "Menu" key longer (about 2 secs.) - you will enter to
+menu available during calls</li>
+
+<li>
+when you will see list of phonebook entries and press "#" key, will see
+number displayed with large font (tested for N5110, 3310, 6150).</li>
+
+<li>
+when you're in phone's menu and press "C" key (go higher level), when press
+fast "#" key, keypad will be blocked, as if you pressed "Menu" and "#"
+combination (tested for N5110, 3310)</li>
+
+<li>
+(in phones with Navi key, for example N5110, 3310): when edit SMS and don't
+want to lost it/don't want to send or save, press "Options" (you will see
+available options), then "C" for longer time. Contents of SMS will be in
+memory (to the moment, when you disable phone) and you will be able to
+return to it.</li>
+
+<li>
+when send to phone DMTF sequence (tested for N5110) via cable and sequence
+starts from "w" (wait), phone doesn't display it (first "w" in sequence),
+but display menu for sending the rest of sequence in the phone. In N6150
+waits a moments before sending sequence...</li>
+</ul>
+I kilka interesuj±cych rzeczy:
+<ul>
+<li>
+W nowych modelach, kiedy ustawisz sygna³ wiadomo¶ci SMS na "Narastaj±cy",
+telefon bêdzie wygrywa³ komunikat "Connecting people" alfabetem Morse'a.
+Przy sygnale "Specjalny" jest to "SMS"</li>
+</ul>
+And some interesting things:
+<ul>
+<li>
+.In new models, when you set SMS message tone to "Ascending" ('Long &
+Loud' with older firmware), phone plays "Connecting people" with Morse
+alphabet. When select "Special", "SMS" is played.</li>
+</ul>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="2"></a><font size=+2><font color="#1F409F">2. </font>Ogólne
+informacje o IMEI/General info about IMEI</font>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade><a NAME="#IMEI"></a>
+<p>IMEI is written as:
+<p>XXXXXX/XX/XXXXXX/X
+<br>TAC/FAC/SNR/SP
+<p>where:
+<p>TAC (Type Approval Code):
+<br>first two digits of are for Nokia: 35, 44, 49
+<table BORDER CELLSPACING=0 CELLPADDING=0 COLS=2 >
+<tr>
+<td><b>last four digits</b></td>
+
+<td><b>model</b></td>
+</tr>
+
+<tr>
+<td>8890,9206,9314,9340</td>
+
+<td>3210</td>
+</tr>
+
+<tr>
+<td>0520</td>
+
+<td>5110</td>
+</tr>
+
+<tr>
+<td>9210</td>
+
+<td>5130</td>
+</tr>
+
+<tr>
+<td>0523</td>
+
+<td>6110</td>
+</tr>
+
+<tr>
+<td>3002</td>
+
+<td>6150</td>
+</tr>
+
+<tr>
+<td>9214, 9337, 9597</td>
+
+<td>6210</td>
+</tr>
+
+<tr>
+<td>8904, 8895</td>
+
+<td>7110</td>
+</tr>
+
+<tr>
+<td>8902, 9306</td>
+
+<td>8210</td>
+</tr>
+
+<tr>
+<td>0525</td>
+
+<td>8810</td>
+</tr>
+
+<tr>
+<td>8901</td>
+
+<td>8850</td>
+</tr>
+
+<tr>
+<td>0003</td>
+
+<td>8890</td>
+</tr>
+</table>
+
+<p>FAC (Final Assembly Code)
+<table BORDER CELLSPACING=0 CELLPADDING=0 COLS=2 WIDTH="100%" >
+<tr>
+<td><b>FAC</b></td>
+
+<td><b>Country</b></td>
+</tr>
+
+<tr>
+<td>07, 08, 20</td>
+
+<td>Germany</td>
+</tr>
+
+<tr>
+<td>10, 70</td>
+
+<td>Finland</td>
+</tr>
+
+<tr>
+<td>19, 40</td>
+
+<td>UK</td>
+</tr>
+
+<tr>
+<td>30</td>
+
+<td>Korea</td>
+</tr>
+
+<tr>
+<td>67</td>
+
+<td>USA</td>
+</tr>
+
+<tr>
+<td>80</td>
+
+<td>China</td>
+</tr>
+</table>
+
+<p><i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="3"></a><font color="#1F409F"><font size=+2>3. Czy mogê wgraæ
+sobie oprogramowanie/Can I download firmware to my phone ?</font></font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>Firmware is saved in flash memory, not in EEPROM, like many people think.
+In EEPROM you have configuration for phone (in almost all phones) - downloadable
+logos, ringtones, etc. and generally it's very small - 8, 16, 32 kB. Flash
+memory is rather big (for example, 8 MB). You have full firmware there
+and (in some models) part of configuration.
+<p>From long time there is available on the <a href="http://www.net.yu/~dejan">Dejan's
+page</a> flasher (soft + schematics for interface) and it allows to change
+flash, but not at all. Because not everything is decoded (all checksums,
+etc.), this flasher will allow to:
+<ol>
+<li>
+change part of flash (for example, used for such modyifing firmware, that
+phone doesn't read status of simlock and can work with each SIM card)</li>
+
+<li>
+repairing some CONTACT SERVICES</li>
+</ol>
+You can't (?) change firmware version to newer (phone doesn't log in to
+network) and for it you must go to the next point to see, where to change
+it ;-). Additionaly, using this flasher can be illegal (especially with
+simlocks).
+<p><i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="4"></a><font color="#1F409F"><font size=+2>4. Czy to kosztuje
+?/Does it cost ?</font></font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>When you have quarantie for your phone, it should be done for free by
+Nokia service. Some services want additionaly info from you about found
+bugs (generally: explaining, why you want to make it) - look into my page
+and you will know everything ;-)
+<p>After quarantie you must pay for it...or (only in some services) if
+will be done by free, if you will show them bug...
+<p><i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="5"></a><font color="#1F409F"><font size=+2>5. Gdzie tego dokonaæ
+?/Where to make it ?</font></font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>Ask your operator...
+<p><i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="6"></a><font size=+2><font color="#1F409F">6. </font>What are
+bugs/changed things in next versions ?/Jakie s± b³êdy/zmiany w kolejnych
+wersjach ?</font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>Some info about my description, which is available on subpages:
+<ul>
+<li>
+when I write firmware version before text (for example "(V 3.41)") - something
+is changed, when compare to this firmware version (here 3.41)</li>
+
+<li>
+when I write "(OLDER ?)" before text - this bug/info, etc. can be connected
+with older firmware versions, here is confirmed</li>
+
+<li>
+when I write "(NEWER TOO ?)" before text - this bug/info, etc. wasn't checked
+in newer versions</li>
+</ul>
+Kilka s³ów o opisie dostêpnym na podstronach:
+<ul>
+<li>
+je¿eli piszê wersjê oprogramowania przed tekstem (np. "(V 3.41)") - co¶
+zosta³o zmienione w stosunku do podanej wersji oprogramowania.</li>
+
+<li>
+je¿eli piszê "(STARSZE ?)" przed tekstem - informacja, b³±d, itp. mo¿e
+byæ równie¿ w starszych wersjach, tutaj za¶ jest potwierdzona</li>
+
+<li>
+je¿eli piszê "(NOWSZE TE¯ ?)" przed tekstem - informacja, b³±d, itp. nie
+by³a sprawdzona w nowszych wersjach</li>
+</ul>
+Please also notice, that changes between the same firmware versions in
+different models are not the same.
+<p>Please find your model and click to see everything:
+<ul>
+<li>
+<a href="firm12.htm#100">100 (THX-9L)</a></li>
+
+<li>
+<a href="firm12.htm#450">450 (THF-9)</a></li>
+
+<li>
+<a href="firm12.htm#540">540 (THF-11)</a>, <a href="firm12.htm#550">550
+(THF-10)</a></li>
+
+<li>
+<a href="firm12.htm#640">640 (THF-13)</a>, <a href="firm12.htm#650">650
+(THF-12)</a></li>
+
+<li>
+<a href="firm12.htm#1011">1011 (NHE-2)</a>,
+<a href="firm12.htm#1610">1610
+(NHE-5)</a>,
+<a href="firm12.htm#1611">1611 (NHE-5SX)</a>,
+<a href="firm12.htm#1630">1630
+(NHE-5NA)</a>,
+<a href="firm12.htm#1631">1631 (NHE-5SA)</a><a href="firm12.htm#NHE-5NX">16??
+(NHE-5NX)</a></li>
+
+<li>
+<a href="firm12.htm#2010">2010 (NHE-3)</a>,
+<a href="firm12.htm#2110">2110
+(NHE-1XN)</a>,
+<a href="firm12.htm#2110i900">2110i, 2110e for GSM 900
+(NHE-4)</a>,
+<a href="firm12.htm#2110I900_2">2110i, 2110e for GSM 900
+(NHE-4NX)</a>,
+<a href="firm12.htm#2110i_1800">2110i, 2110e for GSM 1800
+(NHK-IEA)</a>,
+<a href="firm12.htm#2140">2140 (NHK-1XA)</a>,
+<a href="firm12.htm#2148">2148
+(NHK-1)</a>,
+<a href="firm12.htm#2148i">2148i (NHK-4)</a>,
+<a href="firm12.htm#2160">2160
+(NHC-4NE)</a></li>
+
+<li>
+<a href="firm3.htm#3110">3110 (NHE-8)</a>,
+<a href="firm3.htm#3210">3210
+(NSE-8/9)</a>,
+<a href="firm3.htm#3310">3310 (NHM-5)</a>,
+<a href="firm3.htm#3330">3330
+(NHM-6)</a>, <a href="firm3.htm#3350">3350(NHM-9)</a>, <a href="firm3.htm#3390">3390
+(NPB-1)</a>,
+<a href="firm3.htm#3810">3810 (NHE-9)</a></li>
+
+<li>
+<a href="firm5.htm#5110">5110 (NSE-1)</a>,
+<a href="firm5.htm#5110i">5110i
+(NSE-2)</a>,
+<a href="firm5.htm#5130">5130 (NSK-1)</a>,
+<a href="firm5.htm#5160">5160
+(NSW-1)</a>,
+<a href="firm5.htm#5190">5190 (NSB-1)</a>,
+<a href="firm5.htm#5210">5210
+(NSM-5)</a>,
+<a href="firm5.htm#5510">5510 (NPM-5)</a></li>
+
+<li>
+<a href="firm6_1.htm#6050">6050 (NME-1)</a>,
+<a href="firm6_1.htm#6080">6080
+(NME-2)</a>,
+<a href="firm6_1.htm#6081">6081 (NME-2E)</a>,
+<a href="firm6_1.htm#6090">6090
+(NME-3)</a>,
+<a href="firm6_1.htm#6110">6110 (NSE-3)</a>,
+<a href="firm6_1.htm#6120">6120
+(NSC-3)</a>,
+<a href="firm6_1.htm#6130">6130 (NSK-3)</a>,
+<a href="firm6_1.htm#6138">6138
+(NSK-3)</a>,
+<a href="firm6_1.htm#6150">6150 (NSM-1)</a>,
+<a href="firm6_1.htm#6160">6160/6162
+(NSW-3)</a>,
+<a href="firm6_1.htm#6185">6185/6188 (NSD-3AX)</a>,
+<a href="firm6_1.htm#6190">6190
+(NSB-3)</a>,
+<a href="firm6_2.htm#6210">6210 (NPE-3)</a>,
+<a href="firm6_2.htm#6250">6250
+(NHM-3)</a>,
+<a href="firm6_2.htm#6310">6310 (NPE-4)</a>,
+<a href="firm6_2.htm#6510">6510
+(NPM-9)</a></li>
+
+<li>
+<a href="firm7.htm#7110">7110 (NSE-5)</a>,
+<a href="firm7.htm#7160">7160
+(NSW-5)</a>,
+<a href="firm7.htm#7190">7190 (NSB-5)</a></li>
+
+<li>
+<a href="firm8.htm#8110">8110 (NHE-6, NHE-6BX)</a>,
+<a href="firm8.htm#8110i">8110i
+(NHE-6, NHE-6BM)</a>,
+<a href="firm8.htm#8146">8146 (NHK-6)</a>,
+<a href="firm8.htm#8148">8148
+(NHK-6)</a>,
+<a href="firm8.htm#8148i">8148i (NHK-6V)</a>,
+<a href="firm8.htm#8210">8210
+(NSM-3)</a>,
+<a href="firm8.htm#8250">8250 (NMS-3D)</a>,
+<a href="firm8.htm#8290">8290
+(NSB-7)</a>,
+<a href="firm8.htm#8310">8310 (NHM-7)</a>,
+<a href="firm8.htm#8810">8810
+(NSE-6)</a>,
+<a href="firm8.htm#8850">8850 (NSM-2)</a>,
+<a href="firm8.htm#8890">8890
+(NSB-6)</a></li>
+
+<li>
+<a href="firm9.htm#9000">Communicator 9000 (RAE-1)</a>,
+<a href="firm9.htm#9000i">Communicator
+9000i (RAE-4)</a>,
+<a href="firm9.htm#9000il">Communicator 9000il (GE-9)</a>,
+<a href="firm9.htm#9110">Communicator
+9110 (RAE-2)</a><a href="firm9.htm#9210">Communicator 9210 (RAE-3)</a></li>
+
+<li>
+<a href="firm9.htm#ncp1">Card Phone 1.0 (RPE-1)</a>,
+<a href="firm9.htm#ncp2">Card
+Phone 2.0 (RPM-1)</a></li>
+</ul>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="7"></a><font size=+2>7. Jak zmieniæ wersjê jêzykow±?/How to
+change language in phone ?</font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>You have to change in phone part of firmware... From some time it's
+possible to do it with <a href="http://www.net.yu/~dejan">Dejan flasher</a>.
+<p><i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p><a NAME="8"></a><font color="#1F409F"><font size=+2>8. U¿yte materia³y/Information
+sources</font></font>
+<br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+<p>Niektóre u¿yte materia³y pochodz± ze stron:
+<br>Some used materials are from WWW pages:
+<ol>
+<li>
+<a href="http://www.webit.com/tw/nokia.shtml">http://www.webit.com/tw/nokia.shtml</a></li>
+
+<li>
+<a href="http://vzone.virgin.net/neil.hobbs/Nokia/Phone.htm">http://vzone.virgin.net/neil.hobbs/Nokia/Phone.htm</a></li>
+
+<li>
+<a href="http://www.worldofcellularsecrets.com/free.htm">http://www.worldofcellularsecrets.com/free.htm</a></li>
+
+<li>
+<a href="http://www.telephone.ru/faq/nokia6100/">http://www.telephone.ru/faq/nokia6100/</a></li>
+
+<li>
+<a href="http://gsm.erc.bc.ca/553software.html">http://gsm.erc.bc.ca/553software.html</a></li>
+
+<li>
+<a href="http://www.users.bigpond.com/Scotth/">http://www.users.bigpond.com/Scotth/</a></li>
+
+<li>
+<a href="http://www.yaws.dk/communicator/faq/imei/home.html">http://www.yaws.dk/communicator/faq/imei/home.html</a></li>
+
+<li>
+<a href="http://www.yaws.dk/communicator/faq/versions/phone.html">http://www.yaws.dk/communicator/faq/versions/phone.html</a></li>
+
+<li>
+<a href="http://www.nokiainfo.f2s.com/software_versions.html">http://www.nokiainfo.f2s.com/software_versions.html</a>
+(12-07-2001)</li>
+
+<li>
+<a href="http://www.vosper.prv.pl">www.vosper.prv.pl</a></li>
+
+<li>
+<a href="http://www.unofficial7110.co.uk/bugs/bugs.htm">http://www.unofficial7110.co.uk/bugs/bugs.htm</a></li>
+
+<li>
+<a href="http://slashdot.org/articles/00/09/03/1515202.shtml">http://slashdot.org/articles/00/09/03/1515202.shtml</a></li>
+
+<li>
+<a href="http://www.arcx.com/sites/6190Tips.htm">http://www.arcx.com/sites/6190Tips.htm</a></li>
+
+<li>
+<a href="http://www.wapterror.de/index.shtml">http://www.wapterror.de/index.shtml</a></li>
+
+<li>
+<a href="http://www.wapterror.de/6210.html">http://www.wapterror.de/6210.html</a></li>
+
+<li>
+<a href="http://bugzilla.punknet.cz/long_list.cgi">http://bugzilla.punknet.cz/long_list.cgi</a></li>
+
+<li>
+<a href="http://www.artie.force9.co.uk/8850/about.htm">http://www.artie.force9.co.uk/8850/about.htm</a></li>
+
+<li>
+<a href="http://www.fponticelli.com/bug8210.html">http://www.fponticelli.com/bug8210.html</a></li>
+
+<li>
+<a href="http://members.aon.at/mfs/">http://members.aon.at/mfs/</a> (14-01-2002)</li>
+
+<li>
+<a href="http://www.2thumbswap.com/products/secrets/nokia_8110.htm">http://www.2thumbswap.com/products/secrets/nokia_8110.htm</a></li>
+
+<li>
+<a href="http://www.nokia4u.cz/Nokia/firmware/fw-zmeny.htm">http://www.nokia4u.cz/Nokia/firmware/fw-zmeny.htm</a>
+(12-07-2001)</li>
+
+<li>
+<a href="http://www.indocell.net/id37.htm">http://www.indocell.net/id37.htm</a></li>
+
+<li>
+<a href="http://www.ponticellinks.com/bug3330.html">http://www.ponticellinks.com/bug3330.html</a></li>
+
+<li>
+<a href="http://www.flash.net.ph/cgi-bin/ikonboard/forums.cgi?forum=4&show=30">http://www.flash.net.ph/cgi-bin/ikonboard/forums.cgi?forum=4&show=30</a>
+(21-02-02)</li>
+
+<li>
+<a href="http://www.xinfo.net">http://www.xinfo.net</a></li>
+</ol>
+<i><font size=-1><a href="#Top" class="shref">Back to the top/Na pocz±tek</a></font></i>
+<p>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align=right><font size=-2><a href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>" class="autoremail">Marcin
+Wi±cek</a> (<a href="http://marcin-wiacek.topnet.pl" class="autoremail">WWW</a>)</font>
+<br><font size=-2>Ostatnia aktualizacja: 24 luty 2002/ Last modification:
+24 February 2002</font></div>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>IrDA FAQ</title>
+ <link REL=stylesheet HREF="../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">IRDA FAQ</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p>How to make iRda port for computer...
+
+<p><font color="#1F409F" size=+2 class="dzial">How to configure gnokii for IrDa connection ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>See <a href=../config.html>file describing configuration of gnokii</a>
+
+</div>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>Logos FAQ</title>
+ <link REL=stylesheet HREF="../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">Logos FAQ</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><font color="#1F409F" size=+2 class="dzial">Types of logos</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Nokia phones can support:
+<p>
+<ul>
+<li>startup logo - picture displayed, when phone is enabled.
+In some models (3210 5.27 and newer and 3310) it's animated. You can
+disable it (and download your own static), but I don't know, if it's possible
+to return to animated...
+</li>
+<li>operator logo - picture displayed instead of operator name.
+Logo can be assigned ONLY to one operator (when you will change it,
+it will disappear; when return to this network, you will see it again)</li>
+<li>caller logo - you can assign names from phonebook to something called
+caller group. When someboday for this group will call to you, you can
+see picture (caller logo) and name...</li>
+<li>Picture Image - image, which in newer phones (3310, ...) can be
+displayed in idle mode (Nokia calls it screen saver)</li>
+</ul>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta name="Author" content="Marcin Wiacek">
+ <meta name="Description" content="NOKIA NetMonitor description (English version)">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="language" content="us">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, Marcin, Wiacek, Marcin Wiacek">
+ <title>NetMonitor in Nokia phones (1/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<font class="drukuj">
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+</font>
+<center><font color="#1F409F" size=+2 class="tytul">NetMonitor in Nokia phones (1/7)</font>
+<font class="drukuj">
+<p><b>[Part 1]</b><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</font>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+
+<p>I\92d like to write, that I\92m not professionally connected with any
+cellular network or phone company. This NetMonitor guide is based on many
+different materials and exists thanks to the support of many different people (see
+<i><a href="faq_net6.htm#Literatura">Information sources</a></i>). This is a guide made by user. It may lack description
+to some functions or contain errors and mistakes (resulting from wrong translation or my ignorance) and some strange
+expressions. Many questions remain unanswered. Furthermore, this page is still "under construction". Encouraging, isn\92t it?
+But that\92s the (sad) true: <a href="http://www.nokia.com/">Nokia</a> doesn\92t make appropriate materials available...
+I can only assure you, that I do my best to make this NetMonitor description as reliable and complete as possible.
+
+<p>In this moment on my homepage you can also find Polish version of this FAQ.
+English language version was created with help of Michal Jerz - author of
+excellent page Nokia 9110 World: <a href="http://n9k.ats.pl">http://n9k.ats.pl</a>.
+
+<p><b><font color="#FF6666">
+I\92ll be very thankful for any help in creating and maintaining this guide - please
+<a href="mailto:Marcin Wiacek<Marcin-Wiacek@TopNet.PL>"><b>send</b></a>
+me any information (or URLs where I can find it), suggestions and remarks. My FAQ currently concerns
+Nokia 2110i, 2120, 2140, 2160, 3110, 3210, 3310, 5110, 5130, 5160, 5190, 6110, 6130, 6150, 6160, 6185/6188, 6210, 6250, 7110, 8210, 8810 and 9110
+series of phones. If you have NetMonitor enabled in any other model
+(for example in 2110i, 6090, 8xxx, 9000), please <a href="mailto:Marcin Wiacek<Marcin-Wiacek@TopNet.PL>"><b>contact me</b></a>
+(to let me know about the differences and possible new tests).
+</font></b>
+
+<p><b><font color="#FF6666">
+Herewith I inform, that I don\92t bear any responsibility for any damages and other consequences caused by applying following
+information (you use it on your own responsibility) !
+</font></b>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+<a NAME="Top"></a>
+
+<font class="drukuj">
+<ol>
+<li><a href="#1"><b>What is it ?</b></a></li>
+<li><a href="#2"><b>Do I need it ?</b></a></li>
+<li><a href="#3"><b>Does my phone use more power with NetMonitor enabled ?</b></a></li>
+<li><a href="#4"><b>How to activate it ?</b></a></li>
+<li><a href="#5"><b>Which NetMonitor version can be activated in my phone ?</b></a></li>
+<li><a href="#6"><b>Does NetMonitor activation void warranty ?</b></a></li>
+<li><a href="#7"><b>NetMonitor menu in my phone has different number than 10. Is it normal ?</b></a></li>
+<li><a href="#8"><b>NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</b></a></li>
+<li><a href="#9"><b>How to use it ?</b></a></li>
+<li><a href="#10"><b>Can I damage my phone ?</b></a></li>
+<li><a href="faq_net1.htm#11"><b>Glossary</b></a></li>
+<li><a href="faq_net2.htm#12"><b>Description of the individual tests</b></a></li>
+<li><a href="faq_net6.htm#13"><b>You can also use a program...</b></a></li>
+<li><a href="faq_net6.htm#14"><b>Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</b></a></li>
+<li><a href="faq_net6.htm#15"><b>How can I disable NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#16"><b>Do I need to disable NetMonitor before sending my phone to the service ?</b></a></li>
+<li><a href="faq_net6.htm#17"><b>Is it possible to re-activate NetMonitor after disabling it ?</b></a></li>
+<li><a href="faq_net6.htm#18"><b>Is NetMonitor available in analog Nokia phones ?</b></a></li>
+<li><a href="faq_net6.htm#19"><b>Does NetMonitor allow to use phone like broadcast station ?</b></a></li>
+<li><a href="faq_net6.htm#20"><b>I don't have all described tests in my phone. Why ? Can I increase their number ?</b></a></li>
+<li><a href="faq_net6.htm#21"><b>Does NetMonitor allow to identify place, where is my interlocutor ?</b></a></li>
+<li><a href="faq_net6.htm#22"><b>Does NetMonitor allow to identify place, where am I ?</b></a></li>
+<li><a href="faq_net6.htm#23"><b>What are NetMonitor codes ?</b></a></li>
+<li><a href="faq_net6.htm#24"><b>Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</b></a></li>
+<li><a href="faq_net6.htm#25"><b>Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#26"><b>I have non existing networks on the list of forbidden networks...</b></a></li>
+<li><a href="faq_net6.htm#27"><b>How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</b></a></li>
+<li><a href="faq_net6.htm#28"><b>Can I use DLR-2/DLR-3 cables for activating netmonitor ?</b></a></li>
+<li><a href="faq_net6.htm#29"><b>Can I activate netmonitor using Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="faq_net6.htm#30"><b>Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</b></a></li>
+<li><a href="faq_net6.htm#31"><b>How to change settings in tests ?</b></a></li>
+<li><a href="faq_net6.htm#32"><b>My phone has very short snandby time - it is possible to see the reason of it ?</b></a></li>
+<li><a href="faq_net6.htm#33"><b>Is netmonitor available in English version only ?</b></a></li>
+<li><a href="faq_net6.htm#Literatura"><b>Information sources</b></a></li>
+<li><a href="faq_net6.htm#35"><b>Additional information</b></a></li>
+<li><a href="faq_net6.htm#36"><b>Does using/activating netmonitor cost anything ?</b></a></li>
+<li><a href="faq_net6.htm#37"><b>Does using netmonitor is legall ?</b></a></li>
+<li><a href="faq_net6.htm#38"><b>Which entries on SIM card are used in netmonitor tests ?</b></a></li>
+<li><a href="faq_net6.htm#39"><b>Can I activate netmonitor in 3310 using soft working with 3210 ?</b></a></li>
+<li><a href="faq_net6.htm#40"><b>After activating netmonitor/BTS TEST my phone can't find network...</b></a></li>
+<li><a href="faq_net6.htm#41"><b>Netmonitor shows different battery capacity than info on it...</b></a></li>
+</ol>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<p><a NAME="1"></a><font color="#1F409F" size=+2 class="dzial">1. What is it ?</font><br>
+<hr size="3" align="left" noshade width="300" color="#60C0A0">
+
+<p>Net Monitor is just a special mode, which \96 when activated \96 shows different information about the network and about
+phone modules, SIM card, etc. After activation your phone will usually display a new, additional menu containing
+strange and constantly changing letters and digits. There are no standards here \96 each phone shows different data
+and there are different methods of activation (my description concerns NetMonitor mode in Nokia phones \96 if you have some
+other phone, you have to go somewhere else). I can even say, that NetMonitor (in some form) can be found in practically
+each present mobile phone (because it is unprofitable for the producers to make two separate software versions \96
+with and without NetMonitor). Here you can find some URLs to the pages describing activation and/or individual
+NetMonitor menus in other phones:
+
+<p>
+<ul>
+<li>in English:
+
+<p>
+<ul>
+<li><a href="http://friko7.onet.pl/wa/supastar/otek.html">Alcatel One Touch Easy</a></li>
+<li><a href="http://www.tele-servizi.com/Janus/motpages.html">Motorola</a></li>
+<li><a href="http://www.liljeberg.nu/monitor/">Siemens S1, S3, S3+, S3 Com i S4</a></li>
+</ul>
+<p>
+</li>
+
+<li>in German:
+
+<p>
+<ul>
+<li><a href="http://www.ruhr.de/home/nutrimatic/aeg902e.htm">AEG Telecar D 902</a></li>
+<li><a href="http://www.ruhr.de/home/nutrimatic/aeg9070e.htm">AEG Teleport TP 9070 DTFX</a></li>
+<li><a href="http://www.ruhr.de/home/nutrimatic/aeg9082e.htm">AEG Teleport TP 9082</a></li>
+<li><a href="http://www.nobbi.com/moni1_s4.htm">Siemens S4</a></li>
+<li><a href="http://www.nobbi.com/moni1_s15.htm">Siemens S15, S16, Bosch DualCom 738, World 718, GSM-COM 607 i 908</a></li>
+</ul>
+<p>
+</li>
+
+<li>in Polish: see Polish version of this manual.
+</li>
+
+</ul>
+
+<p>Other types: try searching on the links page
+<a href="http://www.mobilserver.com/Phone_info/">www.mobilserver.com/Phone_info/</a>.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="2"></a><font color="#1F409F" size=+2 class="dzial">2. Do I need it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>"Normal" users surely don\92t need any NetMonitor, because simply most of the data included there can be of
+any interest and use only for specialists (who can find out almost everything about the network). You also can:
+
+<p>
+<ul>
+<li>feel better and be able to brag that your phone has such a BBIIIIIGGGGGG choice of different options</li>
+<li>observe different network and phone parameters (I tried to explain their meaning in my description) and find out
+how cellular network works</li>
+<li>affect some functions in your phone and sometimes make your life easier (using these new options) \96
+I did my best to point at many useful NetMonitor applications</li>
+</ul>
+
+<p>If you still think, that you don\92t need it, read other pages concerning Nokia phones.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="3"></a><font color="#1F409F" size="+2" class="dzial">3. Does my phone use more power with NetMonitor enabled ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>I\92d say: NO. Each phone monitors the network even when there is no NetMonitor menu active.
+
+<p>But why some users say, that they have to charge their batteries more often after enabling NetMonitor? It is easy to explain:
+they frequently switch from one test to another (some people cannot stop ;-) and do it habitually) and the phone after each
+key press (by default) turns on the light (and uses much power - see <b><a href="faq_net3.htm#Menu23">test 23</a></b>).
+This can be partially cured by using <b><a href="faq_net3.htm#Menu18">test 18</a></b>. Additionally,
+some tests (for example
+<b><a href="faq_net3.htm#Menu17">test 17</a></b> or <b><a href="faq_net3.htm#Menu19">test 19</a></b>) can put
+your phone in a state of constant network searching (which drains the battery).
+
+<p>To recap, NetMonitor activation itself doesn\92t affect power consumption. It can be only changed by some conscious
+user operations...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="4"></a><font color="#1F409F" size="+2" class="dzial">4. How to activate it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>You can do it in three ways:
+
+<p>
+<ol>
+<li>by connecting your phone to the computer with a cable (in 3210 it has to be connected inside the casing) and using
+appropriate software <b><font color="#FF6666">(RECOMMENDED !)</font></b> working in:
+
+<p>
+<ul>
+<li>DOS:
+
+<p>
+<ul>
+<li>version 1.3 of PC-Locals - supports both FBUS and MBUS cable connections.<p></li>
+</ul>
+
+</li>
+
+<li>Unix:
+
+<p>
+<ul>
+<li>gnokii (main project page: <a href="http://www.gnokii.org">www.gnokii.org</a>;
+newest versions: <a href="ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/">ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/</a>)
+- supports FBUS\MBUS cable or IrDA connection)<p></li>
+</ul>
+
+</li>
+
+<li>Windows CE:
+
+<p>
+<ul>
+<li>Light Sabre IDE (working over IrDA) from Light Sabre project
+(<a href="http://www.binet.lv/personal/nokia/ppc.htm">www.binet.lv/personal/nokia/ppc.htm</a>).<p></li>
+</ul>
+
+</li>
+
+<li>Windows 95/98 i NT:
+
+<p>
+<ul>
+<li>Logo Express (<a href="http://memsu1.iam.ntu.edu.tw/~jrywu/">http://memsu1.iam.ntu.edu.tw/~jrywu/</a>
+or <a href="http://logoexpress.bizland.com/">http://logoexpress.bizland.com/</a>)
+- works with FBUS cable and IrDA port.</li>
+
+<li>Logo Manager (<a href="http://www.logomanager.co.uk">http://www.logomanager.co.uk</a>)
+- uses FBUS/MBUS, DLR-3 cables or IrDA.</li>
+
+<li>gnokii</li>
+
+<li>Andreas Schmidt program (<a href="http://www.aschmidt.de/">www.aschmidt.de/</a>) working with FBUS cable</li>
+
+<li>version 1.3 of PC-Locals</li>
+
+<li>NetMonitor (MBUS cable)</li>
+
+<li>Nokia Wrench (<a href="http://www.wildies.de/nokia/index.html">www.wildies.de/nokia/index.html</a>)
+- needs MBUS cable</li>
+
+<li>Nok Commander (<a href="http://netcity3.web.hinet.net/userdata/nokiacmd/eng/">http://netcity3.web.hinet.net/userdata/nokiacmd/eng/</a>)
+- working over FBUS/MBUS cable or IrDA port</li>
+
+</ul>
+</li>
+</ul>
+
+<p>All above programs work with majority of Nokia phones with letter "S" in middle of codename
+(for example, 5110, 5130, 5190, 6110, 6130, 6150, 3210 series). With Nokia 7110 (NSE-5) over DAU-9P cable
+(from Nokia 5xxx/6xxx series phones)
+worked Pc-Locals and <a href="http://www.logomanager.co.uk">Logo Manager</a> only.
+In Nokia 9110 (RAE-2) NetMonitor can be enabled
+with all above programs working with MBUS cable - <a href="http://www.logomanager.co.uk">Logo Manager</a>, Pc-Locals or
+<a href="http://www.wildies.de/nokia/index.html">Nokia Wrench</a>.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>When you want to check codename of your phone, try to use one of these codes:
+<b>*#0000#</b>, <b>*#9999#</b>, <b>*#3110#</b>, <b>*#3810#</b>, <b>*#5190#</b>,
+<b>*#6190#</b>, <b>*#8110#</b>, <b>*#837#</b>, <b>*#170602112302#</b> or
+<b>*#682371158412125#</b> (for more information about phone identification click
+<a href="../firmware/firmware.htm">here</a>).
+If phone will display something, codename will be written in 3'rd line of screen (it will be something like NSE-1).</td>
+</tr>
+</table>
+<p>
+
+<li>by direct changing the contents of EEPROM
+(<b>E</b>lectrically <b>E</b>rasable and <b>P</b>rogrammable <b>R</b>ead-<b>O</b>nly <b>M</b>emory).
+This method requires opening your phone and leaves visible traces inside it.
+<b><font color="#FF6666">I DON\92T RECOMMEND THIS METHOD!</font></b>
+But if you want to do it:
+
+<p>
+<ul>
+<li><a href="http://www.eeprom.w.pl">www.eeprom.w.pl</a> - a full description on
+how to do it in Nokia 5110, 6110, 6130</li>
+<li><a href="http://www.utg-bi.de/netmonitor.htm">www.utg-bi.de/netmonitor.htm</a> - a full description on
+how to do it in Nokia 5110, 5130, 6110, 6130 and 6150</li>
+<li><a href="http://www.cs.unibo.it/~lanconel/">www.cs.unibo.it/~lanconel/</a>
+- a description of the EEPROM memory programmer.</li>
+</ul>
+<p>
+</li>
+
+<li>
+using special menu, which allow to programm NAM code (in some analog phones only
+- like Nokia 2160, 2120, 5160, 6160, 6185 and 6188):
+<p>
+<ul>
+<li>use <b>*3001#12345#</b> code (sometimes pressing additionaly Menu is required;
+some sources write, that you have to write security code instead of 12345)
+to enter this menu</li>
+<li>set "Field Test Mode" to "On"/"Enable"</li>
+<li>restart your phone</li>
+</ul>
+<p>
+</li>
+
+<li>entering <b>Menu 3 3</b> (according to <a href=http://www.ras.ru/~sashka/nokia/550/>http://www.ras.ru/~sashka/nokia/550/</a>
+in Nokia 550) and setting it to "ext. test". Later you should restart phone (?)</li>
+
+</ol>
+
+<p>You can also:
+
+<p>
+<ul>
+<li>ask people from <a href="#GSM">GSM</a> newsgroups to do it for you</li>
+<li>commission it to some specialized company</li>
+</ul>
+
+<p>I don\92t know details about NetMonitor activation in 1610, 2110, 3110, 8110i, 8810 and 9000 series.
+I don\92t know exactly which programs to use (I heard only, that probably version 0.6 of PC-Locals allows to make it in older models)
+or how to modify EEPROM memory (if you know anything about that, please
+<a href="mailto:Marcin Wiacek<Marcin-Wiacek@TopNet.PL>"><b>contact me</b></a>).
+In this moment I can send you to:
+
+<p><ul>
+<li>Polish company Datex (<a href="http://www.datex.pl">www.datex.pl</a>)</li>
+<li><a href="http://discserver.snap.com/Indices/16654.html">http://discserver.snap.com/Indices/16654.html</a></li>
+<li><a href="http://www.mobil.cz/triky/netmonstarsinok000322.html">http://www.mobil.cz/triky/netmonstarsinok000322.html</a></li>
+<li><a href="http://www.mobil.cz/triky/nokia000511.html">http://www.mobil.cz/triky/nokia000511.html</a></li>
+<li><a href="http://www.odblokovani.cz/nokia/3110mon2.phtml">www.odblokovani.cz/nokia/3110mon2.phtml</a></li>
+</ul>
+
+<p>only.
+
+<p>I also heard, that in some copies of Nokia 6110 and 5110 phones it is possible to activate NetMonitor by a key combination
+(by pressing Menu key and typing 10 \96 this should work even when NetMonitor menu is not visible).
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td><b><font color="#FF6666">
+If you don\92t know how to activate NetMonitor, you better ask some more experienced person to do it for you
+(you can damage your phone during this operation) !
+!</font></b></td>
+</tr>
+</table>
+
+<p>I\92d like to draw your attention to one detail - in Nokia phones you just activate the monitor and not upload it (it is always
+in your phone \96 described methods just reveal it as an additional menu).
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="5"></a><font color="#1F409F" size="+2" class="dzial">5. Which NetMonitor version can be activated in my phone ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Each program described in <a href="#4">previous point</a> allows you to activate one of two NetMonitor versions:
+
+<p>
+<ol>
+<li>limited, including tests from 1 to 19 (concerning cellular network only). This version is usually called
+"Field Test" or "Operator field tests" (or you have to enter 242 code to activate it)</li>
+
+<li>
+full, also including phone (and sometimes SIM card) tests. It is called "Engineering" (or "R&D field tests") and its activation
+code is 243.</li>
+</ol>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>
+I recommend you enable full version of NetMonitor \96 you can always replace it with a limited version
+(by choosing <a href="faq_net6.htm#Menu242">test 242</a> in your phone). It doesn\92t work in reverse direction (you cannot activate full menu from
+within the phone \96 it doesn\92t accept <a href="faq_net6.htm#Menu243">test 243</a> when limited version is active; of course you can still use
+methods described in <a href="#4">previous point</a>).
+</td>
+</tr>
+</table>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="6"></a><font color="#1F409F" size="+2" class="dzial">6. Does NetMonitor activation void warranty ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>The method of re-programming EEPROM memory is connected with opening the casing and making modifications in your
+phone (which leaves many traces, scratches etc. and voids warranty).
+
+<p>However, these problems don\92t appear (you don't have to be affraid) when using one of the described programs
+or code (but I can be wrong . there are opinions that this method leaves a trace in phone.s memory, too)...
+
+<p>Of course, before getting phone to service, is better to
+<a href="faq_net6.htm#15">deactivate</a> NetMonitor.
+Sometimes, for example, when phone's energy system is damaged, it could be impossible -
+you can have some problems then (some of people working in service can think, that
+you broke warranty - it depends on concrete people)..
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="7"></a><font color="#1F409F" size="+2" class="dzial">7. NetMonitor menu in my phone has different number than 10. Is it normal ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>
+<table width=100%>
+<tr><td>
+<center>
+<img SRC="nm_3210.gif" ALT="NetMonitor menu in Nokia 3210" height=48 width=84>
+<img SRC="nm_3310.gif" ALT="NetMonitor menu in Nokia 3310" height=48 width=84>
+<img SRC="nm_5110.gif" ALT="NetMonitor menu in Nokia 5110" height=48 width=84>
+<img SRC="nm_6150.gif" ALT="NetMonitor menu in Nokia 6150" height=48 width=84>
+<img SRC="nm_6190.gif" ALT="NetMonitor menu in Nokia 6190" height=48 width=84>
+<img SRC="nm_8210.gif" ALT="NetMonitor menu in Nokia 8210/8250" height=48 width=84>
+<img SRC="nm_8310.gif" ALT="NetMonitor menu in Nokia 8310" height=48 width=84>
+<img SRC="nm_9110.gif" ALT="NetMonitor menu in Nokia 9110" height=48 width=84>
+<img SRC="nm_9210.gif" ALT="NetMonitor menu in Nokia 9210" height=48 width=84>
+</center>
+</td></tr>
+</table>
+
+<p>
+<table width=100%>
+<tr><td>
+<img SRC="nm_7110.gif" ALT="NetMonitor menu in Nokia 7110" height=65 width=96>
+<br><img SRC="nm_6210.gif" ALT="NetMonitor menu in Nokia 6210" height=60 width=96>
+<br><img SRC="nm_6310.gif" ALT="NetMonitor menu in Nokia 6310" height=60 width=96>
+</td><td>
+Of course, Number of NetMonitor menu (called "Net monitor" or "Field Test")
+is different (depends on firmware version and phone series) in different Nokia phones.
+
+<p>It can be:
+<b>Menu 7</b> (Nokia 3110 and 9110), <b>Menu 10 </b> (Nokia 5110, 5130, 6110, 6130),
+<b>Menu 11</b> (Nokia 5190 and 3210) or <b>Menu 12</b> (Nokia 8210 or some 6150).
+Nokia 3210 also has a completely different icon for this menu, 6250 doesn't have any icon. So, it's normal and don't be affraid.
+
+<p>There is also interesting thing connected with it: in Nokia 8210 icon of phone
+in netmonitor's menu is DIFFERENT from icons of phones in other menus in this model, but
+THE SAME to icon in Nokia 8250...
+
+</td></tr>
+</table>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="8"></a><font color="#1F409F" size="+2" class="dzial">8. NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<img SRC="3210_09.gif" ALT="Menu 9 in Nokia 3210" height=48 width=84 align=left>
+<img SRC="3210_10.gif" ALT="Menu 10 in Nokia 3210" height=48 width=84 align=left>
+<img SRC="nm_3210.gif" ALT="Menu 11 in Nokia 3210" height=48 width=84 align=left>
+YES - It's normal. We have such situation in Nokia 3210. "Lost" <b>Menu 10</b>
+is reserved for SIM application toolkit and you will see it, when you will have access to them
+(when your SIM card will have this feature built in - you CAN'T activate it different way).
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="9"></a><font color="#1F409F" size="+2" class="dzial">9. How to use it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p><a href="faq_net1.htm#GSM">GSM</a>/<a href="faq_net1.htm#DCS">DCS</a>/PCS phones:
+
+<p>
+<table width=100%>
+<tr><td>
+<img SRC="nm_01.gif" align=left height=48 width=84 ALT="NetMonitor menu in Nokia 5110">
+<img SRC="nm_5110.gif" align=left height=48 width=84 ALT="NetMonitor menu in Nokia 5110">
+</td><td>
+After activation you gain access to the new position (called "Net monitor"
+or "Field Test") in main phone menu.
+</td></tr>
+</table>
+
+<p><img SRC="nm_02.gif" height=48 width=84 align=LEFT ALT="NetMonitor menu in Nokia 5110">
+When you enter this menu, you can type number of the test, which should be displayed
+(1 to 19 in limited version, higher numbers in full version - <b><font color="#FF6666">Caution! Entering
+<a href="faq_net6.htm#Menu241">number 241</a> removes NetMonitor menu and
+<a href="faq_net6.htm#Menu242">242</a> switches it to the limited version \96 you\92ll have to use one of the
+methods described in <a href="#4"><i>How to activate it ?</i></a> to regain access to the full version !</font></b>).
+Before number of test you can add "+". Unfortunately, in Nokia 6210/7110 there
+is one wrong thing here: before entering number of new test you must delete old number
+using right function key (in other models you can enter it without it).
+
+<p><a href="faq_net5.htm#Menu70"><img SRC="nm_03.gif" height=48 width=84 align=left ALT="NetMonitor menu in Nokia 5110" border=0></a>
+After pressing OK the chosen test appears on screen (and its number is shown on the top) in place of your network
+name/operator logo (BTW: in some phones (like Nokia 3310), when you will enable clock, alarm clock, stopwatch, countdown timer, second line (ALS function),
+test in netmonitor and lock keypad, time will disappear :-)). If you enter incorrect test number, NO TEST appears on screen and the phone returns to the last
+correctly displayed test. If entered number is greater than 256, 512 or 768, then 256 (or its multiple) is subtracted and
+resulting menu number is displayed (for example numbers 300 and 556 run test 44). Some test when accessed this way
+(by typing its number and pressing OK to enter them directly) modify its contents (details are described later, I call this
+"DIRECT" menu access\92 - for example, see <b><a href="faq_net3.htm#Menu18">test 18</a></b>).
+
+<p><a href="faq_net5.htm#Menu71_72"><img SRC="nm_04.gif" height=48 width=84 align=LEFT ALT="NetMonitor menu in Nokia 5110" border=0></a>
+You can look at different tests by scrolling them using up/down arrows (don\92t worry \96 this method doesn\92t change
+any settings in tests) \96 each key press moves you to the next/previous available test. In some models
+(for example in 5110) these keys have different functions (like displaying last dialed numbers, opening
+and scrolling phonebook or changing the volume) \96 unfortunately they don\92t work while NetMonitor is on screen:-(.
+However, you can still adjust volume during a call in Nokia 5xxx/3210/3310/6188/6185/6160/6120 \96 by pressing and holding
+(longer than normally - about a second) one of the arrow keys.
+
+<p><a href="faq_net5.htm#Menu71_72"><img SRC="nm_05.gif" height=48 width=84 align=LEFT ALT="NetMonitor menu in Nokia 5110" border=0></a>
+Help (description) to the current test can be displayed by pressing and holding * key
+(repeat this to return to test values). However, this shortcut works only in some phones
+(<a href="faq_net2.htm#jest">my explanation to this fact</a> can be found in
+<i><a href="faq_net2.htm#12">Description of the individual tests</a></i>). That's why I've added these help
+screens using <b>a bold font</b> in most of the tests... If they are currently displayed,
+entering menu directly doesn't change its settings.
+
+<p>
+<table width=100%>
+<tr><td>
+<img SRC="nm_5110.gif" align=left height=48 width=84 ALT="NetMonitor menu in Nokia 5110">
+<img SRC="nm_06.gif" height=48 width=84 align=LEFT ALT="NetMonitor menu in Nokia 5110">
+<img SRC="nm_01.gif" height=48 width=84 align=LEFT ALT="NetMonitor menu in Nokia 5110">
+</td><td>
+You can return to the main screen with name/logo of your network by entering 0 in this menu.
+</td></tr>
+</table>
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>If you enter 0 as a test number and then add a number of a non-existing test
+(for example 52), your phone will act as when NetMonitor is active (for example up/down arrows
+can be used to change test number \96 you can check this in <b>Menu 10</b>). Unfortunately, in this case counters
+from <b><a href="faq_net5.htm#Menu82">test 82</a></b> don\92t work. Tests chosen this way appear right
+after switching the phone on. You can use this feature to:
+
+<ul>
+<li>temporarily "damage" your phone (to cheat your friend?)</li>
+<li>block access to your phonebook (Nokia 5xxx and 6xxx)</li>
+<li>prevent viewing your last dialed numbers list on the main screen with network logo/name (Nokia 5xxx)</li>
+<li>make it difficult to change volume during a call (Nokia 5xxx) \96 the arrow keys must be pressed and hold longer than normally</li>
+<li>make it impossible to change volume (Nokia 3110)</li>
+</ul>
+
+</td>
+</tr>
+</table>
+
+<p>With any test on screen (in phones other than Nokia 3110),
+your phone doesn\92t display some of the messages (for example. "...calling")
+and there is no calling party identification recognition (the only exception to the rule is a message:
+'Note: you have active diverts'). When you type a phone number the test screen disappears
+(it will come back after you get connected or when you cancel this number from your display).
+
+<p><font color=red><b>Remember: your phone is like computer. If you won't disable it and enable
+(only then it saves all values in EEPROM),
+it can lost values from tests (for example, info about number of sent/received SMS from
+<a href=faq_net5.htm#Menu64>test 64</a>, when you will use tips above...</b></font>
+
+<p>There is one firmware bug connected with using helps (descriptions) to the tests
+(in this moment, it's confirmed for Nokia 5110, 3210, 3310).
+If you want to see it:
+
+<p>
+<table width=100%>
+<tr><td>
+<img SRC="nm_09.gif" height=48 width=84 ALT="Menu monitora w Nokii 5110">
+<img SRC="nm_10.gif" height=48 width=84 ALT="Menu monitora w Nokii 5110">
+<img SRC="nm_11.gif" height=48 width=84 ALT="Menu monitora w Nokii 5110">
+<img SRC="nm_14.gif" height=48 width=84 ALT="Menu monitora w Nokii 5110">
+<img SRC="nm_12.gif" height=48 width=84 ALT="Menu monitora w Nokii 5110">
+</td><td>
+<ul>
+<li>Press and keep * key. In a moment, when * desappear from the screen
+(but before moment, when test values will be replaced with help or help with test values),
+let * key.</li>
+<li>Now you must do everything fast - * can't be written on the screen and
+text below NaviKey can't change: instantly press * for a moment and let it.
+You can repeat this point - effects will depend on repeat numbers. For example,
+with firmware 5.07 (or 5.11)
+and 0 repeats you will have access to first "hidden menu", with 1 repeat
+you phone hangs and turn off (see <a href="faq_net4.htm#Menu36">test 36</a>
+- it can be interesting), with 2 repeats it changes language ;-)), with 3
+you can enter to another "hidden menu", sometimes (I don't know exactly, when)
+you can see "CONTACT SERVICE" message (restart you phone and everything will
+be OK). With firmware 5.24 result are different:
+with 0 repeats you can enter second "hidden menu", with 1 or 2 repeats
+desappear NaviKey description, with 3 its description changes to "Send".
+</li>
+<li>wait longer moment</li>
+<li>press for a moment and let one of the keys: *, 0 to 9 or #</li>
+</ul>
+</td></tr>
+</table>
+
+<p>
+You can restart your Nokia 5110, if it has older firmware (it doesn't work with 5.24,
+but with 5.07 and 5.11 works):
+
+<p>
+<ul>
+<li>Press and keep * key. In a moment, when * desappear from the screen
+(but before moment, when test values will be replaced with help or help with test values),
+let * key.</li>
+
+<li>Now you must do everything fast - * can't be written on the screen and
+text below NaviKey can't change: instantly press * for a moment and let it, instantly press
+* for longer time (2 sec. or longer) and let, instantly press * for a moment and let it</li>
+</ul>
+
+<p>The reason of it is stack overflow (see <a href="faq_net4.htm#Menu35">test 35</a>
+and <a href="faq_net4.htm#Menu57">test 57</a>). If it doesn't work with your phone
+and you have Nokia 6110, you can also use another trick to reboot phone:
+
+<ol>
+<li>Go to the Calendar (<b>Menu-8</b>)</li>
+<li>Make a note or reminder.</li>
+<li>Enter some text into the edit box.</li>
+<li>Hold "Clear" until the whole text is cleared, then press "Back".</li>
+<li>Press "0". The main screen will now be showing but a space appears on the screen. (you can't see it)</li>
+<li>Enter 4 digits (e.g. 1234).</li>
+<li>Use the down arrow to move the cursor to the left side of the numbers and the space (Down arrow twice).</li>
+<li>Now enter 6 digits and press the call button.</li>
+</ol>
+
+<p>TDMA 800/TDMA 1900 phones:
+
+<p>After activation you gain access to the new position (called "Field Test") in main phone menu.
+
+<p>When you enter this menu, you can type number of the test, which should be displayed (1-7 in
+Nokia 6160) or enter 0 to disable it.
+
+<p>You can look at different tests by scrolling them using up/down arrows. During voice calls, depending on how
+NetMonitor was entered, the arrow keys may switch tests (you can't change volume then) or adjust volume.
+
+<p>If the keypad is locked while a NetMonitor tests are active, pressing
+0-9, *, or # will toggle the screen back to the User Interface Display.
+Pressing Talk, End, the arrow keys, or the soft menu keys will return the test.
+
+<p>In Nokia 2120 or 2160 you can also display description (help) to displayed
+tests by pressing and holding "ABC" key.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="10"></a><font color="#1F409F" size="+2" class="dzial">10. Can I damage my phone ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Probably only during <a href="#4">NetMonitor activation</a>
+(especially in phones with NAM programming menu) or in Nokia 6210 or 3210
+(more in description for <a href=faq_net3.htm#Menu17>test 17</a>).
+
+<p>I\92ve never heard of such accident
+(my own strange and hard attempts :-) failed, too) during using it in different phones.
+But of course you should be careful - netmonitor is "unofficial" part of
+phone's firmware.
+
+<p>If something doesn't work correctly, switch the phone off and then back on
+- all tests, you can set (excluding <a href="faq_net3.htm#Menu17">test 17</a>),
+should be set to their default values...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a><p>
+
+<center>
+<p><b>[Part 1]</b><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wiacek<Marcin-Wiacek@topnet.pl>">Marcin Wiacek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Last modification: 5 January 2002</font>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta name="Author" content="Marcin Wiacek">
+ <meta name="Description" content="NOKIA NetMonitor description (English version)">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="language" content="us">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, Marcin, Wiacek, Marcin Wiacek">
+ <title>NetMonitor in Nokia phones (2/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<font class="drukuj">
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+</font>
+<center><font color="#1F409F" size=+2 class="tytul">NetMonitor in Nokia phones (2/7)</font>
+<font class="drukuj">
+<p><a href="faq_net0.htm">[Part 1]</a><b>[Part 2]</b><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</font>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+<a NAME="Top"></a>
+
+<font class="drukuj">
+<ol>
+<li><a href="faq_net0.htm#1"><b>What is it ?</b></a></li>
+<li><a href="faq_net0.htm#2"><b>Do I need it ?</b></a></li>
+<li><a href="faq_net0.htm#3"><b>Does my phone use more power with NetMonitor enabled ?</b></a></li>
+<li><a href="faq_net0.htm#4"><b>How to activate it ?</b></a></li>
+<li><a href="faq_net0.htm#5"><b>Which NetMonitor version can be activated in my phone ?</b></a></li>
+<li><a href="faq_net0.htm#6"><b>Does NetMonitor activation void warranty ?</b></a></li>
+<li><a href="faq_net0.htm#7"><b>NetMonitor menu in my phone has different number than 10. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#8"><b>NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#9"><b>How to use it ?</b></a></li>
+<li><a href="faq_net0.htm#10"><b>Can I damage my phone ?</b></a></li>
+<li><a href="#11"><b>Glossary</b></a></li>
+<li><a href="faq_net2.htm#12"><b>Description of the individual tests</b></a></li>
+<li><a href="faq_net6.htm#13"><b>You can also use a program...</b></a></li>
+<li><a href="faq_net6.htm#14"><b>Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</b></a></li>
+<li><a href="faq_net6.htm#15"><b>How can I disable NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#16"><b>Do I need to disable NetMonitor before sending my phone to the service ?</b></a></li>
+<li><a href="faq_net6.htm#17"><b>Is it possible to re-activate NetMonitor after disabling it ?</b></a></li>
+<li><a href="faq_net6.htm#18"><b>Is NetMonitor available in analog Nokia phones ?</b></a></li>
+<li><a href="faq_net6.htm#19"><b>Does NetMonitor allow to use phone like broadcast station ?</b></a></li>
+<li><a href="faq_net6.htm#20"><b>I don't have all described tests in my phone. Why ? Can I increase their number ?</b></a></li>
+<li><a href="faq_net6.htm#21"><b>Does NetMonitor allow to identify place, where is my interlocutor ?</b></a></li>
+<li><a href="faq_net6.htm#22"><b>Does NetMonitor allow to identify place, where am I ?</b></a></li>
+<li><a href="faq_net6.htm#23"><b>What are NetMonitor codes ?</b></a></li>
+<li><a href="faq_net6.htm#24"><b>Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</b></a></li>
+<li><a href="faq_net6.htm#25"><b>Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#26"><b>I have non existing networks on the list of forbidden networks...</b></a></li>
+<li><a href="faq_net6.htm#27"><b>How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</b></a></li>
+<li><a href="faq_net6.htm#28"><b>Can I use DLR-2/DLR-3 cables for activating netmonitor ?</b></a></li>
+<li><a href="faq_net6.htm#29"><b>Can I activate netmonitor using Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="faq_net6.htm#30"><b>Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</b></a></li>
+<li><a href="faq_net6.htm#31"><b>How to change settings in tests ?</b></a></li>
+<li><a href="faq_net6.htm#32"><b>My phone has very short snandby time - it is possible to see the reason of it ?</b></a></li>
+<li><a href="faq_net6.htm#33"><b>Is netmonitor available in English version only ?</b></a></li>
+<li><a href="faq_net6.htm#Literatura"><b>Information sources</b></a></li>
+<li><a href="faq_net6.htm#35"><b>Additional information</b></a></li>
+<li><a href="faq_net6.htm#36"><b>Does using/activating netmonitor cost anything ?</b></a></li>
+<li><a href="faq_net6.htm#37"><b>Does using netmonitor is legall ?</b></a></li>
+<li><a href="faq_net6.htm#38"><b>Which entries on SIM card are used in netmonitor tests ?</b></a></li>
+<li><a href="faq_net6.htm#39"><b>Can I activate netmonitor in 3310 using soft working with 3210 ?</b></a></li>
+<li><a href="faq_net6.htm#40"><b>After activating netmonitor/BTS TEST my phone can't find network...</b></a></li>
+<li><a href="faq_net6.htm#41"><b>Netmonitor shows different battery capacity than info on it...</b></a></li>
+</ol>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<p><a NAME="11"></a><font color="#1F409F" size="+2" class="dzial">11. Glossary</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Here you can find explanation to some terms, which can be found in this FAQ:
+
+<p><a NAME="ACCH"></a><b>ACCH</b> (<b>A</b>nalog <b>C</b>ontrol <b>Ch</b>annel)
+<font size=-2>(TDMA 800/TDMA 1900)</font>
+
+<p><A name="AMPS"></a><b>AMPS</b> (<b>A</b>dvanced <b>M</b>obile <b>P</b>hone <b>S</b>ervice)
+<br>Analogue cellular system working in 800 Mhz used, for example, in North America.
+
+<p><a NAME="ASIC"></a><b>ASIC</b> (<b>A</b>pplication <b>S</b>pecific <b>I</b>ntegrated <b>C</b>ircuit)
+<br>Electronic chips designed for some concrete purposes
+ (for example, in phone it controlls communication between <a href="#MCU">MCU</a> and <a href="#DSP">DSP</a>)
+They're designed and produced by the companies which use them.
+
+<p><a NAME="AVCH"></a><b>AVCH</b> (<b>A</b>nalog <b>V</b>oice <b>Ch</b>annel)
+<font size=-2>(TDMA 800/TDMA 1900)</font>
+
+<p><a NAME="BCC"></a><b>BCC</b> (<b>B</b>ase-station <b>C</b>olor <b>C</b>ode)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>3-bit number (from 0-7 range) used to distinguish neighbor cells of the same operator,
+transmitting using <a href="faq_net2.htm#BCCH">BCCH</a> in the same
+<a href="#FDMA">FDMA</a> channel. Such distinguish is not needed when the cells belong to different operators
+(they use different channels and their <a href="faq_net2.htm#BCCH">BCCH</a> are in different FDMA channels).
+It is given in <a href="#BSIC">BSIC</a> of each <a href="#BTS">BTS</a> (you can check it for example in
+<b><a href="faq_net2.htm#Menu2">test 2</a></b>).
+
+<p><a NAME="BSC"></a><b>BSC</b> (<b>B</b>ase <b>S</b>tation <b>C</b>ontroller)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>It controls and supervises one or more <a href="#BTS">BTSes</a>.
+
+<p><a NAME="BSIC"></a><b>BSIC</b> (<b>B</b>ase <b>S</b>tation <b>I</b>dentity <b>C</b>ode
+or <b>B</b>ase transceiver <b>S</b>tation <b>I</b>dentity <b>C</b>ode)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Unique ID number of each <a href="#BTS">BTS</a>. If we code this value binary, first three digits (in decimal format)
+are <a href="#BCC">BCC</a> and next three are <a href="#NCC">NCC</a>. These values range from 0 - 63.
+<b>BSIC</b> values can be found among others in <b><a href="faq_net2.htm#Menu2">test 2</a></b>.
+
+<p><a NAME="BTS"></a><b>BTS</b> (<b>B</b>ase <b>T</b>ransceiver <b>S</b>tation)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>This device allows communication between phones and cellular network
+(many parameters, like current communication channel, distance to <b>BTS</b> and signal quality can be found, for example,
+in <b><a href="faq_net2.htm#Menu1">test 1</a></b>).
+
+<p>And here are another classes with maximum power of <b>BTS</b>:
+
+<p>
+<table cellspacing=0 cellpadding=0 border=1>
+<tr><td><center><b>GSM 900</b></center></td><td><b>GSM 1800</b></td></tr>
+<tr>
+<td>
+<center>320 W (55 dBm)<br>
+160 W (52 dBm)<br>
+80 W (49 dBm)<br>
+40 W (46 dBm)</center>
+</td><td>
+<center>-<br>
+-<br>
+-<br>
+-</center>
+</td></tr>
+<tr><td colspan=2>
+<center>20 W (43 dBm)<br>
+10 W (40 dBm)<br>
+5 W (37 dBm)<br>
+2,5 W (34 dBm)</center>
+</td></tr>
+</table>
+
+<p>In Polish version of this FAQ I give many links to WWW pages with <b>BTS</b> lists, their descriptions, pictures (in Poland).
+
+<p>From English pages I recommend <a href="http://www.geckobeach.com/cellular/cellpixs/cellid.htm">www.geckobeach.com/cellular/cellpixs/cellid.htm</a>
+site - it's about networks and <b>BTSes</b> in North America.
+
+<p>Another links connected with it:
+
+<p><ul>
+<li><a href=http://go.to/nokia.info>http://go.to/nokia.info</a> - photos of <b>BTSes</b></li>
+<li><a href=http://www.club.cz/nokia.monitor/>www.club.cz/nokia.monitor/</a>
+- <b>BTSes</b> bases for Czech networks</li>
+</ul>
+
+
+<p><p><a NAME="C1"></a><b>C1</b> (path loss-criterium)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>This is a parameter (ranging from -99 to 99 dBm) calculated by the phone to decide which cells to use
+(it uses the cell only if its <b>C1</b> is positive). This value is based on:
+
+<p>
+<ul>
+<li><a NAME="RX"></a><b>RX</b>
+<br>Strength of signal received in <a href="faq_net2.htm#BCCH">BCCH</a> channel. If it is equal or less than
+<a href="#RxLevAm">RxLevAm</a>, the phone searches for next
+<a href="faq_net2.htm#BCCH">BCCH</a> channel. It is shown in
+<b><a href="faq_net2.htm#Menu1">test 1</a></b> (for current channel)
+and also in <b><a href="faq_net2.htm#Menu3">test 3</a></b>, <b><a href="faq_net2.htm#Menu4">test 4</a></b>
+and <b><a href="faq_net2.htm#Menu5">test 5</a></b>
+(for neighbor channels). The amount of measurements of the quality of transmission with <a href="#BCCH">BCCH</a> channels
+in neighbor cells is given in <b><a href="faq_net5.htm#Menu62">test 62</a></b></li>
+
+<li><a NAME="RxLevAm"></a><b>RxLevAm</b> (<b>Rx</b> <b>Lev</b>el <b>A</b>ccess <b>m</b>inimum)
+<br>Min. level of the received signal (usually from -100 dBm to -110 dBm) needed by the phone to use particular cell.</li>
+
+<li><a NAME="MSTxPwr"></a><b>MSTxPwr</b>
+<br>Max power, which can be transmitted by phone to get access to
+<a href="faq_net2.htm#RACH">RACH</a> channel (i.e. max power allowed by current cell).
+Actually, it is lower in towns (where cells are small) and higher outside them.
+</li>
+
+<li><a NAME="MSMaxTxPwr"></a><b>MSMaxTxPwr</b>
+<br>Max permissible transmission power of the phone (its classes are described in
+<a href="faq_net2.htm#TX">TX description</a>).</li></ul>
+
+<p>It is calculated using following formula:
+<nobr>C1 = (<a href="#RX">RX</a> - <a href="#RxLevAm">RxLevAm</a> - MAX ( ( <a href="#MSTxPwr">MSTxPwr</a>
+- <a href="#MSMaxTxPwr">MSMaxTxPwr</a> ), 0) ) </nobr>, where MAX(x,y) is obviously a mathematical
+function giving the bigger one of the discussed numbers.
+The phone shows <b>C1</b> value in <b><a href="faq_net2.htm#Menu1">test 1</a></b> (for current channel) and in
+<b><a href="faq_net2.htm#Menu3">test 3</a></b>, <b><a href="faq_net2.htm#Menu4">test 4</a></b>
+and <b><a href="faq_net2.htm#Menu5">test 5</a></b>
+(for neighbor channels).
+
+<p><a NAME="C2"></a><b>C2</b> (cell-reselection criterion)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>This parameter (-99 to 99 dBm) is calculated with following formula:
+<nobr>C2 = C1 + <a href="#CellReselect">Cell reselect
+offset</a> - <a href="#TemporaryOffset">Temporary offset</a>
+* H (<a href="#PenaltyTime">Penalty time</a> - T)</nobr>.
+If this value for some other cell (<b>C2</b> for
+neighbor channels can be found in <b><a href="faq_net2.htm#Menu3">test 3</a></b>,
+<b><a href="faq_net2.htm#Menu4">test 4</a></b> and
+<b><a href="faq_net2.htm#Menu5">test 5</a></b>) is higher than this value for current cell
+(shown in <b><a href="faq_net2.htm#Menu1">test 1</a></b> and <b><a href="faq_net2.htm#Menu3">test 3</a></b>)
+for a period of time longer than 5 seconds, the phone switches cells. There are two exceptions to the rule:
+
+<p>
+<ul>
+<li>if the new cell is located on different \91Location Area (this parameter for current cell can be checked in
+<b><a href="faq_net3.htm#Menu11">test 11</a></b>), <b>C2</b> for this cell must be (during more than 5 seconds)
+higher than <b>C2</b>+CELL_RESELECT_HYSTERESIS for old cell (where CELL_RESELECT_HYSTERESIS is a
+special parameter sent in <a href="faq_net2.htm#BCCH">BCCH</a> channel).</li>
+
+<li>if the phone switched cells during last 15 seconds, <b>C2</b> for a new cell must be higher at least 5 dBm from
+<b>C2</b> value of the old cell.
+</li>
+</ul>
+
+<p>H(x) function for currently not used cells is 0 (if x<0) or 1 (if x>=0). For current cell H(x) is always equal 0.
+<br>By a skillful manipulation of this parameter (through CELL_RESELECT_HYSTERESIS), operators can direct
+connections to specific cells (thus lightening load of the network).
+
+<p><a name="CDMA"></a><b>CDMA</b> (<b>C</b>ode <b>D</b>ivision <b>M</b>ultiple <b>A</b>ccess; also known as IS-95)
+<br>One of the newer digital technologies in 800 or 1900 Mhz. Used in North America, Australia and some southeastern Asian countries
+(e.g. Hong Kong and South Korea). It doesn't divide the radio frequency
+spectrum into separate user channels by frequency slices or time slots, but
+separates users by assigning them digital codes within the same broad spectrum.
+
+<p><a NAME="DCCH"></a><b>DCCH</b> (<b>D</b>igital <b>C</b>ontrol <b>Ch</b>annel)
+<font size=-2>(TDMA 800/TDMA 1900)</font>
+
+<p><a NAME="DCS"></a><b>DCS</b> (<b>D</b>igital <b>C</b>ellular <b>S</b>ystem)
+<br>Cellular communication system working in 1800 MHz frequency band
+(currently more often called GSM 1800) \96 a changed version of <a href="#GSM">GSM</a> (900 MHz) system.
+Its new features allowed to increase network capacity (that\92s why this system is used in urban areas with huge number
+of subscribers) at the cost of thick net of the base stations (<a href="#BTS">BTSes</a>)
+and to provide roaming within one country. GSM 1800 has different channel numbers
+(see <b><a href="faq_net3.htm#Menu17">test 17</a></b>), different phone
+(see <a href="faq_net2.htm#RX">RX description</a>) and <a href="#BTS">BTSes</a>
+transmission power and also different max speed of the user, at which he can use his phone
+(250 km/h in GSM and 130 km/h in DCS).
+
+<p><a NAME="DSP"></a><b>DSP</b> (<b>D</b>igital <b>S</b>ignal <b>P</b>rocessor)
+<br>Signal processor (digital signals processing chip - controls radio interface and speech coding/decoding).
+Its version can be checked in <b><a href="faq_net5.htm#Menu88">test 88</a></b>.
+
+<p><a NAME="DTCH"></a><b>DTCH</b> (<b>D</b>igital <b>T</b>raffic <b>Ch</b>annel)
+<font size=-2>(TDMA 800/TDMA 1900)</font>
+
+<p><a NAME="DTX"></a><b>DTX</b> (<b>D</b>iscontinous <b>T</b>ransmission E<b>x</b>change)
+<br>Some phones and networks "care" ;-) about battery life using so called discontinuous transmission (DTX),
+which turns off phone\92s transmitter when we don\92t talk (but \96 for example - listen to the calling party).
+During that period the phone generates a so called comfortable :-) noise, because if our interlocutor heard the silence,
+he could think that the connection was broken.
+
+<p><font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>:
+<br><b>DTX</b> must be supported by the phone (Nokia does - see
+<b><a href="faq_net5.htm#Menu78">test 78</a></b>) and <a href="#BTS">BTS</a> - you can check and
+(sometimes) change this in <b><a href="faq_net3.htm#Menu12">test 12</a></b> and
+<b><a href="faq_net3.htm#Menu13">test 13</a></b>.
+
+<p><a NAME="FDMA"></a><b>FDMA</b> (<b>F</b>requency <b>D</b>ivision <b>M</b>ultiple <b>A</b>ccess)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>This name means multiaccess on frequency field: transmission proceeds on different frequencies at the same time
+(this is a "full duplex" connection): there is a \93down-link\94 from <a href="#BTS">BTS</a> to the phone and
+\93up-link\94 - from the phone to <a href="#BTS">BTS</a> (this is called "up" and "down" because <a href="#BTS">BTS</a>
+antennas are usually higher than phone ones, so the signal from <a href="#BTS">BTS</a> to the phone
+really must go down (and vice versa)).
+
+<p><a NAME="Hopping"></a><b>Frequency hopping</b> (channel hopping)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>During connection your phone can continuously change used frequency (used channel) in communication with cell.
+It's used, when some channel is still troubled - without <b>channel hopping</b>
+communication with phone could not be possible, with it it's - only this
+part of transmition, which is made on this frequency, is lost (so, if gives less number of
+signal loss, but doesn't change sound quality - methods of coding it are always
+the same). You can check (during a call) if your phone uses this function in
+<b><a href="faq_net2.htm#Menu1">test 1</a></b>. <b><a href="faq_net3.htm#Menu12">test 12</a></b> informs
+if it is allowed by the cell (these values are updated only during a call). <b>Channel hopping</b> requires
+Hopping Sequence Number (frenquencies are changed according to known for phone and network sequence)
+- see <b><a href="faq_net2.htm#Menu2">test 2</a></b>.
+
+<p><a NAME="GSM"></a><b>GSM</b> (<b>G</b>lobal <b>S</b>ystem for <b>M</b>obile Communication)
+<br>Cellular telecommunication system working at 900 MHz. It also has a 1800 MHz (<a href="#DCS">DCS</a>) and
+1900 MHz (PCS) version.
+
+<p><a NAME="HLR"></a><b>HLR</b> (<b>H</b>ome <b>L</b>ocation <b>R</b>egister)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Network register containing information about subscribers (i.e. about their subscribed services,
+tariff, last network they were logged in, etc.).
+
+<p><a NAME="IMEI"></a><b>IMEI</b> (<b>I</b>nternational <b>M</b>obile <b>E</b>quipment <b>I</b>dentification code)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Unique 15-digit identification number of every <a href="#GSM">GSM</a> phone on the world. It can be checked using <b>*#06#</b> code
+(all phones) or in service menu (Nokia), which can be activated by typing a code <b>*#WAR0ANTY#</b> or
+<b>*#WARRANTY#</b> (Nokia 6130). In Nokia 3110 after entering service menu (<b>*#WAR0ANTY#</b>)
+you have to additionally enter a code <b>9268</b>. <b>IMEI</b> contains information about the manufacturer,
+place of production and serial number (check <a href="http://www.tele-servizi.com/janus/texts/imei.txt">www.tele-servizi.com/janus/texts/imei.txt</a>
+for such list for Motorola phones,
+<a href=../firmware/firmware.htm>here</a> is my list for Nokia phones).
+Operators can restrict network access for particular phones \96 for example the stolen ones
+(identified using <b>IMEI</b> number). Different operators can exchange such lists too.
+
+<p><a NAME="IMSI"></a><b>IMSI</b> (<b>I</b>nternational <b>M</b>obile <b>S</b>ubscriber <b>I</b>dentify)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Unique (max 15-digit) number given to the phone:
+
+<p>
+<ul>
+<li>first three digits are <a href="faq_net2.htm#MCC">MCC</a></li>
+<li>next three digits are <a href="faq_net2.htm#MNC">MNC</a></li>
+<li>the rest is a unique number</li>
+</ul>
+
+<p><a NAME="IMSIattach"></a><b>IMSI attach</b>
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>It is a procedure executed after each power on. The phone informs network that it is active (and is ready for communication
+- receiving waiting SMS, etc.) and then it receives the <a href="#IMSI">IMSI</a> number.
+The counter connected with <b>IMSI attach</b> is located in <b><a href="faq_net5.htm#Menu64">test 64</a></b>,
+<b><a href="faq_net2.htm#Menu7">test 7</a></b> informs whether this is allowed by the current cell.
+
+<p><a NAME="IMSIdetach"></a><b>IMSI detach</b>
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>The phone informs network that it is going to switch off and the communication won\92t be possible
+(its <a href="#IMSI">IMSI</a> expires). The counter connected with <b>IMSI detach</b> is located in
+<b><a href="faq_net5.htm#Menu64">test 64</a></b>. <b><a href="faq_net2.htm#Menu7">test 7</a></b>
+informs whether this is allowed by the current cell.
+
+<p><a NAME="LocationUpdate"></a><b>Location Update</b>
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Every <a href="#GSM">GSM</a> phone periodically informs network about its current location.
+This function is called <b>Location Update</b>. It is executed after changing <b>Location Area</b> (phone makes
+it "intelligent" - when it's moved out of network coverage and the logs again to the network, makes <b>Location Update</b>
+only when current <a href="faq_net1.htm#BTS">BTS</a> has different LAC than previous one \96 before losing the signal) or
+<a href="#PLMN">PLMN</a> (after leaving the range of one network and trying to log in to another).
+Then information about <b>Location Update</b> is transferred to a new <a href="#MSC">MSC</a>/<a href="#VLR">VLR</a>,
+which in turn passes this information to <a href="#HLR">HLR</a>. When the phone works in new
+<a href="#MSC">MSC</a>/<a href="#VLR">VLR</a>, <a href="#HLR">HLR</a> doesn\92t identify the user by
+the number received from old <a href="#MSC">MSC</a>/<a href="#VLR">VLR</a> anymore. <b>Location Update</b>
+has a couple of varieties: <a href="#PLU">PLU</a>, <a href="#IMSIattach">IMSI attach</a> and <a href="#IMSIdetach">IMSI detach</a>
+(they're distinquished in <b><a href="faq_net5.htm#Menu64">test 64</a></b>). Current Location Area code can be checked in
+<b><a href="faq_net3.htm#Menu11">test 11</a></b>.
+
+<p><a NAME="MCU"></a><b>MCU</b> (<b>M</b>aster <b>C</b>ontrol <b>U</b>nit processor)
+<br>Main processor in phone.
+
+<p><a NAME="MSC"></a><b>MSC</b> (<b>M</b>obile <b>S</b>witching <b>C</b>enter)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Part of the system responsible for communication between subscribers and other users (also from other networks).
+
+<p><a NAME="NCC"></a><b>NCC</b> (<b>N</b>ational <b>C</b>olor <b>C</b>ode or <b>N</b>etwork <b>C</b>olor <b>C</b>ode)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>3-bit number (from 0-7 range) used to differentiate cells of the operators from different countries
+(for example near the border, where the phone is in range of several different networks) transmitting using
+<a href="faq_net2.htm#BCCH">BCCH</a> in the same <a href="#FDMA">FDMA</a> channel. This number is constant
+within <a href="#PLMN">PLMN</a>. It is given in <a href="#BSIC">BSIC</a> of every <a href="#BTS">BTS</a>
+(you can check it in <b><a href="faq_net2.htm#Menu2">test 2</a></b>).
+
+<p><a NAME="PLMN"></a><b>PLMN</b> (<b>P</b>ublic <b>L</b>and <b>M</b>obile <b>N</b>etwork)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Area covered by one operator (one network). After changing this area, the phone executes
+<a href="#LocationUpdate">Location Update</a>.
+
+<p>
+<ul>
+<li>Coverage maps of different operators worldwide can be found at <a href="http://www.subcam.freeserve.co.uk/mark/orange/ora.html">www.subcam.freeserve.co.uk/mark/orange/ora.html</a>.</li>
+</ul>
+
+<p><a NAME="PLU"></a><b>PLU </b>(<b>P</b>eriodic <b>L</b>ocation <b>U</b>pdate)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>The phone informs network, on which country area (in the range of which cells) it is located.
+This procedure is executed periodically (depending on the network, for example in polish
+<a href="http://www.eragsm.pl/">Era GSM</a> and
+<a href="http://www.plusgsm.pl/">Plus GSM</a> networks every 3rd hour, in
+<a href="http://www.idea.centertel.pl/">Idea</a> every 2th hour)
+- this can be checked in <b><a href="faq_net3.htm#Menu10">test 10</a></b>. This period is counted from the
+last \84contact\94 with network (the counter doesn\92t stop even if the phone loses network signal!) \96 from the last call, sending/receiving
+SMS, requesting some services (for example enabling call diverting), because the network is then informed about phone\92s
+location (but this is not registered in <b><a href="faq_net5.htm#Menu64">test 64</a></b>).
+The counter connected with <b>PLU</b> is in <b><a href="faq_net5.htm#Menu64">test 64</a></b>.
+
+<p><a NAME="TCH"></a><b>TCH</b> (<b>T</b>raffic <b>Ch</b>annels)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>Two way user data (computer data or digitized voice) channels. They can be divided to:
+
+<ul>
+<li>
+<a NAME="HR"></a><b>HR</b> (<b>H</b>alf <b>R</b>ate Traffic): max data transfer rate is 6.5 kbit/sec (introduced in
+GSM phase 2). <b>HR</b> channels offer worse sound quality but also longer phone standby time (even up to 30%),
+because the phone using <b>HR</b> uses less power. The main advantage of this kind of channels is that they
+enable the network to double its capacity (the number of subscribers able to make a call at the same time \96 see
+<a href="#TS">TS parameter</a> description for more details) or to double the max range of the
+<a href="#BTS">BTS</a>. Using these channels must be allowed and supported by the network (this can be
+checked in <b><a href="faq_net2.htm#Menu7">test 7</a></b>) and the phone. Activation code is
+<b>*HRC0#</b>, deactivation code is <b>#HRC0#</b>. Unfortunately, not all Nokia phones accept these codes
+(the phone should reset itself after entering them) \96 in older models they're not supported, in never they're deactivated, when
+the phone is directed to countries with networks, which doesn't support it.
+Interesting fact is that in Nokia 6110 (firmware 5.24) you can decide whether the phone can use this channel or not by modifying
+following EEPROM memory cells values:
+
+<table BORDER CELLSPACING=0 CELLPADDING=0>
+<tr>
+<td ALIGN=CENTER><b>enabling</b></td>
+
+<td ALIGN=CENTER><b>disabling</b></td>
+</tr>
+
+<tr>
+<td ALIGN=CENTER>cell 0070 value for 78
+<br>cell 011F value for 84</td>
+
+<td ALIGN=CENTER>cell 0070 value for 70
+<br>cell 011F value for 7C</td>
+</tr>
+</table>
+</li>
+
+<li>
+<a NAME="FR"></a><b>FR</b> (<b>F</b>ull <b>R</b>ate Traffic):transmission at 13 kbit/sec, coding using
+LPC-RPE (<b>L</b>inear <b>P</b>rediction <b>C</b>oding with <b>R</b>egular <b>P</b>ulse <b>E</b>xcitation) algorithm</li>
+
+<li>
+<a NAME="EFR"></a><b>EFR</b> (<b>E</b>nhanced <b>F</b>ull <b>R</b>ate):
+13 kbit/sek, coding algorithm different than in <a href="#FR">FR</a> (ASELP (AlgebraicCode Excitation Linear Prediction)
+created by <a href="http://www.nokia.com">Nokia</a> and Sherbrooke University; recognized as an industrial standard for
+<a href="#GSM">GSM</a>). <b>EFR</b> provides better sound quality at the same data transmission rate (and up to 5%
+faster battery drain compared to <a href="#FR">FR</a>). This mode can be enabled using
+<b>*EFR0#</b> code (the phone then tries to use <b>TCH</b> channels in following order: <b>EFR</b>, <b>FR</b>,
+(<b>HR</b>)) and disabled with <b>#EFR0#</b> (order: <b>FR</b>, (<b>HR</b>)). These codes may be not recognized
+by some models (for example 6110 with some firmware versions) -
+if your phone accepts them, it should reset itself right after typing them
+(if this doesn\92t happen, you won\92t be able to enable/disable <b>EFR</b> using a keyboard code).
+This channel is not supported in all older models (for example, 2110).
+The type of channel used by your phone can be checked only during connection.
+</li>
+</ul>
+
+<p>When you network doesn't support one of these channel and phone recognizes its activation code, you may see
+"Not ready" message.
+
+<p>You can check this in <b><a href="faq_net2.htm#Menu1">test 1</a></b>.
+The sequence of <b>TCH</b> channels can be freely set using some of the service programs
+(for example WinTesla \96 in Software/Product Profile menu) - it can be only possibility to enable <b>HR</b> channel in phone.
+
+<p><a name="TDMA"></a><b>TDMA</b> (<b>T</b>ime <b>D</b>ivision <b>M</b>ultiple <b>A</b>ccess)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>This means multiaccess in time: several phones can transmit signal (either digitized voice or computer data) in the
+same time on the same channel (its number can be checked in <b><a href="faq_net2.htm#Menu1">test 1</a></b>) \96
+actually, this period of time is divided into very small parts (see <a href="#TS">TS description</a>),
+invisible for us, so we can assume it happens simultaneously).
+
+<p><a name="TMSI"></a><b>TMSI</b> (<b>T</b>emporary <b>M</b>obile <b>S</b>ubscriber <b>I</b>dentity):
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>During signalization procedures encrypted on radio channel
+(for example, during location update) this number is assigned by
+<a href="#MSC">MSC</a> to phone. In the moment, when network wants to contact
+with concrete phone and transmission on radio channel is not encrypted, it's send
+instead of <a href="#IMSI">IMSI</a> and allows phone to indentify, that concrete
+call concern on it. It doesn't have global meaning
+and it's structure is definited by network administrator. Actual <b>TMSI</b>
+you can check in <a href="faq_net3.htm#Menu10">test 10</a>.
+
+<p><a NAME="TS"></a><b>TS</b> (<b>T</b>ime <b>S</b>lot)
+<br>Each radio channel used in communication between phone and
+<a href="#BTS">BTS</a> is divided into 8 parts (called TS - time slots). If in all <a href="#BTS">BTSes</a>
+(available for your phone) all time slots are in use, you won't be able to make/receive a call and you'll get a 'Network busy'
+message (information about reason of connection failure is given among others in
+<b><a href="faq_net4.htm#Menu39">test 39</a></b>). Unfortunately, each type of connection has the same priority in
+networks not supporting GSM Phase 2+ (it isn't available in older GSM Phases) - so if you want to dial emergency number 112
+and the network is busy, no other call will be interrupted and you won't get connected. This problem can also be solved by
+adding more <a href="#BTS">BTSes</a> (for example in dual GSM 900/1800 MHz network) or by modifying
+current stations to allow the use of <a href="#HR">HR</a> channels (<a href="#FR">FR</a>
+and <a href="#EFR">EFR</a> transmission uses whole assigned time slot, while <a href="#HR">HR</a>
+(defined in GSM Phase 2) only half of it). Max data transmission speed using one <b>TS</b> is 9.6 kbit/sec (or 14.4 kbit/sec,
+but only in some additional conditions). There are new systems allowing higher transmission speeds
+(for example GPRS (<b>G</b>eneric <b>P</b>acket <b>R</b>adio <b>S</b>ervices) or HSCSD
+(<b>H</b>igh <b>S</b>peed <b>C</b>ircuit <b>S</b>witched <b>D</b>ata), but they achieve this using several time slots
+at the same time (which decreases network capacity). Actual used <b>TS</b> can be checked
+in <a href=faq_net2.htm#Menu1>test 1</a>, in phones with <b>HSCSD</b> (like Nokia 6210)
+use also <a href=faq_net3.htm#Menu8>test 8</a> for it...
+
+<p><a NAME="VLR"></a><b>VLR</b> (<b>V</b>isitor <b>L</b>ocation <b>R</b>egister)
+<font size=-2>(<a href="#GSM">GSM</a>/<a href="#DCS">DCS</a>/PCS)</font>
+<br>This register contains the same data as <a href="#HLR">HLR</a>, but for roaming guests
+(their data are taken from their home network <a href="#HLR">HLR</a>).
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a><br>
+
+<center>
+<p><a href="faq_net0.htm">[Part 1]</a><b>[Part 2]</b><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wiacek<Marcin-Wiacek@topnet.pl>">Marcin Wiacek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Last modification: 5 January 2002</font>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta name="Author" content="Marcin Wiacek">
+ <meta name="Description" content="NOKIA NetMonitor description (English version)">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="language" content="us">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, Marcin, Wiacek, Marcin Wiacek">
+ <title>NetMonitor in Nokia phones (3/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<font class="drukuj">
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+</font>
+<center><font color="#1F409F" size=+2 class="tytul">NetMonitor in Nokia phones (3/7)</font>
+<font class="drukuj">
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><b>[Part 3]</b><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</font>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+<a NAME="Top"></a>
+
+<font class="drukuj">
+<ol>
+<li><a href="faq_net0.htm#1"><b>What is it ?</b></a></li>
+<li><a href="faq_net0.htm#2"><b>Do I need it ?</b></a></li>
+<li><a href="faq_net0.htm#3"><b>Does my phone use more power with NetMonitor enabled ?</b></a></li>
+<li><a href="faq_net0.htm#4"><b>How to activate it ?</b></a></li>
+<li><a href="faq_net0.htm#5"><b>Which NetMonitor version can be activated in my phone ?</b></a></li>
+<li><a href="faq_net0.htm#6"><b>Does NetMonitor activation void warranty ?</b></a></li>
+<li><a href="faq_net0.htm#7"><b>NetMonitor menu in my phone has different number than 10. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#8"><b>NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#9"><b>How to use it ?</b></a></li>
+<li><a href="faq_net0.htm#10"><b>Can I damage my phone ?</b></a></li>
+<li><a href="faq_net1.htm#11"><b>Glossary</b></a></li>
+<li><a href="#12"><b>Description of the individual tests</b></a></li>
+<li><a href="faq_net6.htm#13"><b>You can also use a program...</b></a></li>
+<li><a href="faq_net6.htm#14"><b>Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</b></a></li>
+<li><a href="faq_net6.htm#15"><b>How can I disable NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#16"><b>Do I need to disable NetMonitor before sending my phone to the service ?</b></a></li>
+<li><a href="faq_net6.htm#17"><b>Is it possible to re-activate NetMonitor after disabling it ?</b></a></li>
+<li><a href="faq_net6.htm#18"><b>Is NetMonitor available in analog Nokia phones ?</b></a></li>
+<li><a href="faq_net6.htm#19"><b>Does NetMonitor allow to use phone like broadcast station ?</b></a></li>
+<li><a href="faq_net6.htm#20"><b>I don't have all described tests in my phone. Why ? Can I increase their number ?</b></a></li>
+<li><a href="faq_net6.htm#21"><b>Does NetMonitor allow to identify place, where is my interlocutor ?</b></a></li>
+<li><a href="faq_net6.htm#22"><b>Does NetMonitor allow to identify place, where am I ?</b></a></li>
+<li><a href="faq_net6.htm#23"><b>What are NetMonitor codes ?</b></a></li>
+<li><a href="faq_net6.htm#24"><b>Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</b></a></li>
+<li><a href="faq_net6.htm#25"><b>Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#26"><b>I have non existing networks on the list of forbidden networks...</b></a></li>
+<li><a href="faq_net6.htm#27"><b>How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</b></a></li>
+<li><a href="faq_net6.htm#28"><b>Can I use DLR-2/DLR-3 cables for activating netmonitor ?</b></a></li>
+<li><a href="faq_net6.htm#29"><b>Can I activate netmonitor using Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="faq_net6.htm#30"><b>Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</b></a></li>
+<li><a href="faq_net6.htm#31"><b>How to change settings in tests ?</b></a></li>
+<li><a href="faq_net6.htm#32"><b>My phone has very short snandby time - it is possible to see the reason of it ?</b></a></li>
+<li><a href="faq_net6.htm#33"><b>Is netmonitor available in English version only ?</b></a></li>
+<li><a href="faq_net6.htm#Literatura"><b>Information sources</b></a></li>
+<li><a href="faq_net6.htm#35"><b>Additional information</b></a></li>
+<li><a href="faq_net6.htm#36"><b>Does using/activating netmonitor cost anything ?</b></a></li>
+<li><a href="faq_net6.htm#37"><b>Does using netmonitor is legall ?</b></a></li>
+<li><a href="faq_net6.htm#38"><b>Which entries on SIM card are used in netmonitor tests ?</b></a></li>
+<li><a href="faq_net6.htm#39"><b>Can I activate netmonitor in 3310 using soft working with 3210 ?</b></a></li>
+<li><a href="faq_net6.htm#40"><b>After activating netmonitor/BTS TEST my phone can't find network...</b></a></li>
+<li><a href="faq_net6.htm#41"><b>Netmonitor shows different battery capacity than info on it...</b></a></li>
+</ol>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<p><a NAME="12"></a><font color="#1F409F" size=+2 class="dzial">12. Description of the individual tests</font><br>
+<hr size="3" align="left" noshade width="300" color="#60C0A0">
+
+<p><a NAME="jest"></a>Existence of the individual test in your phone depends on:
+
+<p>
+<ul>
+<li>phone model: generally, never and more complicated models (with more functions and options) have more tests (for example,
+Nokia 9110 has more tests than 5110, 7110 more than 9110). There is one (only ?) exception: less complicated Nokia 5110
+has bigger NetMonitor than 6110 (and that\92s why I think that this model is better, even though it doesn\92t have some functions).</li>
+
+<li>software version - usually the newer version, the more options it has (software can be upgraded in service and its
+version can be checked in most models with <b>*#0000#</b> code, in Nokia 6130 with <b>*#9999#</b> and in
+3110 with <b>*#3110#</b>) \96 for instance in Nokia 5110 in <b><a href="faq_net5.htm#Menu89">test 89</a></b> bbbbbb
+parameter is shown only from firmware 5.07. Firmware upgrade has also additional advantage: newer versions don\92t
+contain some bugs (also in NetMonitor).</li>
+
+<li>who uploaded firmware to the phone: it is usually written in C (and then translated (compiled) to the code of phone\92s
+microprocessor). According to my own private theory existence (and running) of an individual tests depends on some
+constants set (or not) in the source code (programmers :-) surely understand, what I\92m trying to write). The best example
+for this can be <b><a href="faq_net4.htm#Menu38">test 38</a></b>: according to the some English documentation
+it doesn't exist in phones to be sold, because DEV_FT_MEMORY_DUMP_IN_USE constant in file ftd_conf.h
+(one of the firmware source code files) wasn't set before compiling. I think, that the same applies to the help screens \96
+their presence doesn\92t depend on firmware version but on where the phone was purchased (where it comes from \96
+where was its firmware uploaded). How to solve this problem? Unfortunatelly, you can only download firmware again (compiled
+from source with set constants).
+
+<p>Aha, I\92m also not quite sure, whether <a href="faq_net1.htm#DSP">DSP</a> tests
+(<b><a href="faq_net5.htm#Menu70">test 70</a></b>, <b><a href="faq_net5.htm#Menu73">10-73</a></b>,
+<b><a href="faq_net5.htm#Menu74">10-74</a></b>,
+<b><a href="faq_net5.htm#Menu76">10-76</a></b> (except for ab parameter), <b><a href="faq_net5.htm#Menu77">10-77</a></b>,
+<b><a href="faq_net5.htm#Menu78">10-78</a></b>
+and <b><a href="faq_net5.htm#Menu79">10-79</a></b>) don\92t have to be enabled this way (or whether their existence
+(or not) depends on the network).
+</li>
+</ul>
+
+<p>Help screens for tests are written with <b>bold font</b>,
+concrete (example) values in tests with <i>italic</i> (I put them there, where I didn't have more details about test).
+
+<p>
+<ul>
+<li>sample screenshoots from Nokia 2110i, 5110, 6110 and 9110 (of course, with NetMonitor) are on the
+<a href="http://www.yaws.dk/communicator/faq/miscellanous/mbus/">www.yaws.dk/communicator/faq/miscellanous/mbus/</a>
+or <a href="http://www.fan.net.au/~mrvfone/vfone/techtop/">www.fan.net.au/~mrvfone/vfone/techtop/</a> page.
+First of them contains NetMonitor manual for Nokia 9110 signed with my and
+Michal Jerz (<a href="http://my-communicator.com/">http://my-communicator.com/</a>) name. Unfortunatelly, author of this site doesn't want to update it
+and I suggest rather to read this FAQ..</li>
+<li><a href="http://www.mobil.cz/triky/netmonstarsinok000322.html">http://www.mobil.cz/triky/netmonstarsinok000322.html</a>
+(Nokia 2110 and 3110)</li>
+</ul>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="Menu1"></a><b>Test 1</b>
+<br>Information about communication with cell
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>abbb ccc ddd<br>
+ e ff g mmmm<br>
+ nnn ppp<br>
+ oooo</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CH RxL TxPwr<br>
+TS TA RQ RLT<br>
+ C1 C2<br>
+ CHT</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+a - contains H, if <a href="faq_net1.htm#Hopping">frequency hopping</a> is enabled (otherwise empty). This information
+can also be found in <b><a href="faq_net3.htm#Menu11">test 11</a></b>
+and <b><a href="faq_net3.htm#Menu12">test 12</a></b>.</li>
+
+<li>
+bbb - CH (<b>ch</b>annel): number of the channel used in communication with cell (decimal). If
+<a href="faq_net1.htm#Hopping">frequency hopping</a> is enabled, this number changes when the display gets refreshed.
+This parameter determines frequencies used in communication with <a href="faq_net1.htm#BTS">BTS</a>:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td nowrap><center><b>carrier (middle) frequency
+of the transmission channel (MHz)
+</b></center></td>
+
+<td nowrap><center><b>GSM 900</b></center></td>
+<td nowrap><center><b>GSM 1800</b></center></td>
+</tr>
+
+<tr>
+<td nowrap><center>transmission phone-<a href="faq_net1.htm#BTS">BTS</a></center></td>
+<td nowrap><center>890 + CH * 0,2</center></td>
+<td nowrap><center>1710 + (CH - 511) * 0,2</center></td>
+</tr>
+
+<tr>
+<td nowrap><center>transmission <a href="faq_net1.htm#BTS">BTS</a>-phone</center></td>
+<td nowrap><center>935 + CH * 0,2</center></td>
+<td nowrap><center>1805 + (CH - 511) * 0,2</center></td>
+</tr>
+
+</table>
+
+<p>
+and informs, whether phone use cell working in GSM 900 or 1800 MHz
+(I write more about channel numbers in <b><a href="faq_net3.htm#Menu17">test 17</a></b>).
+
+<p>
+
+</li>
+
+<li>
+<p><a NAME="RX"></a>ccc - <a href="faq_net1.htm#RX">RX</a>:
+minus is not show if <=-100. This parameter affects following functions:
+
+<p>
+<ul>
+<li>
+if all channels\92 signal is weaker than -110 dBm, the phone doesn\92t monitor channels.</li>
+
+<li>
+if the phone loses signal of your home network, it tries to monitor next available networks and if you don't have access to them,
+you\92ll see a network presence symbol and no signal strength bars (but you can make emergency calls)
+</li>
+
+<li>
+ if some other network has a very strong signal (say -85 dBm) and your home network is very weak on that area (for example,
+-100 dBm), your phone can have big problems with logging into it (you will have to use
+<b><a href="faq_net3.htm#Menu17">test 17</a></b> to manually force the phone to use proper channel).
+</li>
+
+<li>
+RXLev parameter value:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td><b>RX (from)</b></td><td><b>RX (up to)</b></td><td><b>RXLev</b></td></tr>
+<tr ALIGN=CENTER><td>less than</td><td>-110 dBm</td><td>0</td></tr>
+<tr ALIGN=CENTER><td>-110 dBm</td><td>-109 dBm</td><td>1</td></tr>
+<tr ALIGN=CENTER><td>-109 dBm</td><td>-108 dBm</td><td>2</td></tr>
+<tr ALIGN=CENTER><td>...</td><td>...</td><td>...</td></tr>
+<tr ALIGN=CENTER><td>-49 dBm</td><td>-48 dBm</td><td>62</td></tr>
+<tr ALIGN=CENTER><td>-48 dBm</td><td>morej</td><td>63</td></tr>
+</table>
+<p>
+</li>
+
+<li>
+signal strength indicator value on the left side of the display (approximately):
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td><b>RX (from - to)</b></td><td><b>amount of bars</b></td></tr>
+<tr ALIGN=CENTER><td>from -105 to -100 dBm</td><td>0</td></tr>
+<tr ALIGN=CENTER><td>from -100 to -95 dBm</td><td>1</td></tr>
+<tr ALIGN=CENTER><td>from -95 to -90 dBm</td><td>2</td></tr>
+<tr ALIGN=CENTER><td>from -90 to -85 dBm</td><td>3</td></tr>
+<tr ALIGN=CENTER><td>more than -85 dBm</td><td>4</td></tr>
+</table>
+<p>
+</ul>
+</li>
+</li>
+
+<li>
+<p><a name="TX"></a>ddd - TX: level of the transmitted signal (only during connection). If the phone\92s transmitter is active,
+there is an * (asterisk) before the value. The lower value, the higher power level (also the one received by your head!) and
+energy consumption.
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td nowrap><b>TX (GSM 900)</b></td><td>16</td><td></td><td>15</td><td></td><td>14</td><td></td><td>13</td><td></td><td>12</td><td></td><td>11</td><td></td><td>10</td><td></td><td>9</td><td></td></tr>
+<tr ALIGN=CENTER><td nowrap><b>TX (GSM 1800)</b></td><td></td><td>9</td><td></td><td>8</td><td></td><td>7</td><td></td><td>6</td><td></td><td>5</td><td></td><td>4</td><td></td><td>3</td><td></td><td>2</td></tr>
+<tr ALIGN=CENTER><td><b>dBm</b></td><td>11</td><td>12</td><td>13</td><td>14</td><td>15</td><td>16</td><td>17</td><td>18</td><td>19</td><td>20</td><td>21</td><td>22</td><td>23</td><td>24</td><td>25</td><td>26</td></tr>
+<tr ALIGN=CENTER><td><b>Watts</b></td><td>0,012</td><td>0,016</td><td>0,02</td><td>0,025</td><td>0,032</td><td>0,04</td><td>0,05</td><td>0,063</td><td>0,079</td><td>0,1</td><td>0,125</td><td>0,158</td><td>0,2</td><td>0,251</td><td>0,316</td><td>0,398</td></tr>
+</table>
+
+<p>and continue...
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td nowrap><b>TX (GSM 900)</b></td><td>8</td><td></td><td>7</td><td></td><td>6</td><td></td><td>5</td><td></td><td>4</td><td></td><td>3</td><td></td><td>2-0</td><td></td><td></td><td></td><td></td></tr>
+<tr ALIGN=CENTER><td nowrap><b>TX (GSM 1800)</b></td><td></td><td>1</td><td></td><td>0</td><td></td><td>31</td><td></td><td>30</td><td></td><td>29</td><td></td><td></td><td></td><td></td><td></td><td></td><td></td></tr>
+<tr ALIGN=CENTER><td><b>dBm</b></td><td>27</td><td>28</td><td>29</td><td>30</td><td>31</td><td>32</td><td>33</td><td>34</td><td>35</td><td>36</td><td>37</td><td>38</td><td>39</td><td>40</td><td>41</td><td>42</td><td>43</td></tr>
+<tr ALIGN=CENTER><td><b>Watts</b></td><td>0,501</td><td>0,631</td><td>0,794</td><td>1</td><td>1,26</td><td>1,58</td><td>2</td><td>2,51</td><td>3,16</td><td>3,98</td><td>5</td><td>6,31</td><td>8</td><td>10</td><td>12</td><td>15,8</td><td>20</td></tr>
+</table>
+
+<p>
+Watt = 10<sup>(dBm/10)</sup>*0,001
+<br>dBm = 10*log(Watt/0,001)
+
+<p>There are following classes describing max phone transmission power:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr><td><center><b>GSM 900</b></center></td><td><center><b>GSM 1800</b></center></td></tr>
+
+<tr>
+<td>
+<center>20 W (not in use)
+<br>8 W (car/mobile phone)
+<br>5 W (car/mobile phone)
+<br>2 W (hand phone)
+<br>0,8 (hand phone)</center>
+</td>
+
+<td>
+<center>1 W (hand phone)
+<br>0,25 W (hand phone)</center>
+</td>
+</tr>
+</table>
+
+<p>Min. phone transmission power in GSM 900 is 0,02 W and in GSM 1800 is 0,0025 W (4 dBm).
+
+<p>Max <a href="faq_net1.htm#BTS">BTS</a> power level can be found in their description.
+
+</li>
+
+<li>
+<p>e - This <b>TS</b> indicator shows number of the used <a href=faq_net1.htm#TS>time slot</a>
+(0..7 for <a href="faq_net1.htm#FR">FR</a> (<a href="faq_net1.htm#EFR">EFR</a>) or 0..15 for <a href="faq_net1.htm#HR">HR</a>).
+For phones with <b>HSCSD</b> (like Nokia 6210) use also <a href=faq_net3.htm#Menu8>test 8</a> for it.
+</li>
+
+<li>
+<p><a NAME="TA"></a>ff - TA (<b>T</b>iming <b>A</b>dvance): <a href="faq_net1.htm#BTS">BTS</a> informs the phone,
+when it should start transmission (so that it reaches <a href="faq_net1.htm#BTS">BTS</a> in time). This information is shown
+by this indicator. It lets us calculate approximate distance between phone and <a href="faq_net1.htm#BTS">BTS</a>, which is
+a value between TA*550 m and (TA+1)*550 m (remember, that sometimes signal is refracted and
+distance evaluated with this parameter can be wrong).
+This parameter is updated during communication with network (sending/receiving
+SMSes, calling, requesting services), for example when using <a href="#SDCC">SDCC</a> and <a href="#TFR">TFR</a>
+channels. It ranges from 0 to 63 (up to 35 km) with <a href="faq_net1.htm#FR">FR</a> and
+<a href="faq_net1.htm#EFR">EFR</a> channels. <a href="faq_net1.htm#HR">HR</a> channels offer theoretically (for example
+with a car antenna (higher transmitting power) and a flat terrain) twice this range (up to 70 km) and TA contains value up to 128
+(English descriptions which I use don\92t say a word about it - so, it's possible,
+that for values bigger than 64 phone (?) decreases 64 from it and displays such value in this menu).
+
+<p><b>Tip</b>: you can use ALS (<b>A</b>lternative <b>L</b>ine <b>S</b>ervice) function or
+try to call for "*" number, when you want to refresh it...<p>
+
+</li>
+
+<li>
+<p>g - RXQUAL_SUB (rate of transmission errors with <a href="faq_net1.htm#DTX">DTX</a> active
+(<a href="faq_net1.htm#DTX">DTX</a> state can be checked in <b><a href="faq_net3.htm#Menu12">test 12</a></b>)):
+it determines, how many errors during connection have to be corrected by the phone for the call to be possible. Range 0 - 7
+(0 \96 means no errors; more than 5 \96 connection may be interrupted). The higher it is, the worse quality you have...
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER VALIGN=CENTER><td nowrap><b>RQ value</b></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
+<tr ALIGN=CENTER VALIGN=CENTER><td nowrap><b>Max error amount</b></td><td><0,2%</td><td><0,4%</td><td><0,8%</td><td><1,6%</td><td><3,2%</td><td><6,4%</td><td><12,8%</td><td>>12,8%</td></tr>
+</table>
+<p>
+</li>
+
+<li>
+<p>mmmm - RLT (<b>R</b>adio <b>L</b>ink <b>T</b>imeout): if it is negative, 0 is shown. Max value of this parameter is 64.
+If the phone uses a channel different than <a href="faq_net1.htm#TCH">TCH</a> or <a href="#SDCC">SDCC</a>, xx is
+displayed
+</li>
+
+<li><p>nnn - <a href="faq_net1.htm#C1">C1</a> parameter </li>
+
+<li>
+<p>ppp - <a href="faq_net1.htm#C2">C2</a> parameter. If network supports only GSM Phase 1,
+<a href="faq_net1.htm#C1">C1</a> value is displayed here.
+</li>
+
+<li>
+<p>oooo - type of channel currently used by the phone (visit
+<a href="http://www.pins.co.uk/upages/stratfordc/">www.pins.co.uk/upages/stratfordc/</a>
+to find C programs containing algorithms used to encode different channels).
+With <a href="faq_net1.htm#HR">HR</a> channels phone even show, if first or second
+part of <a href="faq_net1.htm#TS">TS</a> is used (subchannel 0 or 1 is written):
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+
+<tr>
+<td>AGCH</td>
+<td><a NAME="AGCH"></a>(<b>A</b>ccess <b>G</b>rant <b>Ch</b>annel) - a channel used by
+<a href="faq_net1.htm#BTS">BTS</a> to inform the phone about what channel it should use (it is a
+<a href="faq_net1.htm#BTS">BTS</a> answer to <a href="faq_net2.htm#RACH">RACH</a>) \96 it assigns the phone to
+<a href="#SDCC">SDCCH</a></td>
+</tr>
+
+<tr>
+<td>BCCH</td>
+<td><a NAME="BCCH"></a>(<b>B</b>roadcast <b>C</b>ontrol <b>Ch</b>annel)
+- a channel in direction <a href="faq_net1.htm#BTS">BTS</a>-phone, containing precise information about network
+(needed for identification and access) \96 for example
+
+<ul>
+<li>how often the phone should inform network about its location (T3212 counter value \96 more detailed description in
+<b><a href="faq_net3.htm#Menu10">test 10</a></b>)</li>
+<li>whether <a href="faq_net1.htm#Hopping">frequency hopping</a> is supported by the network</li>
+<li>CELL_RESELECT_HYSTERESIS parameter (see <a href="faq_net1.htm#C2">C2</a> parameter description)</li>
+<li>CELL_BARRED parameter (which informs, whether this cell is in test phase or is available for public use \96 but the phone
+can ignore this and use test cells too - see <b><a href="faq_net3.htm#Menu19">test 19</a></b>)</li>
+</ul>
+</td>
+</tr>
+
+<tr><td>THR0</td><td><a href="faq_net1.htm#HR">TCH HR</a> subchannel 0</td></tr>
+<tr><td>THR1</td><td><a href="faq_net1.htm#HR">TCH HR</a> subchannel 1</td></tr>
+<tr><td><a NAME="TFR"></a>TFR</td><td><a href="faq_net1.htm#FR">TCH FR</a></td></tr>
+<tr><td>TEFR</td><td><a href="faq_net1.htm#EFR">TCH EFR</a></td></tr>
+<tr><td>F144</td><td><a href="faq_net1.htm#FR">TCH FR</a> - data transmission, speed 14.4 kbit/sec.</td></tr>
+<tr><td>F96</td><td><a href="faq_net1.htm#FR">TCH FR</a> - data transmission, speed 9.6 kbit/sec.</td></tr>
+<tr><td>F72</td><td><a href="faq_net1.htm#FR">TCH FR</a> - data transmission, speed 7.2 kbit/sec.</td></tr>
+<tr><td>F48</td><td><a href="faq_net1.htm#FR">TCH FR</a> - data transmission, speed 4.8 kbit/sec.</td></tr>
+<tr><td>F24</td><td><a href="faq_net1.htm#FR">TCH FR</a> - data transmission, speed 2.4 kbit/sec.</td></tr>
+<tr><td>H480</td><td><a href="faq_net1.htm#HR">TCH HR</a> - data transmission, speed 4.8 kbit/sec., subchannel 0</td></tr>
+<tr><td>H481</td><td><a href="faq_net1.htm#HR">TCH HR</a> - data transmission, speed 4.8 kbit/sec., subchannel 1</td></tr>
+<tr><td>H240</td><td><a href="faq_net1.htm#HR">TCH HR</a> - data transmission, speed 2.4 kbit/sec., subchannel 0</td></tr>
+<tr><td>H241</td><td><a href="faq_net1.htm#HR">TCH HR</a> - data transmission, speed 2.4 kbit/sec., subchannel 1</td></tr>
+
+<tr>
+<td>FA</td>
+<td><a href="faq_net1.htm#FR">TCH FR</a> - used only for quick signalization, for example in case of
+<a href="faq_net4.htm#Handover">handovers</a>
+<br>(FACCH - <b>F</b>ast <b>A</b>ssociated <b>C</b>ontrol <b>Ch</b>annel)</td>
+</tr>
+
+<tr>
+<td>FAH0</td>
+<td><a href="faq_net1.htm#HR">TCH HR</a> -used only for quick signalization, for example in case of
+<a href="faq_net4.htm#Handover">handovers</a>
+<br>(FACCH - <b>F</b>ast <b>A</b>ssociated <b>C</b>ontrol<b>Ch</b>annel), subchannel 0</td>
+</tr>
+
+<tr>
+<td>FAH1</td>
+<td><a href="faq_net1.htm#HR">TCH HR</a> - used only for quick signalization, for example in case of
+<a href="faq_net4.htm#Handover">handovers</a>
+<br>(FACCH - <b>F</b>ast <b>A</b>ssociated <b>C</b>ontrol <b>Ch</b>annel), subchannel 1</td>
+</tr>
+
+<tr>
+<td>SDCC</td>
+<td><a NAME="SDCC"></a>SDCCH (<b>S</b>tand-alone <b>D</b>edicated <b>C</b>ontrol
+<b>Ch</b>annel)
+- used for system signalization of:
+<ul>
+<li>establishing connection</li>
+<li>user verification</li>
+<li><a href="faq_net1.htm#LocationUpdate">Location Update</a> executing</li>
+<li>assigning to <a href="faq_net1.htm#TCH">TCH</a></li>
+<li>sending SMSes</li>
+</ul>
+</td>
+</tr>
+
+<tr>
+<td>CCCH</td><td><a NAME="CCCH"></a>(<b>C</b>ommon <b>C</b>ontrol <b>Ch</b>annel ?) - used, when the phone is in standby mode (it doesn\92t transmit not receive data)</td>
+</tr>
+
+<tr>
+<td>CBCH</td>
+<td><a NAME="CBCH"></a>(<b>C</b>ell <b>B</b>roadcast <b>Ch</b>annel) -
+a channel in <a href="faq_net1.htm#BTS">BTS</a>-phone direction used for cell broadcast (for example in Nokia 5110 it can
+be enabled in <b>Menu 2-5</b> and <b>Menu 4-2-2</b>, in Nokia 6110 in <b>Menu 1-5</b> and <b>Menu 4-4-2</b>)
+</td>
+</tr>
+
+<tr>
+<td>CCHR</td><td><a href="#CCCH">CCCH</a> and <a href="#CBCH">CBCH</a> joined in one</td>
+</tr>
+
+<tr>
+<td>SEAR</td>
+<td>the phone is searching for network</td>
+</tr>
+
+<tr>
+<td>NSPS</td>
+<td><a NAME="NSPS"></a>(<b>N</b>o <b>S</b>erve <b>P</b>ower <b>S</b>ave)
+- the phone is not in range of any network, energy saving has been activated (information, whether your SIM card can stop its
+clock in energy saving mode, can be found in <b><a href="faq_net4.htm#Menu51">test 51</a></b>)</td>
+</tr>
+</table>
+</li>
+</ul>
+
+<p>Interesting thing: In firmware in Nokia 3210 and 3310 there are strings
+which shows info about data transmission state
+("officialy" these phones don't have this function)...
+
+<p>In Nokia 3110 this test looks similiar:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>abbb cccc ddd<br>
+ e ff g qqrr<br>
+s Bttuu mmmm<br>
+w ppp oonnn z</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> CH RxL TxPwr<br>
+TS TA QPM RAR<br>
+Ro BsiCLK RLT<br>
+S C2 CHT C1 B</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>cccc - in this phone minus is always shown</li>
+<li>ooo - hex values</li>
+<li>qq - paging mode (see <b><a href="#Menu2">test 2</a></b>)</li>
+<li>rr - RAR (description in <b><a href="#Menu2">test 2</a></b>)</li>
+<li>s - roaming indicator (description in <b><a href="#Menu2">test 2</a></b>)</li>
+<li>tt - BSIC for current cell (see <b><a href="#Menu2">test 2</a></b>)</li>
+</ul>
+
+<p>Level of received signal (<a href=faq_net1.htm#RX>RX</a>) is connected with phone transmission power
+(<a href=#TX>TX</a>): the weaker the former, the stronger the latter (take a look at example indications of 6110
+using <a href="#SDCC">SDCC</a> and <a href="#TFR">TFR</a> channels):
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td><b>RX</b></td><td><b>TX</b></td></tr>
+<tr ALIGN=CENTER><td>from -38 to -49 dBm</td><td>19</td></tr>
+<tr ALIGN=CENTER><td>from -68 to -75 dBm</td><td>9-14 (0,032 - 0,316 Watt)</td></tr>
+<tr ALIGN=CENTER><td>from -79 to -85 dBm</td><td>7-9 (0,794 - 0,032 Watt)</td></tr>
+<tr ALIGN=CENTER><td>from -85 to -93 dBm</td><td>5-7 (2 - 0,794 Watt)</td></tr>
+</table>
+
+<p>For curious people: some of these data can also be found in Nokia service programs (for example in WinTesla in
+"Testing" / "RF Information" menu).
+
+<p><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%">
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td><a NAME="Wylacz504"></a>Using <a href="#CCCH">CCCH</a> or <a href="#CBCH">CBCH</a> channel by the phone
+(if the cell doesn\92t support cell broadcast \96 you can check this in <b><a href="faq_net2.htm#Menu7">test 7</a></b>) depends
+on its firmware version and whether cell broadcasting has been enabled (or not) by the user. For example: Nokia 5110 v 5.04
+uses <a href="#CBCH">CBCH</a> channel, if you enable this feature in <b>Menu 2-5</b> or <b>Menu 4-2-2</b>
+(and <a href="#CCCH">CCCH</a> channel, if you disable it). I think, that cell broadcast should be disabled when it is not
+supported by the network \96 probably you can save some battery power. It has been corrected in version 5.07 (when CB is
+not supported by the network, the phone uses <a href="#CCCH">CCCH</a> regardless of "Info service" and
+"Cell info display" settings).
+
+<p>Additionally, ccc (<a href=faq_net1.htm#RX>RX</a>) parameter can be used to set the direction of your antenna
+(especially directional one) much more precisely than when using the indicator on the left side of phone\92s display !
+I also have a piece of advice for you: never touch the antenna (in any case, you can check how it affects level of received
+signal just by holding it with your fingers) !
+
+<p><a href="#TA">TA</a> parameter can be also used (apart from calculating the distance to <a href="faq_net1.htm#BTS">BTS</a>)
+to measure speed (for example of the care you\92re driving). I\92m serious! But this can be done only when:
+
+<ul>
+<li>the road is straight (no bends)</li>
+<li>the phone uses only one <a href="faq_net1.htm#BTS">BTS</a></li>
+<li><a href="faq_net1.htm#BTS">BTS</a> must be located near the road</li>
+</ul>
+
+<p>A little bit of mathematics: <map name=mapa><area shape=rect coords="5,2,29,13" href=faq_net1.htm#BTS></map>
+<br><img SRC="net_mon1.gif" BORDER=0 usemap="#mapa" height=107 width=183>
+<br>From Pitagoras\92 theorem:
+
+<p>a<sup>2</sup> = c<sup>2</sup> + e<sup>2</sup>
+<br>b<sup>2</sup> = c<sup>2</sup> + f<sup>2</sup>
+
+<p>So:
+<br>e =<img SRC="net_mon3.gif" height=27 width=63 align=CENTER>
+<br>f =<img SRC="net_mon2.gif" height=26 width=62 align=CENTER>
+
+<p>Now d = e - f =<img SRC="net_mon3.gif" height=27 width=63 align=CENTER>-<img SRC="net_mon2.gif" height=26 width=62 align=CENTER>
+
+<p>If you know:
+
+<p>
+<ol>
+<li>
+the way traveled by the car (on the drawing: length of "d" segment; it can be calculated form the lengths of "a" and "b"
+segments (multiples of 513 m (for simplification) read from <a href="#TA">TA</a>) and c (described later))
+</li>
+
+<li>
+time, in which <a href="#TA">TA</a> has changed (measured by a stopwatch)
+</li>
+</ol>
+
+<p>you can measure your speed.
+<br>Inaccuracy of this measure depends on:
+
+<p>
+<ul>
+<li>
+distance between <a href="faq_net1.htm#BTS">BTS</a> and road (segment "c")
+</li>
+
+<li>
+velocity itself
+</li>
+
+<li>
+distance between car and <a href="faq_net1.htm#BTS">BTS</a>
+(with longer distance inaccuracy depends less from "c" segment)
+</li>
+</ul>
+
+<p>And here is a concrete example:
+<br>The original value of <a href="#TA">TA</a> was 2 and after 15 seconds it has changed to 1. You will get following results:
+
+<p>
+<ul>
+<li>123,120 km/h (<a href="faq_net1.htm#BTS">BTS</a> 0 m from road)</li>
+<li>124,320 km/h (100 m from road)</li>
+<li>128,160 km/h (200 m)</li>
+<li>135,600 km/h (300 m)</li>
+</ul>
+
+<p>You can assume, that "c" segment is 100 m (or 0 if you count in memory - then d = e - f) and the inaccuracy of the measured
+velocity is 5 km/h.
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2110i/2140 this test looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+When transmitter works - call or Location Update
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+CH C1 RXl<br>
+Pwr TS Ql<br>
+TA RLT RA
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+During standby
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+CH C1 Rxl<br>
+Pwr TS Ql<br>
+TAXXXXX RA
+</tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>CH - channel number</li>
+<li>C1 - value of C1</li>
+<li>Rxl - RX level (in dBm)</li>
+<li>Pwr - TX level or "*" (enabled transmitter) or "S" (SDCCH) or "T" (TCH)</li>
+<li>TS - Time Slot</li>
+<li>Ql - quality or received signal</li>
+<li>TA - Timing Advance</li>
+<li>RLT - Radio Link Timeout</li>
+<li>RA - maximal number of Random Access retransmission</li>
+<li>XXXXX - type of actual channel
+<ul>
+<li>ACCESS</li>
+<li>CCCH</li>
+<li>BCCH</li>
+<li>SEARCH</li>
+<li>NSPS</li>
+</ul>
+</li>
+</ul>
+
+<p>In Nokia 2120 this test looks as follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+Digital mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+rssi DVC d<br>
+chan l a<br>
+S BB TT</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+Analog mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi s d<br>
+chan l a<br>
+CS-state</tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and in Nokia 2160 is different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<a href="faq_net1.htm#DCCH">DCCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi DVC S<br>
+chan Pw A<br>
+CS-state</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#DTCH">DTCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi s d<br>
+chan l a<br>
+CS-state</tt></td>
+</tr>
+</table>
+<p>
+</td>
+</tr>
+
+<tr>
+<td>
+<a href="faq_net1.htm#ACCH">ACCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi D d<br>
+chan Pw A<br>
+CS-state</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<a href="faq_net1.htm#AVCH">AVCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi DVC S<br>
+chan l a<br>
+CS-state</tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>for Nokia 6160 it looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<a href="faq_net1.htm#DCCH">DCCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi DVC S<br>
+Bchan Pw A<br>
+CS-state<br> </tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#DTCH">DTCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi DVC s<br>
+Bchan Be l<br>
+CS-state<br> </tt></td>
+</tr>
+</table>
+<p>
+</td>
+</tr>
+
+<tr>
+<td>
+<a href="faq_net1.htm#ACCH">ACCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi D d<br>
+Bchan Pw A<br>
+CS-state<br> </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<a href="faq_net1.htm#AVCH">AVCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>rssi s d<br>
+Bchan l a <br>
+CS-state<br> </tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>B = current network/frequency<p>
+<ul>
+<li>a = a-side 800mhz cellular</li>
+<li>b = b-side 800mhz cellular</li>
+<li>A = A-block (30 mhz) 1900mhz PCS</li>
+<li>B = B-block (30 mhz) 1900mhz PCS</li>
+<li>C = C-block (30 mhz) 1900mhz PCS</li>
+<li>D = D-block (10 mhz) narrowband 1900mhz PCS</li>
+<li>E = E-block (10 mhz) narrowband 1900mhz PCS</li>
+<li>F = F-block (10 mhz) narrowband 1900mhz PCS</li>
+</ul>
+<p>
+</li>
+
+<li>Be = <b>B</b>it <b>E</b>rror rate in % (0-16)</li>
+<li>TT = last received time alignment value (0-31)</li>
+<li>rssi = received signal strength (dBm) (min= -113dBm, max= -51dBm, 2dB steps)</li>
+<li>DVC = <b>D</b>igital <b>V</b>erification <b>C</b>olor code (1-255, - = not locked)</li>
+<li>D = DCC (<b>D</b>igital <b>C</b>olor <b>C</b>ode) on <a href="faq_net1.htm#ACCH">ACCH</a> (0-3, - = not locked)</li>
+<li>s = SAT color (0-2, - = not locked)</li>
+
+<li>d = data receiving status
+<p>
+<ol start=0>
+<li>no sync/no data</li>
+<li>sync/not able to read</li>
+<li>reading correcting</li>
+<li>reading no correction</li>
+</ol>
+<p>
+</li>
+
+<li>S = slot (1-3)</li>
+<li>chan = channel number (0001-1023)</li>
+
+<li>Pw = Max access power
+<p>
+<ul>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: MS-ACC-PWR (0-10, - = not locked)</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: CMAC (0-7, - = not locked)</li>
+</ul>
+<p>
+</li>
+
+<li>l = Tx level (0-10, - = TxOff)</li>
+<li>a = audio state (0=off, 1=on)</li>
+
+<li>CS-state = Cellular State
+<p>
+<ul>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>SCAN-LOCK</tt> : Scanning and locking of <a href="faq_net1.htm#DCCH">DCCH</a></li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>DCCH-SEL </tt> : <a href="faq_net1.htm#DCCH">DCCH</a> selection</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>CAMPING </tt> : Camping</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>REGISTR </tt> : Registration proceeding</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>WAIT-ORDER</tt>: Waiting for order</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>ORIGINAT </tt> : Origination proceeding</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>RSELECT </tt> : Reselection</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>ORIG-SMS </tt> : Sending SMS proceeding</li>
+<li><a href="faq_net1.htm#DCCH">DCCH</a>: <tt>TERM-SMS </tt> : Receiving SMS proceeding</li>
+<li><a href="faq_net1.htm#DTCH">DTCH</a>: <tt>TCH </tt> : Confirm traffic channel</li>
+<li><a href="faq_net1.htm#ATCH">ATCH</a> or <a href="faq_net1.htm#DTCH">DTCH</a>: <tt>CONVERSAT</tt> : Conversation</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>OOR </tt> : Out of range</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>SCAN-PDCH</tt> : Scan primary dedicated control channels</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>SCAN-SDCH</tt> : Scan secondary dedicated control channels</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>SCAN-PCH </tt> : Scan paging channels</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>IDLE  </tt> : Idle</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>ACCESS </tt> : Access</li>
+<li><a href="faq_net1.htm#ACCH">ACCH</a>: <tt>VCH </tt>: Confirm voice channel</li>
+</ul>
+</li>
+</ul>
+
+<P>This test in Nokia 6185/6188 is, of course ;-), different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<a href="faq_net1.htm#CDMA">CDMA</a> control
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+CSST CHAN SP<br>
+PPN EC/SO XF<br>
+LOS XHO FR B<br>
+-Rxx-Txx FER
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#CDMA">CDMA</a> traffic
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+<i>CONV 0450 NP<br>
+8000 2<br>
+000 0D9 00 0<br>
+-093+006 000</i>
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#AMPS">AMPS</a> control
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+RSSI S D<br>
+CHAN P A<br>
+CSST SID E<br>
+XTBY MINMAX
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<a href="faq_net1.htm#AMPS">AMPS</a> traffic
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+<i>
+-095 2 3<br>
+0273 0 0<br>
+CONV 16427 0<br>
+Y
+</i></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+
+<tr>
+<td colspan=2><a href="faq_net1.htm#CDMA">CDMA</a></td>
+<td colspan=2><a href="faq_net1.htm#AMPS">AMPS</a></td>
+</tr>
+
+<tr>
+<td colspan=2>
+<ul>
+<li>CSST - Cellular State: IDLE, CONVE, PLIOS, TIME, SYNC, RELE, PAGE, TRFIN, W_OR</li>
+<li>Chan - Channel</li>
+<li>PPN - PseudoNoise offset</li>
+<li>EC/SO - Energy per chip per noise</li>
+<li>B - Current network/frequency. a,b are A and B 800 MHz <a href="faq_net1.htm#AMPS">AMPS</a> (analog). A-F indicate the digital block in use</li>
+<li>Rxx - Receive power in dB</li>
+<li>Txx - Transmit power in dB</li>
+<li>FER - <b>F</b>rame <b>E</b>rror <b>R</b>ate</li>
+<li>In <a href="faq_net1.htm#CDMA">CDMA</a> traffic screen you have current used codec too (one from these below):
+<p><ul>
+<li>8000 - 13 kbit/sec</li>
+<li>0001 - 8 kbit/sec</li>
+<li>0003 - EVRC</li>
+</ul>
+
+</td>
+<td colspan=2>
+<ul>
+<li>RSSI - Received signal strength</li>
+<li>S - Slot (1-3)</li>
+<li>D - Digital Colour Code on analog control channel (0-3 or - for not locked)</li>
+<li>CHAN - Channel</li>
+<li>CSST - Cellular State: IDLE, CONVE, PLIOS, TIME, SYNC, RELE, PAGE, TRFIN, W_OR</li>
+<li>SID - System ID (Cantel = odd number)</li>
+<li>MINMAX: Minimum and Maximum RSSI over last time period ?</li>
+</ul>
+</td></tr>
+</table>
+
+<p><a NAME="Menu2"></a><b>Test 2</b>
+<br>More information about used cell
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aa b c Bdd <br>
+ ee f <br>
+ ggg hh iii<br>
+ H=j mm nn</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>PM RAR Ro BC<br>
+RelR QLF<br>
+CRO TO PenT<br>
+H MAIO HSN</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aa - paging mode:
+
+<p>
+<ul>
+<li>NO : normal</li>
+<li>EX : extended</li>
+<li>RO lub SB : paging reorganization</li>
+</ul>
+<p>
+</li>
+
+<li>
+b - RAR (<b>R</b>andom <b>A</b>ccess <b>R</b>etransmission): max amount of transmissions using
+<a NAME="RACH"></a>RACH channel (<b>R</b>andom <b>A</b>ccess <b>Ch</b>annel - a phone-<a href="faq_net1.htm#BTS">BTS</a>
+channel used to send a network access request \96 for example during logging in)
+</li>
+
+<li>
+c - if your phone is in roaming, R is displayed (otherwise empty). This information is also shown on the top of the display.
+</li>
+
+<li>
+dd - <a href="faq_net1.htm#BSIC">BSIC</a> value for current cell</li>
+
+<li>
+ee - reason of last connection end (this parameter is also present in
+<b><a href="faq_net5.htm#Menu63">test 63</a></b> and <b><a href="faq_net4.htm#Menu39">test 39</a></b>
+(you will find explanation there \96 see description of the first parameter))
+</li>
+
+<li>
+f - RXQUAL_FULL (error rate in transmission with <a href="faq_net1.htm#DTX">DTX</a> disabled
+(<a href="faq_net1.htm#DTX">DTX</a> state can be checked in <b><a href="faq_net3.htm#Menu12">test 12</a></b>)):
+it determines, how many errors have to be corrected by the phone, for the connection to be possible. Range 0 - 7 (0 \96 means none,
+more than 5 \96 connection may be interrupted).
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER VALIGN=CENTER><td nowrap><b>RQ value</b></td><td>0</td><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
+<tr ALIGN=CENTER VALIGN=CENTER><td nowrap><b>Max amount of errors</b></td><td><0,2%</td><td><0,4%</td><td><0,8%</td><td><1,6%</td><td><3,2%</td><td><6,4%</td><td><12,8%</td><td>>12,8%</td></tr>
+</table>
+<p>
+</li>
+
+<li>
+<p>ggg - <a NAME="CellReselect"></a>Cell reselect offset: range 0 - 63 (this value should be multiplied by 2 dB), 'xxx'
+when transmitting. Needed to calculate <a href="faq_net1.htm#C2">C2</a>.</li>
+
+<li>
+<p>hh - <a NAME="TemporaryOffset"></a>Temporary offset: range 0 - 7 (this value should be multiplied by 10 dB, 70 dB
+means infinitely long time), 'xx' when transmitting. Needed to calculate <a href="faq_net1.htm#C2">C2</a>.</li>
+
+<li>
+<p>iii - <a NAME="PenaltyTime"></a>Penalty time: range 0 - 31 (it should be multiplied by 20 s), 'xxx' when transmitting.
+Needed to calculate <a href="faq_net1.htm#C2">C2</a>.</li>
+
+<li>
+<p>j - information about <a href="faq_net1.htm#Hopping">frequency hopping</a>:
+
+<p>
+<ul>
+<li>0 - not used (single frequency used \96 so called RF (<b>R</b>adio <b>F</b>requency))</li>
+<li>1 - used (different RF (<b>R</b>adio <b>F</b>requencies) used)</li>
+</ul>
+<p>
+</li>
+
+<li>
+<p>mm - MAIO (<b>M</b>obile <b>A</b>llocation <b>I</b>ndex <b>O</b>ffset).
+Range 0 - 63, 'xx' when j=0 (when <a href="faq_net1.htm#Hopping">frequency hopping</a> is disabled \96 you can check
+this in <b><a href="faq_net3.htm#Menu12">test 12</a></b>)</li>
+
+<li>
+<p>nn - HSN (<b>H</b>opping <b>S</b>equence <b>N</b>umber).Range 0 - 63, 'xx' when j=0 (when
+<a href="faq_net1.htm#Hopping">frequency hopping</a> is disabled \96 you can check
+this in <b><a href="faq_net3.htm#Menu12">test 12</a></b>)
+</li>
+</ul>
+
+<p>In some phones (for example, Nokia 8810 or Nokia 5110 with older firmware)
+you will see parameters in two first lines only...
+
+<p>In Nokia 3110 this test looks as follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaabbbccccddd<br>
+aaabbbccccddd<br>
+aaabbbccccddd<br>
+w z</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>S CH C1 rx C2<br>
+1 CH C1 rx C2<br>
+2 CH C1 rx C2<br>
+S 1N 2N B</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Description of the parameters can be found in menu <b><a href="#Menu3">test 3</a></b>
+(in this model cccc parameters are always preceded by minus).
+
+<p>This test looks similiar in Nokia 2110i/2140 (description is also in
+<b><a href="#Menu3">test 3</a></b>):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aaabbbcccc<br>
+aaabbbcccc<br>
+aaabbbcccc
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Serv cell <br>
+1. neighb<br>
+2. neighb
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2120 this test looks as follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>ENCR CIPH<br>
+DTX XSTBY<br>
+CS-state</tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>
+<ul>
+<li>ENCR = when message encryption is on</li>
+<li>CIPH = when Ciphering is on</li>
+<li>DTX = when <a href="faq_net1.htm#DTX">DTX</a> is on</li>
+<li>XSTBY= when enabled standby is on</li>
+<li>CS-state = see previous parameter for details</li>
+</li>
+</ul>
+
+<p>and in Nokia 2160 is different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<a href="faq_net1.htm#DCCH">DCCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>mode DTX<br>
+ENCR CIPH<br>
+d Be TA</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#DTCH">DTCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+mode DTX<br>
+ENCR CIPH<br>
+d Be TA
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+</tr>
+
+<tr>
+<td>
+<a href="faq_net1.htm#ACCH">ACCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+mode<br>
+XSTBY<br>
+ SID
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<a href="faq_net1.htm#AVCH">AVCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>mode<br> <br>
+ SAT
+</tt>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and here is for Nokia 6160:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<a href="faq_net1.htm#DCCH">DCCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>mode M C<br>
+FB E SP pc<br>
+net SID..<br>
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#DTCH">DTCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>mode DTX<br>
+ENCR CIPR <br>
+d a TA S<br>
+CODEC...
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+</tr>
+
+<tr>
+<td>
+<a href="faq_net1.htm#ACCH">ACCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>mode<br>
+XSTBY<br>
+ SID <br>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<a href="faq_net1.htm#AVCH">AVCH</a> mode
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>mode<br> <br>
+ SAT <br>
+</tt>
+</td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>mode = <a href="faq_net1.htm#DCCH">DCCH</a>, <a href="faq_net1.htm#DTCH">DTCH</a>, <a href="faq_net1.htm#ACCH">ACCH</a>, <a href="faq_net1.htm#AVCH">AVCH</a></li>
+<li>SID = system ID [0-32767, - = not locked]</li>
+
+<li><a href="faq_net1.htm#DCCH">DCCH</a> mode
+<p>
+<ul>
+<li>M = maximum paging frame class supported by network (1-8)</li>
+<li>C = current PFC (<b>P</b>aging <b>F</b>rame <b>C</b>lass) (1-8)</li>
+<li>FB = number of F-BCCH slots</li>
+<li>E = number of E-BCCH slots</li>
+<li>SP = number of SPACH slots</li>
+<li>pc = PCH subchannel</li>
+<li>net = supported network types, bit map (1=suported, 0=not, C=current):
+first bit for Public, second for Private, third for Residential</li>
+</ul>
+<p>
+</li>
+
+<li><a href="faq_net1.htm#DTCH">DTCH</a> mode
+<p>
+<ul>
+<li>DTX = shown when <a href="faq_net1.htm#DTX">DTX</a> is on</li>
+<li>ENCR = shown when message encryption is on</li>
+<li>CIPH or CIPR = shown when voice ciphering is on</li>
+<li>d = data receiving status (0=no sync, 1=sync)</li>
+<li>Be = <b>B</b>it <b>E</b>rror <b>r</b>ate in % (0-16)</li>
+<li>TA = current <b>t</b>ime <b>a</b>lignment (0-30)</li>
+<li>a = audio state (0=off, 1=on)</li>
+<li>CODEC... = current codec:<p>
+<ul>
+<li>-EFR- = IS-136A ACELP coder</li>
+</ul>
+
+</ul>
+<p>
+</li>
+
+<li><a href="faq_net1.htm#ACCH">ACCH</a> mode
+<p>
+<ul>
+<li>XSTBY = shown when extended standby is on</li>
+</ul>
+<p>
+</li>
+
+<li><a href="faq_net1.htm#AVCH">AVCH</a> mode
+<p>
+<ul>
+<li>SAT = SAT validity as measured by <a href-"faq_net1.htm#DSP">DSP</a> (0-32767)</li>
+</ul>
+<p>
+</li>
+
+</ul>
+
+<p>and for Nokia 6185/6188:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<a href="faq_net1.htm#CDMA">CDMA</a> control
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+PN1<br>
+ECK <p>
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#CDMA">CDMA</a> traffic
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+PN1 PN3 PN5 <br>
+ECK ECK ECK<br>
+PN2 PN4 PN6<br>
+ECK ECK ECK
+</tt></td>
+</tr>
+</table>
+<p>
+</td>
+
+<td>
+<a href="faq_net1.htm#AMPS">AMPS</a> control
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+X F S N N C<br>
+SLEEP EMC<br>
+SCC STC M<br>
+RSSCPLCC CAL
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<a href="faq_net1.htm#AMPS">AMPS</a> traffic
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+<i>2 2 1 0 4 1<br>
+00015F927B13<br>
+0029B 0A0 2<br>
+140 372 0000</i>
+</tt></td>
+</tr>
+</table>
+</td>
+</tr>
+
+<tr>
+<td colspan=4><a href="faq_net1.htm#CDMA">CDMA</a>
+<p>
+<ul>
+<li>PNx: <a href="faq_net1.htm#CDMA">CDMA</a> PN offsets handoff canidate listing. Shows only the current offset while idling.
+Shows 1 to 6 additional choices during traffic.</li>
+</ul>
+</td></tr>
+</table>
+
+<p><a NAME="Menu3"></a><b>Test 3</b>
+<br>Information about current and neighbor cells
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaabbbcccddd<br>
+aaabbbcccddd<br>
+aaabbbcccddd<br>
+ ef gh</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>SCH C1 rx C2<br>
+1CH C1 rx C2<br>
+2CH C1 rx C2<br>
+ 1N 2N</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Meaning of these lines:
+
+<p>
+<ol>
+<li>information about current cell</li>
+<li>1st neighbor cell</li>
+<li>2nd neighbor cell</li>
+<li>e,f concern 1st neighbor cell, g,h concern 2nd neighbor cell</li>
+</ol>
+
+<p>
+<ul>
+<li>
+aaa - CH (<b>ch</b>annel): number of channel used for communication with cell (decimal)</li>
+
+<li>
+bbb - <a href="faq_net1.htm#C1">C1</a> values displayed only in standby mode. In active mode (ie. during connection)
+letter B and <a href="faq_net1.htm#BSIC">BSIC</a> for current cell are displayed.
+</li>
+
+<li>ccc - <a href="faq_net1.htm#RX">RX</a>:
+minus is not shown if <=-100. Lets us calculate RXLev parameter value:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td><b>RX (from)</b></td><td><b>RX (up to)</b></td><td><b>RXLev</b></td></tr>
+<tr ALIGN=CENTER><td>less than</td><td>-110 dBm</td><td>0</td></tr>
+<tr ALIGN=CENTER><td>-110 dBm</td><td>-109 dBm</td><td>1</td></tr>
+<tr ALIGN=CENTER><td>-109 dBm</td><td>-108 dBm</td><td>2</td></tr>
+<tr ALIGN=CENTER><td>...</td><td>...</td><td>...</td</tr>
+<tr ALIGN=CENTER><td>-49 dBm</td><td>-48 dBm</td><td>62</td></tr>
+<tr ALIGN=CENTER><td>-48 dBm</td><td>more</td><td>63</td></tr>
+</table>
+<p>
+</li>
+
+<li>
+ddd - <a href="faq_net1.htm#C2">C2</a> parameter</li>
+
+<li>
+e,g - contains F, if current cell is located on a restricted area (otherwise empty)</li>
+
+<li>
+f,h:
+
+<p>
+<ul>
+<li>
+B means a cell in test phase (your phone can use barred cells \96 this can be enabled in
+<b><a href="faq_net3.htm#Menu19">test 19</a></b>)</li>
+<li>N - a cell given for normal use</li>
+<li>L - means low level</li>
+<li>otherwise empty</li>
+</ul>
+<p>
+</li>
+
+</ul>
+
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>If you want to see, if actual used cell is barred or not, see on
+<a href="faq_net3.htm#Menu19">test 19</a> (it depends on setting in that test)</td>
+</tr>
+</table>
+
+<p>Sometimes phone shows, that both <a href="faq_net1.htm#C1">C1</a> and
+<a href="faq_net1.htm#C2">C2</a> for channel are equal -99
+- it means probably, that it wouldn't be able to log into it...
+
+<p>In Nokia 3110 this test looks like <b><a href="#Menu4">test 4</a></b>.
+
+<p>It looks similiar in Nokia 2110i/2140 (desciption is in
+<b><a href="#Menu4">test 4</a></b> too):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aaabbbcccc<br>
+aaabbbcccc<br>
+aaabbbcccc
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+3. neighb <br>
+4. neighb<br>
+5. neighb
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2120 this test looks like <b><a href="#Menu4">test 4</a></b> in Nokia 2160.
+
+<p>In Nokia 2160 this test looks different (is displayed
+in <a href="faq_net1.htm#DCCH">DCCH</a> mode only):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+RS SS SI b<br>
+NA ND<br>
+</tt></td>
+</tr>
+</table>
+</td>
+</tr></table>
+
+<p>and here is for Nokia 6160:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+RS SS SI b<br>
+NA ND<br>
+MA MD MO<br>
+</tt></td>
+</tr>
+</table>
+</td>
+</tr></table>
+
+<p>
+<ul>
+<li>RS = minimum <b>R</b>eceived signal <b>S</b>trength required to access cell (0-31, where 0=-113 dBm and 31=-51 dBm)</li>
+<li>SS = minimum signal <b>S</b>trength <b>S</b>ufficient for candidate of reselection (0-31, where 0=-113 dBm and 31=-51 dBm)</li>
+<li>SI = <b>S</b>can <b>I</b>nterval between consecutive strength measurements in hyperframes (1-16)</li>
+<li>b = access burst size (0=normal, 1=abbreviated RACH)</li>
+<li>NA = <b>N</b>umber of <b>A</b>nalog neighbors (0-24)</li>
+<li>ND = <b>N</b>umber of <b>D</b>igital neighbors (0-24)</li>
+</ul>
+
+<p>and for Nokia 6185/6188:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+OWNNUMBER<br>
+ESN-00000000<br>
+ESN-HEX<br>
+SL P MD PC
+</tt></td>
+</tr>
+</table>
+
+<ul>
+<li>OWNNUMBER - phone number</li>
+<li>ESN - <b>E</b>lectronic <b>S</b>erial <b>N</b>umber</li>
+<li>MD - [AD] changes to [DI] at 800 <a href="faq_net1.htm#CDMA">CDMA</a></li>
+</ul>
+
+<p><a NAME="Menu4"></a><b>Test 4</b>
+<br>Information about neighbor cells
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaabbbcccddd<br>
+aaabbbcccddd<br>
+aaabbbcccddd<br>
+ ef gh ij</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>3CH C1 rx C2<br>
+4CH C1 rx C2<br>
+5CH C1 rx C2<br>
+ 3N 4N 5N</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Meaning of the lines:
+<ol>
+<li>3rd neighbor cell</li>
+<li>4th neighbor cell</li>
+<li>5th neighbor cell</li>
+<li>e,f concern 3rd neighbor cell, g,h 4th neighbor cell, i,j 5th neighbor cell</li>
+</ol>
+
+<p>Meaning of the letters is the same as in <b><a href="#Menu3">test 3</a></b> (i is the same as e, j is the same as f)
+
+<p>Sometimes phone shows, that both <a href="faq_net1.htm#C1">C1</a> and
+<a href="faq_net1.htm#C2">C2</a> for channel are equal -99
+- it means probably, that it wouldn't be able to log into it...
+
+<p>In Nokia 3110 this test looks like <b><a href="#Menu5">test 5</a></b>.
+
+<p>It looks similiar in Nokia 2110i/2140 (description is in
+<b><a href="#Menu5">test 5</a></b> too):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aaabbbcccc<br>
+aaabbbcccc<br>
+aaabbbcccc
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+6. neighb <br>
+7. neighb<br>
+8. neighb
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2160 this test looks different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+bVo mod bs<br>
+Tbat1 Tb2<br>
+Wpwm FCmAh<br>
+</tt></td>
+</tr>
+</table>
+</td>
+
+</tr></table>
+
+<p>
+<ul>
+<li>bVo = battery voltage</li>
+<li>mod = charging mode
+
+<p>
+<ul>
+<li>FAS = Fast charging</li>
+<li>COL = Cold battery charging</li>
+<li>MAI = Maintenance charging</li>
+<li>ERR = wrong charger or battery not OK</li>
+<li>LIC = LiION battery charging</li>
+<li>TXO = charging, transmitter active (connection in progress)</li>
+<li>*** = charger disconnected</li>
+</ul>
+<p>
+</li>
+
+<li>bs = battery is full or reason for fast charge termination
+
+<p>
+<ul>
+<li>TI = max. charge <b>Ti</b>me elapsed</li>
+<li>DV = <b>dV</b>/peak value detected (full)</li>
+<li>BV = <b>B</b>attery <b>v</b>oltage max limit</li>
+<li>BT = <b>B</b>attery <b>t</b>emp max limit (overheat)</li>
+<li>** = battery is not full</li>
+</ul>
+<p>
+</li>
+
+<li>Tbat1 = battery temp. a/d reading (subtracted from 1023)</li>
+<li>Tb2 = battery temp. in C (not implemented)</li>
+<li>Wpwm = PWM charge control output (000-250)</li>
+<li>FCmAh = mAh rating of charge given to the battery</li>
+</ul>
+</li>
+
+<p>In Nokia 2120 this test looks like follows
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ChargV:NNN<br>
+ST hex des<br>
+B:LLLL KKK</tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>but it was not implemented.
+
+<p>In Nokia 6160 this test looks like follows
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+SID #####<br>
+NN NT NR<br>
+Alphatag <br>
+</tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>SID = <b>S</b>ystem <b>I</b>dentification <b>N</b>umber (0 to 32767, odd for 'A' carriers, even for 'B' carriers, - = not locked)</li>
+<li>Alphatag.. = textual end-user display of current system</li>
+</ul>
+
+<p>and for Nokia 6185/6188:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+CSST CHAN<br>
+A B<br>
+SID<br>
+SD IT TM CAP
+</tt></td>
+</tr>
+</table>
+
+<ul>
+<li>CSST - Cellular state: IDLE, CONVE, PLIOS, TIME, SYNC, RELE, PAGE, TRFIN, W_OR</li>
+<li>CHAN - Channel</li>
+<li>B - Network Band and Frequency (lowercase a,b = 800 MHz band; uppercase A,B = 1900 MHz band)</li>
+<li>SID - System ID:<p>
+<ul>
+<li>[17500] - Clearnet PCS</li>
+<li>[16422] - BC Tel Mobility</li>
+<li>[16xxx odd number] - Cantel AT&T</li>
+</ul>
+<p></li>
+</ul>
+
+<p><a NAME="Menu5"></a><b>Test 5</b>
+<br>Information about neighbor cells
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaabbbcccddd<br>
+aaabbbcccddd<br>
+aaabbbcccddd<br>
+ ef gh ij</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>6CH C1 rx C2<br>
+7CH C1 rx C2<br>
+8CH C1 rx C2<br>
+ 6N 7N 8N</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Meaning of the lines:
+<ol>
+<li>6th neighbor cell</li>
+<li>7th neighbor cell</li>
+<li>8th neighbor cell</li>
+<li>e,f concern 6th neighbor cell, g,h 7th neighbor cell, i,j 8th neighbor cell</li>
+</ol>
+
+<p>Meaning of the letters is the same as in <b><a href="#Menu3">test 3</a></b> (i is the same as e, j is the same as f)
+
+<p>Sometimes phone shows, that both <a href="faq_net1.htm#C1">C1</a> and
+<a href="faq_net1.htm#C2">C2</a> for channel are equal -99
+- it means probably, that it wouldn't be able to log into it...
+
+<p>In Nokia 3110 this test looks like <b><a href="#Menu6">test 6</a></b>.
+
+<p>This test allows you to recognize, how many neighbor cells can "observe" phone
+in the same time. Examples: in Nokia 6150 you can see info in all rows (8 cells),
+in Nokia 5110/3310/6210 only in first row (6 cells).
+
+<p>In Nokia 3310/6210 parameters "ef" are never displayed (you can see "xx" only)...
+These models during standby mode can see only 6 cells, during call 8...
+
+<p>In Nokia 2160 this test looks different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ROM SW<br>
+EPROM SW<br>
+Prod type </tt></td>
+</tr>
+</table>
+</td>
+</tr></table>
+
+<p>
+<ul>
+<li>ROM SW = ROM software version, e.g. V 65.08</li>
+<li>EPROM SW = EPROM (flash) version, e.g. V 1.45</li>
+<li>Prod type = product type, e.g. NHC-4NE</li>
+</ul>
+
+<p>And here is for Nokia 6160:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+S bandorde<br>
+NC NP IRC<br>
+RSCO RSLO<br>
+</tt></td>
+</tr>
+</table>
+</td>
+</tr></table>
+
+<p>
+<ul>
+<li>S = system indicator:<p>
+<ul>
+<li>H = hometype system</li>
+<li>P = partner roam</li>
+<li>F = preffered roam</li>
+<li>N = normal roam</li>
+<li>X = no service</li>
+<li>a, b, A, B, C, D, E, F = current band while scanning for a control channel
+(see next parameter for details)</li>
+</ul>
+<p></li>
+
+<li>bandorde = network search order:<p>
+<ul>
+<li>a = a-side 800mhz cellular</li>
+<li>b = b-side 800mhz cellular</li>
+<li>A = A-block (30 mhz) 1900mhz PCS</li>
+<li>B = B-block (30 mhz) 1900mhz PCS</li>
+<li>C = C-block (30 mhz) 1900mhz PCS</li>
+<li>D = D-block (10 mhz) narrowband 1900mhz PCS</li>
+<li>E = E-block (10 mhz) narrowband 1900mhz PCS</li>
+<li>F = F-block (10 mhz) narrowband 1900mhz PCS</li>
+</ul>
+<p></li>
+
+<li>NC = <b>N</b>umber of <b>C</b>ellular = number of probability blocks to scan in cellular bands</li>
+<li>NP = <b>N</b>umber of <b>P</b>CS - number of sub blocks to scan in PCS bands</li>
+<li>IRC = <b>IR C</b>ontrol:<p>
+<ul>
+<li>1 = only systems with home SID or SOC are accepted</li>
+<li>0 = any system not listed as forbidden is accepted</li>
+</ul><p></li>
+
+<li>RSCO = <b>R</b>e<b>s</b>can <b>Co</b>unt - rescan time in hyperframes</li>
+<li>RSLO = <b>R</b>e<b>s</b>can <b>Lo</b>op - defines when all the bands in bandorder are to be scanned</li>
+
+</ul>
+
+<p>and for Nokia 6185/6188:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+1YNC_OK_097B<br>
+SYNC_FAI4CC1<br>
+FOCC_WOR587C<br>
+WORD_OK_3E65</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu6"></a><b>Test 6</b>
+<br>Information about preferred and restricted networks of the inserted SIM card.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaabb aaabb<br>
+aaabb aaabb<br>
+aaabb aaabb<br>
+aaabb aaabb</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>LReg 1_For<br>
+1_Pre 2_For<br>
+2_Pre 3_For<br>
+3_Pre 4_For</b></tt></td>
+</tr>
+</table>
+
+<p>In Nokia 6250:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>LReg 1?For<br>
+1?Pre 2?For<br>
+2?Pre 3?For<br>
+3?Pre 4?For</b></tt></td>
+</tr>
+</table>
+
+</td>
+
+</tr>
+</table>
+
+<p>Meaning of the individual lines:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr><td ALIGN=CENTER>last registered network</td><td>1st forbidden network</td></tr>
+<tr><td>1st preferred network</td><td>2nd forbidden network</td></tr>
+<tr><td>2nd preferred network</td><td>3rd forbidden network</td></tr>
+<tr><td>3rd preferred network</td><td>4rd forbidden network</td></tr>
+</table>
+
+<p>
+<ul>
+<li>
+last registered network - you used it last time. When you're in home country, it can be your home network
+(you pay them for your calls - if it is, after choosing it manually (in Nokia 5110 - Menu 4-2-4) phone displays
+"Home network selected"). 00000, when phone wasn't registered in any network
+after enabling.</li>
+
+<li>
+preferred network - network, to which your SIM card was logged (when it was in its range) \96 for example in roaming.
+</li>
+
+<li>
+forbidden network \96 your SIM card was in range of that network, but wasn\92t allowed to log in...
+</li>
+</ul>
+
+<ul>
+<li>
+<p>aaa - <a NAME="MCC"></a>MCC (<b>M</b>obile <b>C</b>ountry <b>C</b>ode)
+- code of the network home country (260 for Poland). Decimal value.
+</li>
+
+<li>
+<p>bb - <a NAME="MNC"></a>MNC (<b>M</b>obile <b>N</b>etwork <b>C</b>ode)
+- network code (different for networks with the same MCC).
+
+<p>Generally values here are decimal. Sometimes are exceptions (when and why ?)
+and you can find hexadecimal value here: if you will convert it into
+decimal and result treat as hexadecimal value (convert it into decimal value
+again), you will have decimal value of this parameter (for example,
+3F hex=63 dec; 63 hex=99 dec). More about it in the <a href=faq_net6.htm#23>question 23</a>.
+
+<p>When you use phone working in PCS 1900
+system (for example, Nokia 6190), this number can be 3-digit long. It's decimal (always ?).
+If it consist of two digits, you will see "F" instead of last (for example,
+you will see "30237F" for 302-37 network)</li>
+
+</li>
+</ul>
+
+<p>What are these lists stored on SIM card for? Because:
+
+<p>
+<ol>
+<li>
+the phone doesn\92t have to waste its power while trying to log to the network, which is forbidden for SIM card
+(it is checked only once and then stored, so the phone doesn\92t have to repeat this procedure anymore)
+</li>
+
+<li>
+when you have automatic network selection enabled, your phone in first turn searches for networks it was
+previously using ("preferred").
+</li>
+</ol>
+
+<p>
+The list of "preferred" and "forbidden" networks is written by the phone
+(Nokia saves last chosen networks). Preffered networks can be also edited \96 for example in Motorola and Alcatel phones (not in Nokia).
+Sometimes it is done by
+the operator (he writes preferred and forbidden networks to the SIM card before selling it (it's known, that you cannot
+log to competitive network \96 it can be stored in card programming phase). Both these lists can be changed using a
+Czech program called SIMedit (<a href="http://www.compelson.cz/simedit.htm">www.compelson.cz/simedit.htm</a>)...
+
+<p>URL <a href="http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-list.html">http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-list.html</a>
+contains list of the MCC and MNC parameters for different networks.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>Using this menu you can check (probably \96 NOT ALWAYS!), where SIM card was used lately (in your country, abroad)
+and where its owner was traveling
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2160 use this test, when you want to "disable" NetMonitor tests.
+
+<p>And here is for Nokia 6160:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+PSC PSD <br>
+FSC FSD<br>
+XSC XSD<br>
+</tt></td>
+</tr>
+</table>
+</td>
+</tr></table>
+
+<p><b>I</b>ntelligent <b>R</b>oaming <b>D</b>ata<b>b</b>ase (IRDB) statistics:
+
+<p>This lists the total count of SOCs and SIDs in each category.
+The database has a total memory limit of 82 entries,
+which may be distributed amongst these categories:
+
+<p>
+PSC = number of Partner SOCs<br>
+PSD = number of Partner SIDs<br>
+FSC = number of Preffered SOCs<br>
+FSD = number of Preffered SIDs<br>
+XSC = number of Forbidden SOCs<br>
+XSD = number of Forbidden SIDs<br>
+
+<p>Partner SOC/SID = treated like the home system by the phone
+<br>Preffered SOC/SID = preferred over neutral (undefined) systems when available
+<br>Forbidden SOC/SID = rejected by the phone as service providers
+
+<p>and for Nokia 6185/6188:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
+<tr><td><a href="faq_net1.htm#CDMA">CDMA</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+SID NID<br>
+BASE ID<br>
+P_REV<br>
+MIN_P_REV
+</tt></td>
+</tr>
+</table>
+</td>
+<td><a href="faq_net1.htm#AMPS">AMPS</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+0ORD_COR0CE3<br>
+WORD_FAI0E76<br>
+CTRL_FIL787D<br>
+SAT_V_OK0004</i>
+</tt></td>
+</tr>
+</table>
+</td></tr>
+<tr><td colspan=2>
+ <br><a href="faq_net1.htm#CDMA">CDMA</a><p>
+<ul>
+<li>SID - System ID:<p>
+<ul>
+<li>[17500] - Clearnet PCS</li>
+<li>[16422] - BCTel Mobility</li>
+<li>[16xxx odd number] - Cantel AT&T</li>
+<li>[00000]: Second SID assignment</li>
+</ul>
+</ul>
+<p>Are lines 3,4 <a href="faq_net1.htm#CDMA">CDMA</a> specs ? [ANSI] for 1900 MHz, [TSB74] for 800 MHz <a href="faq_net1.htm#CDMA">CDMA</a>
+</td></tr></table>
+
+<p><a NAME="Menu7"></a><b>Test 7</b>
+<br>Information about current (recently monitored) cell
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>E A H C I BR<br>
+a b c d e fg<br>
+ECSC 2Ter MB<br>
+h i j</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Serving Cell<br>
+system info<br>
+bits<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>a - 1, if emergency calls (112) are possible</li>
+<li>b - 1, if <a href="faq_net1.htm#IMSIattach">IMSI attach</a> and <a href="faq_net1.htm#IMSIdetach">IMSI detach</a> are possible</li>
+<li>c - 1, if the cell supports <a href="faq_net1.htm#HR">HR channels</a></li>
+<li>d - 1, if <a href="faq_net1.htm#C2">C2</a> values are broadcasted</li>
+<li>e - 1, system information 7 and 8 are broadcasted</li>
+<li>f - 1, if the cell supports cell broadcasting (<a href="#CBCH">CBCH</a> channel)</li>
+<li>g - 1, if cell re-establishment is possible</li>
+</ul>
+
+<p>Last two lines are present only in dual phones (GSM 900/1800 \96 for example Nokia 6150 and 3210):
+
+<p>
+<ul>
+<li>
+h - 1 in standby mode, if ECSC (Early Classmark) sending is supported. During a call "x" is displayed.
+</li>
+
+<li>
+i - 1 in standby mode, if 2-Ter messages are supported. During call "x" is displayed
+</li>
+
+<li>
+j - information (if supported) which cells from both frequencies bands (900 and 1800 MHz) are shown
+(MULTIBAND_REPORTING parameter value). Description from
+Phase2+ ETSI GSM 05.08 version 5.4.0, section 8.4.3 "Additional cell reporting requirements for multi band MS" specification:
+
+<p>
+<ul>
+<li>
+0 - 6 strongest cells (with known and allowed <a href="faq_net1.htm#NCC">NCC</a> from
+<a href="faq_net1.htm#BSIC">BSIC</a>), regardless their frequency band (900 or 1800 MHz)</li>
+
+<li>
+1 - strongest cell (with known and allowed
+<a href="faq_net1.htm#NCC">NCC</a> from <a href="faq_net1.htm#BSIC">BSIC</a>) in each frequency band on
+BA list, except for frequency band of the current cell. Remaining positions should be used to show cells in frequency band
+of the current cell. If there are free positions left, further strongest and recognized cells from other bands are shown (their
+frequencies bands are not important).
+</li>
+
+<li>
+2 - like in 1, but two strongest cells are shown first (with known and allowed <a href="faq_net1.htm#NCC">NCC</a> from
+<a href="faq_net1.htm#BSIC">BSIC</a>) in each band...
+</li>
+
+<li>
+3 - three strongest cells are shown first...</li>
+</ul>
+</li>
+
+</ul>
+
+<p>If your phone wasn\92t logged to any network, some default values are shown.
+
+<p>In Nokia 6160 this test is different:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+User<br>
+interface <br>
+display<br>
+</tt></td>
+</tr>
+</table>
+
+<p>and here is for Nokia 6185/6188:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
+<tr><td><a href="faq_net1.htm#CDMA">CDMA</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+CSST <br>
+DATE<br>
+TIME<br>
+</tt></td>
+</tr>
+</table>
+</td>
+<td><a href="faq_net1.htm#AMPS">AMPS</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+1AT_V_FA0000<br>
+FVC_S_FA0000<br>
+WFLG_INT7046<br>
+NORMALRXFE25</i>
+</tt></td>
+</tr>
+</table>
+</td></tr>
+<tr><td colspan=2>
+ <br><a href="faq_net1.htm#CDMA">CDMA</a><p>
+<ul>
+<li>CSST - Cellular state: [IDLE], [CONVE], [PLIOS], [TIME], [SYNC], [RELE], [PAGE], [TRFIN], [W_OR]</li>
+<li>DATE - <a href="faq_net1.htm#CDMA">CDMA</a> Network date</li>
+<li>TIME - <a href="faq_net1.htm#CDMA">CDMA</a> Network time</li>
+</ul>
+</td></tr></table>
+
+<font class="drukuj">
+<br><a class="shref" href="#Top"><small><em>Back to the top</em></small></a><br>
+
+<center>
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><b>[Part 3]</b><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wiacek<Marcin-Wiacek@topnet.pl>">Marcin Wiacek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Last modification: 5 January 2002</font>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta name="Author" content="Marcin Wiacek">
+ <meta name="Description" content="NOKIA NetMonitor description (English version)">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="language" content="us">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, Marcin, Wiacek, Marcin Wiacek">
+ <title>NetMonitor in Nokia phones (4/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">NetMonitor in Nokia phones (4/7)</font>
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><b>[Part 4]</b><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+
+<ol>
+<li><a href="faq_net0.htm#1"><b>What is it ?</b></a></li>
+<li><a href="faq_net0.htm#2"><b>Do I need it ?</b></a></li>
+<li><a href="faq_net0.htm#3"><b>Does my phone use more power with NetMonitor enabled ?</b></a></li>
+<li><a href="faq_net0.htm#4"><b>How to activate it ?</b></a></li>
+<li><a href="faq_net0.htm#5"><b>Which NetMonitor version can be activated in my phone ?</b></a></li>
+<li><a href="faq_net0.htm#6"><b>Does NetMonitor activation void warranty ?</b></a></li>
+<li><a href="faq_net0.htm#7"><b>NetMonitor menu in my phone has different number than 10. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#8"><b>NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#9"><b>How to use it ?</b></a></li>
+<li><a href="faq_net0.htm#10"><b>Can I damage my phone ?</b></a></li>
+<li><a href="faq_net1.htm#11"><b>Glossary</b></a></li>
+<li><a href="faq_net2.htm#12"><b>Description of the individual tests</b></a></li>
+<li><a href="faq_net6.htm#13"><b>You can also use a program...</b></a></li>
+<li><a href="faq_net6.htm#14"><b>Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</b></a></li>
+<li><a href="faq_net6.htm#15"><b>How can I disable NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#16"><b>Do I need to disable NetMonitor before sending my phone to the service ?</b></a></li>
+<li><a href="faq_net6.htm#17"><b>Is it possible to re-activate NetMonitor after disabling it ?</b></a></li>
+<li><a href="faq_net6.htm#18"><b>Is NetMonitor available in analog Nokia phones ?</b></a></li>
+<li><a href="faq_net6.htm#19"><b>Does NetMonitor allow to use phone like broadcast station ?</b></a></li>
+<li><a href="faq_net6.htm#20"><b>I don't have all described tests in my phone. Why ? Can I increase their number ?</b></a></li>
+<li><a href="faq_net6.htm#21"><b>Does NetMonitor allow to identify place, where is my interlocutor ?</b></a></li>
+<li><a href="faq_net6.htm#22"><b>Does NetMonitor allow to identify place, where am I ?</b></a></li>
+<li><a href="faq_net6.htm#23"><b>What are NetMonitor codes ?</b></a></li>
+<li><a href="faq_net6.htm#24"><b>Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</b></a></li>
+<li><a href="faq_net6.htm#25"><b>Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#26"><b>I have non existing networks on the list of forbidden networks...</b></a></li>
+<li><a href="faq_net6.htm#27"><b>How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</b></a></li>
+<li><a href="faq_net6.htm#28"><b>Can I use DLR-2/DLR-3 cables for activating netmonitor ?</b></a></li>
+<li><a href="faq_net6.htm#29"><b>Can I activate netmonitor using Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="faq_net6.htm#30"><b>Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</b></a></li>
+<li><a href="faq_net6.htm#31"><b>How to change settings in tests ?</b></a></li>
+<li><a href="faq_net6.htm#32"><b>My phone has very short snandby time - it is possible to see the reason of it ?</b></a></li>
+<li><a href="faq_net6.htm#33"><b>Is netmonitor available in English version only ?</b></a></li>
+<li><a href="faq_net6.htm#Literatura"><b>Information sources</b></a></li>
+<li><a href="faq_net6.htm#35"><b>Additional information</b></a></li>
+<li><a href="faq_net6.htm#36"><b>Does using/activating netmonitor cost anything ?</b></a></li>
+<li><a href="faq_net6.htm#37"><b>Does using netmonitor is legall ?</b></a></li>
+<li><a href="faq_net6.htm#38"><b>Which entries on SIM card are used in netmonitor tests ?</b></a></li>
+<li><a href="faq_net6.htm#39"><b>Can I activate netmonitor in 3310 using soft working with 3210 ?</b></a></li>
+<li><a href="faq_net6.htm#40"><b>After activating netmonitor/BTS TEST my phone can't find network...</b></a></li>
+<li><a href="faq_net6.htm#41"><b>Netmonitor shows different battery capacity than info on it...</b></a></li>
+</ol>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><a NAME="Menu8"></a><b>Test 8</b>
+
+<p>In Nokia 6185/6188 it looks like follows:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
+<tr><td><a href="faq_net1.htm#CDMA">CDMA</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+TADD TDROP<br>
+TCOMP TTDROP<br>
+WW1 WW2 WW3<br>
+</tt></td>
+</tr>
+</table>
+</td>
+<td><a href="faq_net1.htm#AMPS">AMPS</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+1STBY_RX7244<br>
+XNRML_RX006C<br>
+X_N_RX_O004C<br>
+X_N_RX_F0020</i>
+</tt></td>
+</tr>
+</table>
+</td></tr>
+<tr><td colspan=2>
+ <br><a href="faq_net1.htm#CDMA">CDMA</a><p>
+<ul>
+<li>TADD - threshold to add a new active PN (raw value ex: 28 = Ec/Io at -14 dB), [TDROP] : threshold to drop an active PN (raw value ex: 32 = Ec/Io at -16 dB)</li>
+<li>TCOMP - an other threshold to add an active PN when a candidate PN becomes stronger than an active PN</li>
+<li>TTROP - timer to drop a PN when power of this PN goes below TDROP</li>
+<li>WW1 - value of the seach window for the active PN</li>
+<li>WW2 - value of the seach window for the neighbour PN,[WW3]: value of the seach window for the remaining PN.</li>
+</ul>
+</td></tr></table>
+
+<br>In Nokia 6210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+CCCH<br>
+Ts 01234567<br>
+Rx xxxxxxxx<br>
+Tx xxxxxxxx<br>
+mCh x mPw xx
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+9600/14000<br>
+ <br>
+TS for Rx<br>
+TS for Tx<br>
+MainCh/PwrLv
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>it is connected with data transmission.
+In line with Rx and Tx you see, which <a href=faq_net1.htm#TS>Time Slots</a> are used for it
+(for receiving and transmiting).
+
+<p>When phone doesn't use <b>HSCSD</b> (High Speed Circuit Switched Data),
+only one <a href=faq_net1.htm#TS>time slot</a> is used both for transmiting and receiving
+(it's visible also in <a href=faq_net2.htm#Menu1>test 1</a> then).
+
+<p>When use <b>HSCSD</b>, only this test gives full information about it...
+You can check here, what can be maximal theoretical speed for downloading
+and uploading data (number_of_used_slots * 9600 or number_of_used_slots * 14000)...
+
+<br><b>mCh</b> seems to be "main" time slot among them used for transmission
+(one that seems to be always used for both ways - probably can be viewed as the slot
+that would be used if no <b>HSCSD</b> were used, and all other slots are "extra" slots to
+increase number of sent/received data). It seems to be displayed in
+<a href=faq_net2.htm#Menu1>test 1</a> too...
+
+<br><b>mPw</b> seems to be the power level for the "main" time slot
+(it seems to be displayed in <a href=faq_net2.htm#Menu1>test 1</a> too - units
+are the same)....
+The power levels for all 8 individual slots can be found in
+<a href=#Menu9>test 9</a>.
+
+<p>First line shows channel displayed in <a href=faq_net2.htm#Menu1>test 1</a> too.
+It's available in new firmware only (5.02).
+
+<p><a NAME="Menu9"></a><b>Test 9</b>
+
+<p>In Nokia 6185/6188 it looks like follows:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
+<tr><td><a href="faq_net1.htm#CDMA">CDMA</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+006 330 270<br>
+047 062 062<br>
+342 102 030<br>
+062 062 062</i>
+</tt></td>
+</tr>
+</table>
+</td>
+<td><a href="faq_net1.htm#AMPS">AMPS</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+1PT_1_OK724E<br>
+RPT_1_FA0042<br>
+TIME__2_0000<br>
+MER2HIGH0002</i>
+</tt></td>
+</tr>
+</table>
+</td></tr>
+<tr><td colspan=2>
+ <br><a href="faq_net1.htm#CDMA">CDMA</a><p>
+Tracked PN Offsets (lines 1,3) and EC/SO (Energy per chip per noise).
+An EC/SO of 062 likely means not really usable? lower numbers are better
+strengths). See <a href="faq_net2.htm#Menu2">test 2</a> for PN offset information.
+</td></tr></table>
+
+<br>In Nokia 6210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+mCh x mPw xx<br>
+ xx xx xx xx<br>
+ xx xx xx xx<br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+MainCh/PwrLv<br>
+PwrLv TS 0-3<br>
+PwrLv TS 4-7<br>
+
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>and is connected with <b>HSCSD</b> (High Speed Circuit Switched Data)
+and shows power levels for each <a href=faq_net1.htm#TS>time slot</a>
+used in data transmission
+(more info about data transmission in Nokia 6210 is visible also in
+<a href=#Menu8>Test 8</a>). Units here seems to be the same to units
+in <a href=faq_net2.htm#Menu1>test 1</a> (power level used for "main"
+time slot in transmission is displayed also there).
+
+<p><a NAME="Menu10"></a><b>Test 10</b>
+<br>Network information (concern current or recently monitored network)
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>TMSIaaaaaaaa<br>
+T321:bbb/ccc<br>
+PRP:d ee ff<br>
+ ggggg hhh </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>TMSI(hex)<br>
+T3212ctr/tim<br>
+PaRP DSF AGC<br>
+ AFC Ch</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaaaaa - <a href="faq_net1.htm#TMSI">TMSI</a>:
+a number assigned to each phone logged to the network (it can be done, for
+example, after power on, a call, sending/receiving SMS, requesting some services,
+<a href="faq_net1.htm#PLU">PLU</a>). Value from the SIM card
+(each new number is written there) in hexadecimal format. If assigning this
+number fails (for example because transmitter was turned off in
+<b><a href="faq_net4.htm#Menu45">test 45</a></b> or SIM card is not active),
+'xxxxxxxx' is shown here and the phone displays 'No network coverage' message (when you try
+to make a call).
+</li>
+
+<li>
+bbb - value of the so called T3212 counter: the phone periodically informs
+the network about its location
+(makes a <a href="faq_net1.htm#PLU">PLU</a>). 'bbb' counter means time from
+last update and can be a value from 1 to 'ccc' (where 1 means 6 minutes, 2 -
+2 * 6 min = 12 min, etc.). This counter is also cleared after each connection,
+sending/receiving SMS or requesting a network services - for example call
+diverting (but the counters from <b><a href="faq_net5.htm#Menu64">test 64</a></b>
+don't change). The value doesn't change (it's always equal 0) with not active
+SIM card.</li>
+
+<li>
+ccc - max T3212 counter value: period of time, after which the phone sends
+information about its location - makes a <a href="faq_net1.htm#PLU">PLU</a>
+(range from 1 to 240, where 1 means 6 min between updates and 240 means
+24 hours (240*6min)). This value is received from the network (if it is 0,
+the network doesn't require information about phone location). For Polish
+networks <a href="http://www.eragsm.pl">Era GSM</a> and
+<a href="http://www.plusgsm.pl">Plus GSM</a> it's equal 30 (3h), for
+<a href="http://www.idea.centertel.pl/">Idea</a> 2h. Displayed normally
+even, when SIM card is not active.
+</li>
+
+<li>
+d - Paging Repeat Period, sometimes called DRX (Dincontinuous Receive):
+period of time, after which the phone turns its receiver on to check whether
+someone is calling us (range from 2 to 9 - the higher, the longer time between
+these checks so the phone uses less power:
+PRP=2 means about 0.95 s, a PRP=9 equal 4.25 s.).
+Interesting thing is that max standby times are usually calculated by the manufacturers
+for this parameter equal 9.
+</li>
+
+<li>
+ee - DSF (<b>D</b>ownlink <b>S</b>ignalling <b>F</b>ailure). If it is negative,
+0 is shown. Max value of this parameter is 45. When the phone uses
+<a href="faq_net1.htm#TCH">TCH</a> channel, xx is displayed.
+</li>
+
+<li>
+ff - AGC (<b>A</b>utomatic <b>G</b>ain <b>C</b>ontrol) - automatic gain control
+of the phone receiver. The stronger the signal from <a href="faq_net1.htm#BTS">BTS</a>,
+the lower this value. It is displayed correctly only when the phone uses
+<a href="faq_net1.htm#TCH">TCH</a>/<a href="faq_net2.htm#SDCC">SDCCH</a> channel
+(for example: during a call) and can be a value from 0 to 96 (dB ?).
+</li>
+
+<li>
+ggggg - in some English descriptions it's "VCTCXO AFC DAC control" - a value
+between -1024 and 1023. In help it's described as AFC
+(<b>A</b>utomatic <b>F</b>requency <b>C</b>ontrol) - automatic adjusting phone's
+receiver to the frequency of the signal transmitted by <a href="faq_net1.htm#BTS">BTS</a>.
+The more this value differs from 0, the more frequency corrections have to be
+made by the receiver (it depends on the channel used in communication with
+<a href="faq_net1.htm#BTS">BTS</a> - see <b><a href="faq_net2.htm#Menu1">test 1</a></b>)
+to "match" the <a href="faq_net1.htm#BTS">BTS</a>.
+</li>
+
+<li>
+hhh - CH (<b>ch</b>annel): number of channel used in communication with cell (decimal)
+</li>
+</ul>
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+Pagrepp. d<br>
+T:aaaaaaaa<br>
+T3212: bbb
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+PagRepPer.<br>
+TMSI<br>
+T3212
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 3110 this test looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>TMSI:aaaaaaaa<br>
+T3212:bbb/ccc<br>
+PRP:d ee ff<br>
+w gggg hhh z</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>TMSI(hex)<br>
+T3212 ctr/tim<br>
+PagRP DSF AGC<br>
+S AFC CH B</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>If the phone after power on wasn't logged to any network,
+some default values are displayed here (except for <b>TMSI</b>).
+
+<p>Some of these values can be also found in Nokia service programs
+(for example in WinTesla - in menu "Testing" / "RF Information").
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>In <b><a href="faq_net5.htm#Menu64">test 64</a></b> you can check,
+how many times your phone has sent an information about its location.
+If you have sent an SMS, you can check (exact to 6 min), when you did it
+(if it wasn't earlier than value 'ccc' for your network) - check 'bbb' parameter value.
+</td>
+</tr>
+</table>
+
+<p>And here is this test for Nokia 6185/6188:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
+<tr><td><a href="faq_net1.htm#CDMA">CDMA</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+414 084 222<br>
+062 060 062<br>
+420 366 252<br>
+062 062 062
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+<td><a href="faq_net1.htm#AMPS">AMPS</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+1X_XSTBY000D<br>
+SYNC_LOS0031<br>
+DEC_SAME0000<br>
+VOTED_BT0000</i>
+</tt></td>
+</tr>
+</table>
+</td></tr>
+<tr><td colspan=2>
+ <br><a href="faq_net1.htm#CDMA">CDMA</a><p>
+Tracked PN Offsets (lines 1,3) and signal strengths.
+</td></tr></table>
+
+<p><a NAME="Menu11"></a><b>Test 11</b>
+<br>Identification of the currently used (last monitored) network
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>CC:aaa NCbbb<br>
+ LAC:ccccc<br>
+ CH : deee<br>
+ CID:fffff</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> <b>MCC MNC<br>
+LocAreaCode <br>
+ServChannel<br>
+ CellId</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - MCC (<b>M</b>obile <b>C</b>ountry <b>C</b>ode): code of the network home
+country (260 for Poland) - decimal.
+</li>
+
+<li>
+bbb - MNC (<b>M</b>obile <b>N</b>etwork <b>C</b>ode): network code
+(different for networks with the same <b>MCC</b> - for example, in Poland:
+01 for <a href="http://www.plusgsm.pl/">Plus GSM</a>, 02 for <a href="http://www.eragsm.pl/">Era GSM</a> and
+03 for <a href="http://www.idea.centertel.pl/">Idea</a>).
+
+<p>Generally values here are decimal. Sometimes are exceptions (when and why ?)
+and you can find hexadecimal value here: if you will convert it into
+decimal and result treat as hexadecimal value (convert it into decimal value
+again), you will have decimal value of this parameter (for example,
+3F hex=63 dec; 63 hex=99 dec).
+
+<p>When you use phone working in PCS 1900
+system (for example, Nokia 6190), this number can be 3-digit long. It's decimal (always ?).
+If it consist of two digits, you will see "?" instead of last (for example,
+you will see "37?" for "37")<p>
+</li>
+
+<li>
+ccccc - LAC (<b>L</b>ocation <b>A</b>rea <b>C</b>ode): code of the current
+cell area (decimal or hexadecimal). The size of this area (with the same LAC)
+depends on the network. After changing LAC, the phone makes
+<a href="faq_net1.htm#LocationUpdate">Location Update</a>.</li>
+
+<li>
+d - H, if frequency hopping is enabled (otherwise empty). This information
+can be also found in <b><a href="faq_net2.htm#Menu1">test 1</a></b> and
+<b><a href="faq_net3.htm#Menu12">test 12</a></b>.</li>
+
+<li>
+eee - CH (<b>ch</b>annel): number of channel used in communication with cell (decimal)
+</li>
+
+<li>
+fffff - CID (<b>C</b>ell <b>Id</b>entifier): number of the current cell
+(each cell in given area has its own unique ID number) - shown decimal or hexadecimal.
+</li>
+</ul>
+
+<p>LAC and CID format (if they're displayed decimal or hexadecimal) depends
+on your phone's model and its software version (for instance: Nokia 3210
+and Nokia 5110 with newer software display decimal values, while Nokia 5110
+with 4.59 (and older) firmware and some previous models (like Nokia 3110)
+use hexadecimal format).
+
+<p>GSM phones recognize the network using MCC and MNC codes
+(list of these codes can be found at
+<a href="http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-list.html">http://kbs.cs.tu-berlin.de/~jutta/gsm/gsm-list.html</a>).
+Network names shown on phone's display (like '<a href="http://www.eragsm.pl/">ERA GSM</a>',
+'<a href="http://www.plusgsm.pl/">Plus GSM</a>' or '<a href="http://www.idea.centertel.pl/">Idea</a>')
+are stored in phone's memory (they're set by the producer - cellular network doesn't
+send any name, just these two numbers). In order to correctly recognize a
+new network, you must upgrade the firmware of the phone (or it won't display
+network name). Some older phones, like Nokia 2110i (or newer models
+without firmware upgrade) display names like PL-03 (they recognize that
+MCC=260 is Poland (which has international code PL), but they don't know
+the network name - only its MNC). One (?) text name can also be changed
+using appropriate programs:
+
+<p><ul>
+<li>WinTesla - from main menu "Dealer"/"Operator Settings"</li>
+<li>program from <a href=http://www.mobil.cz/triky/nokia000511.html>http://www.mobil.cz/triky/nokia000511.html</a>
+(works with Nokia 3110/8110)</li>
+</ul>
+
+<p>In Polish version of this manual the description of BTSes contains
+URLs of pages with BTSes lists - with their locations, LAC and CID
+(for Polish networks).
+
+<p>If the phone after power on wasn't logged to any network, some default values are displayed here.
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aaa eee bb<br>
+LAC: cccc<br>
+CellI:ffff
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+MCC CH MNC<br>
+LocAreaCod<br>
+CELL IDent
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 3110 this menu looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>CC:aaa NC:bbb<br>
+ LAC:cccc<br>
+ CH :deee<br>
+w CID:ffff z</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> MCC MNC<br>
+ LocAreaCode<br>
+ ServChannel<br>
+S CellId B</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>And here is for Nokia 6185/6188:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 width=100%>
+<tr><td><a href="faq_net1.htm#CDMA">CDMA</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+162 054 <br>
+062 062<br>
+186 084<br>
+062 051
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+<td><a href="faq_net1.htm#AMPS">AMPS</a><br>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+11_BETTR0000<br>
+SYNC_SAM0000<br>
+MSG__BTR0000<br>
+SFLG_BTR0000</i>
+</tt></td>
+</tr>
+</table>
+</td></tr>
+<tr><td colspan=2>
+ <br><a href="faq_net1.htm#CDMA">CDMA</a><p>
+Tracked PN Offsets (lines 1,3) and signal strengths (only, when phone is in CONV state)
+</td></tr></table>
+
+<p><a NAME="Menu12"></a><b>Test 12</b>
+<br>Parameters of currently used (last monitored) network
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>CIPHER :aaa <br>
+HOPPING:bbb<br>
+DTX :ccc<br>
+IMSI :ddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CipherValue<br>
+HoppingValue<br>
+DTXValue<br>
+IMSIAttach</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa:
+
+<p>
+<ul>
+<li>
+OFF: phone doesn't transmit</li>
+
+<li>
+A51: phone transmits, data are coded using A5/1 algorithm (more complicated version)</li>
+
+<li>
+A52: phone transmits, data are coded using A5/2 algorithm (a version designed
+for use in some "doubtful" countries - potential future enemies (like Iraq)). It's easier to
+decode and crack, but still secure (not cracked) - but I can be wrong !
+</li>
+</ul>
+<p>
+</li>
+
+<li>
+bbb - informs, whether <a href="faq_net1.htm#Hopping">frequency hopping</a> is enabled (ON) or disabled (OFF)
+</li>
+
+<li>
+ccc - informs, whether <a href="faq_net1.htm#DTX">DTX</a> is used (ON) or not (OFF) by phone
+</li>
+
+<li>
+ddd - informs, whether <a href="faq_net1.htm#IMSIattach">IMSI attach</a> is allowed (ON)
+</li>
+</ul>
+
+<p>All the values in this menu are updated only when the phone uses <a href="faq_net1.htm#TCH">TCH</a>
+channel.
+
+<p>If the phone after power on wasn't logged to any network, some default values are displayed here.
+
+<p>More information about A5/1 and A5/2 algorithms can be found at <a href="http://www.scard.org/gsm/">www.scard.org/gsm/</a>.
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+CIPHER aaa<br>
+HOPPIN bbb<br>
+DTX ccc
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+CIPHERING<br>
+HOPPING<br>
+DTX ON/OFF
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 3110 this test looks as follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>CIPHER :aaa<br>
+HOPPING:bbb<br>
+DTX :ccc<br>
+w IMSI :ddd z</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CipheringValu<br>
+HoppingValue<br>
+DTXValue<br>
+S IMSIAttachB</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 6185/6188 in <a href="faq_net1.htm#AMPS">AMPS</a> it looks different:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>1IN_FAIL0044<br>
+DYN_FAIL01C7<br>
+MIN2_FAI0045<br>
+DYN2_FAI01CB</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu13"></a><b>Test 13</b>
+<br>Information about <a href="faq_net1.htm#DTX">DTX</a> in currently used (last monitored) network
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaaaaaaa <br>
+DTX(DEF):bbb<br>
+DTX(BS) :ccc<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>DTXMode<br>
+DefaulDTXSta<br>
+DTXValFromBS<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaaaaaaaaa: information, whether the phone uses <a href="faq_net1.htm#DTX">DTX</a>:
+
+<p>
+<ul>
+<li>DTX:ON - yes, it uses</li>
+<li>DTX:OFF - no, it doesn't use</li>
+<li>DTX:DEF - yes or not (depends on default setting - bbb parameter)</li>
+<li>NOTALLOWED - the phone cannot independently decide to use <a href="faq_net1.htm#DTX">DTX</a> or not (<a href="faq_net1.htm#BTS">BTS</a> doesn't allow this)</li>
+</ul>
+<p>
+</li>
+
+<li>bbb - default <a href="faq_net1.htm#DTX">DTX</a> setting: ON or OFF.</li>
+
+<li>
+ccc - <a href="faq_net1.htm#DTX">DTX</a> value from <a href="faq_net1.htm#BTS">BTS</a>
+(on uplink - a channel used in communication in direction phone-<a href="faq_net1.htm#BTS">BTS</a>):
+
+<p>
+<ul>
+<li>MAY - <a href="faq_net1.htm#BTS">BTS</a> lets the phone "decide", whether to use <a href="faq_net1.htm#DTX">DTX</a> or not</li>
+<li>USE - <a href="faq_net1.htm#BTS">BTS</a> forces <a href="faq_net1.htm#DTX">DTX</a> usage</li>
+<li>NOT - <a href="faq_net1.htm#BTS">BTS</a> doesn't allow to use <a href="faq_net1.htm#DTX">DTX</a></li>
+</ul>
+<p>
+</li>
+
+</ul>
+
+<p>If the phone after power on wasn't logged to any network, some default values are displayed here.
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+cccccccccc<br>
+MS DEF:bbb<br>
+dddddddddd
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+DTX STATUS<br>
+DEF STATE<br>
+BS PARAM
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>cccccccccc - the same to aaaaaaaaaa. Values: "DTX ON", "DTX OFF", "DTX DEF" lub "NOTALLOWED"</li>
+<li>dddddddddd - the same to ccc. Values "MS MAY USE", "SHALL USE" or "SHALL NOT"</li>
+</ul>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>If <a href="faq_net1.htm#BTS">BTS</a> allows this (if the last parameter's
+value is MAY), you can decide whether to use <a href="faq_net1.htm#DTX">DTX</a>
+or not by entering this menu in a direct mode.
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu14"></a><b>Test 14</b>
+<br>By entering this menu in direct mode, you can change aa parameter value from 01 (default) to 00 (or vice versa).
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> SCREENING <br>
+ INDICATOR<br>
+ IS aa<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to <br>
+ change<br>
+ Screening<br>
+ indicator</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+SCREEN IND<br>
+SET TO aa<br>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+CHANGE<br>
+SCREENING <br>
+INDICATOR
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu15"></a><b>Test 15</b>
+
+<p>In Nokia 5190/6190:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aaa bbb cccc<br>
+ddd eee f<br>
+gg hh ii<br>
+jjjjjjjjjj
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+CH RxL TxPwr<br>
+MdSt SAT DCC<br>
+ST TxA RxA<br>
+ CS STATE
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>When you don't have additional module
+(it's between "main" phone and battery), you will see "AMPS display not available"
+here. After connecting it you will see values connected
+<a href="faq_net1.htm#AMPS">AMPS</a>:
+
+<p>
+<ul>
+<li>aaa - channel used for communication with cell (0 during standby)</li>
+<li>bbb - level of received signal in dB</li>
+<li>ccc - level of the transmitted signal (0 during standby)</li>
+<li>eee - SAT, x during standby</li>
+<li>f - DCC (<b>D</b>igital <b>C</b>olor <b>C</b>ode) on the
+ACCH channel (0-3, - = not locked), x during standby</li>
+<li>jjjjjjjjjj - cellular state:
+<p>
+<ul>
+<li>IDLE - standby</li>
+<li>CALL GOING - exchange of data required to make call</li>
+<li>IN CALL - during call</li>
+<li>PCH INIT - scanning available paging channels ? (for example, after call)</li>
+<li>CCH INIT - scanning control channels ?</li>
+<li>ACCESS - accesing network ?</li>
+</ul>
+</li>
+</ul>
+
+<p>and 6210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ Tx27178506<br>
+ReTx42645758<br>
+ Rx27178505<br>
+RTRq27178504
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Sent frames<br>
+Re-transmis.<br>
+Rec. frames<br>
+Re-send reqs
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>In Nokia 6250 help is the same to help from 6210, but screen with values is EMPTY.
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+xxx SIM yy<br>
+LAC:  zzzz<br>
+wwwwwwwwww
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+MCC MNC<br>
+LocAreaCod<br>
+Upd status
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Values here can be different from these in <a href=#Menu11>test 11</a>.
+They're taken from file Location information (6F7E) on SIM card.
+
+<p>
+<ul>
+<li>xxx - MCC</li>
+<li>yy - MNC</li>
+<li>zzzz - LAC (hexadecimal)</li>
+<li>wwww - state of Location Update
+<ul>
+<li>
+Updated - value from SIM (bits b3 - b1) 0 0 0, meaning: done Location Update in Location Area,
+which is shown on the screen
+</li>
+<li>NotUpdated - value 0 0 1, meaning: Location Update not done or didn't end with success</li>
+<li>PLMN Not A - value 0 1 0, meaning: LPLMN not allowed</li>
+<li>LA Not All - value 0 1 1, meaning: Location Area not allowed</li>
+<li>Reserved - value 1 1 1, reserved for future use</li>
+<li>Undefined0 - value 1 0 0, undefined value</li>
+<li>Undefined1 - value 1 0 1, undefined value</li>
+<li>Undefined2 - value 1 1 0, undefined value</li>
+<li>LA NotRead - file wasn't read from SIM</li>
+</ul>
+</li>
+</ul>
+
+<p><a NAME="Menu17"></a><b>Test 17</b>
+
+<p><b><font color=red>
+USERS OF NOKIA 6210 HAVE TO READ FIRST NOTES WRITTEN ON THE END OF DESCRIPTION
+FOR THIS TEST. IN OTHER CASE THEY CAN DAMAGE THEIR PHONES.
+</font></b>
+
+<p>This menu lets the phone test one concrete channel used in communication
+with cell (the phone doesn't seek channel with the strongest signal, but uses
+the channel chosen by you: you can use channels 1-124 for GSM 900
+and 512-885 for GSM 1800). Each GSM network has its own assigned channels
+from these ranges (which means that each two networks in one country can't
+use the same channels - for example, in Poland <a href="http://www.plusgsm.pl/">Plus GSM</a>
+cannot use <a href="http://www.eragsm.pl/">Era GSM</a> channels and vice versa).
+
+<p>
+<center>
+<table cellspacing=0 cellpadding=0>
+<tr><td></td><td><center><b>GSM 900 (1-124)</b></center></td><td><center><b>GSM 1800 (512-885)</b></center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.tim.it/">TIM</a> (222-01)</b></center></td><td nowrap><center>8-64 (16 most important cities) or 8-50 (outside them)</center></td><td nowrap><center>736-760</center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.omnitel.it/">Omnitel</a> (222-10)</b></center></td><td nowrap><center>66-118 (16 most important cities) or 77-118 (outside them)</center></td><td nowrap><center>861-885</center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.wind.it/">Wind</a> (222-88)</b></center></td><td nowrap><center>52-75 (outside 16 most important cities)</center></td><td nowrap><center>761-810</center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.blu.it/">Blu</a> (222-??)</b></center></td><td nowrap><center>-</center></td><td nowrap><center>811-860</center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.plusgsm.pl/">Plus GSM</a> (260-01)</b></center></td><td nowrap><center>1-14 and 37-67 (37 and 67 for testing)</center></td><td nowrap><center>749 - 760, 850 - 884 ?</center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.eragsm.pl/">Era GSM</a> (260-02)</b></center></td><td nowrap><center>15-36 and 68-90 (15 and 36 for testing)</center></td><td nowrap><center>736 - 748, 811 - 847 ?</center></td></tr>
+<tr><td nowrap><center><b><a href="http://www.idea.centertel.pl/">Idea</a> (260-03)</b></center></td><td nowrap><center>91-114, 115-124 from January 2004</center></td><td nowrap><center>733, 763 - 810</center></td></tr>
+</table>
+</center>
+
+<p>You can enter numbers of channels belonging to any network (if you enter
+a channel of forbidden network, you will see all network parameters,
+but obviously you won't be able to establish connection (except for
+emergency calls)). After enabling this test your phone won't be able to make
+<a href="faq_net4.htm#Handover">handovers</a>.
+
+<p>To enable this test, proceed as follows (sometimes this procedure doesn't
+work - but turning the phone off and then on often helps; I don't know why):
+
+<p>
+<ul>
+<li>
+save (change) desired channel number on position number 33 of the SIM card's
+phone book in decimal format (<b><font color="#FF6666">not in phone's memory!</font></b>) -
+<b><font color="#FF6666">if you save '0' there, this test will be inactive!</font></b>
+However, this step is not necessary, if this number was stored there earlier -
+you can check this with <b>33#</b> code). Remember, that phone checks used format. Here are
+some examples of correct entries: "1", "700".</li>
+
+<li>go to <b>test 17</b></li>
+
+<li>once again enter <b>test 17</b> directly</li>
+
+<li>switch your phone off and then back on</li>
+</ul>
+
+<p>To disable this test:
+
+<p>
+<ul>
+<li>enter <b>test 17</b> directly</li>
+
+<li>switch the phone off and back on (sometimes it isn't needed -
+phone should disable test, when loose signal on this channel;
+but it's better to do that to avoid potential problems)
+</li>
+</ul>
+
+<p>Some interesting results can be achieved, when (guess why ?):
+
+<p>
+<ul>
+<li>you enable this test</li>
+
+<li>then you switch <b><a href="#Menu19">test 19</a></b> to REVERSE</li>
+
+<li>turn off the test, but not the phone (by entering <b>test 17</b> one time in a direct mode)</li>
+</ul>
+
+<p>In this case the phone "jumps" from one channel to another and monitors
+channels of different networks - you can see LAC and CID codes of the cells.
+Furthermore, the phone cannot log to its home network (though it displays
+parameters of its channels). Several times I got "Insert SIM card" or
+"SIM card rejected" messages - it may be some bug in firmware. After turning
+the phone off and then on everything works fine.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>The above tip can be used for fast battery discharging (however your phone
+won't be accesible in the network).
+
+<p>If you want to check some informations about different than your network, you
+can use different tip too:
+
+<ol>
+<li>select the test, where will be displayed interesting for you information
+about this network</li>
+<li>go to the manual network selection (for example, <b>Menu 4-2-4-2</b> in Nokia
+5110)</li>
+<li>select interesting for you network</li>
+<li>wait few seconds (some time is required to start logging into this network)
+and press "Quit" (NOT (c) key) or wait, until phone will display any message
+(for example, that logging wasn't successfull)</li>
+<li>press fast (c) key to leave phone's menu</li>
+</ol>
+
+<p>Information about interesting for you network will be displayed during few seconds...
+
+</td>
+</tr>
+</table>
+
+<p>I heard about some cases, when this test turned itself spontaneously on
+after loosing the signal by the phone. I didn't experience this, but if this
+has ever happened to you, just save 0 on 33rd position of the SIM card's phone
+book.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>Since Nokia 51xx/61xx phones don't allow choosing the position for the phonebook entry,
+I want to suggest:
+
+<ol>
+<li>check whether you already have some number stored on this position
+(using <b>33#</b> code)</li>
+
+<li>
+if the phone displays 'Invalid location', you have to add new entries to the
+phonebook until you hit this position and the phone doesn't display this
+message (repeating 1st step after each new entry)
+</li>
+
+<li>
+after displaying the number, you have to find out who's number is this.
+You can do it in two ways:
+
+<p>
+<ol>
+<li>
+just recall (or check the whole phonebook)
+</li>
+
+<li>
+turn off the transmitter in
+<b><a href="faq_net4.htm#Menu45">test 45</a></b> and call this number
+(the name assigned to this number will be show on screen - you will also find
+it on the 'Last dialed' list)
+</li>
+</ol>
+<p>
+</li>
+
+<li>
+edit the phone book (this position) - you can change the name or the (channel) number
+</li>
+
+<li>
+if the phone asks you, whether to replace the old number or to save it on new location, choose the former option
+</li>
+</ol>
+
+<p>
+To store number on chosen location you can also use other Nokia phone
+(for example 2110), other cellular phones or appropriate software.
+For example: in Nokia Cellular Data Suite you can export list of phone numbers
+to file, open it in editor, change and upload to phone. It's simple, isn't it ?
+</td>
+</tr>
+</table>
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> BTS TEST <br>
+ aaa<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to <br>
+toggle BTS<br>
+test ON/OFF<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>
+<ul>
+<li>
+aaa - can be set to "ON" or "OFF"</li>
+</ul>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>This test can be very usefull when:
+
+<p>
+<ul>
+<li>
+you want to use some particular cell (for example to test whether it is
+possible to use a cell located 20 km away)
+</li>
+
+<li>
+you'd like to avoid roaming (which is much more expensive) - for example
+when you are close to the border (and the phone constantly logs to the network
+of the neighbor country, because it has a stronger signal) - you just switch
+your phone to the channel used by your network...
+</li>
+
+<li>
+other available network has very strong signal (for example -85 dBm) and the
+signal of your home network is very weak (-100 dBm) - your phone can have
+serious problems with logging to your network until you use this test
+</li>
+
+<li>
+you want to monitor the state of some very weak channel - I received some mails, that
+the lowest measured with this method signal strength was -118 dBm
+</li>
+</ul>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+BTSTESTaaa
+<p>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Tells if<br>
+BTS test<br>
+is ON/OFF
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>Number of channel must be saved in 98 position of B memory.
+
+<p>Many users of Nokia 3210 say, that in this model there are problems with enabling
+and disabling this test - part of firmware connected with it has probably some bug(s)...
+I read even in one newsgroup such post (here is in translation):
+
+<p><tt>
+Few people after enabling test 17 made reclamations in service, that phone
+doesn't work. The most interesting is (I'm sure, that in one case) reclamation
+was taken into consideration !!!! - phone was exchanged !!!
+</tt>
+
+<p>In new models (Nokia 3310, 6210, 6250, 8210) it's a little different:
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>BTS TEST<br>
+ aaa<br>
+ <br>
+CH : bbbb
+</tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table></center>
+
+<p>...but you can use it very similiar (to enable):
+
+<p>
+
+<ul>
+
+<li>enter it directly. You should see:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>BTS TEST<br>
+REQUESTED<br>
+ <br>
+CH : bbbb
+</tt></td>
+</tr>
+</table>
+
+<p>where instead of "bbbb" parameter you should see value read from position 33
+from phonebook from SIM card (or "xxxx", when value there was wrong, SIM card
+was not ready, etc. - of course, you will not enable this test then).
+</li>
+<li>restart phone - "aaa" parameter should change to "ON"</li>
+</ul>
+
+<p>To disable this test you should:
+<ul>
+<li>enter directly into it</li>
+<li>restart phone - "aaa" parameter should change to "OFF"</li>
+</ul>
+
+<p><b><font color=red>BE CAREFULL IN MODEL 6210 WITH THIS TEST</font></b>
+In firmware 4.27 (older probably too, I don't know, if it's corrected in newer)
+phone can display CONTACT SERVICE after using it or
+there could be different problems with it. Here are three known examples:
+
+<p><ul>
+<li>after enabling test everything was correct. After writting number 0
+and resetting phone (it was one method for disabling this test in older models)
+CONTACT SERVICE was displayed. User put SIM card into another phone, changed
+33 position in phonebook to CORRECT channel number
+(1-124, 512-885), put SIM back to 6210 and normally used it (second
+6210 with the same symptoms wasn't repaired after making it).
+</li>
+<li>in this concrete example Nokia 6210 displayed info about finding channel 79.
+User written its' number in phonebook on 33'th position. After third reset
+of phone CONTACT SERVICE was displayed. SIM card was put into Nokia 5110 and
+channel number was changed to 76 (this channel was visible in this phone).
+When SIM card was put back into Nokia 6210 phone, it was possible to enable
+it. In this test phone displayed 'BTS TEST ON CH:79' (channel 79 was also visible
+in test 3).</li>
+<li>after enabling this test phone was restarted. After entering PIN it hanged,
+"Code accepted" was displayed and it squeaked. And the same problem
+was visible after each reset. User disabled netmonitor via cable.
+After it phone phone very often wasn't able to find network and user had
+to disable it. Solution was disconnecting battery for about 1 hour.
+Problems with finding
+network were visible during about next 2 weeks.</li>
+</ul>
+
+<p><a NAME="Menu18"></a><b>Test 18</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>This menu allows you to turn on constant backlight of the screen and keyboard
+(LIGHTS ON). This can be used for very fast battery discharging. We can also
+use it as a flashlight - for example to check a schedule, your location on a
+map, to be visible on the road :-), etc. But there is one condition:
+any of the NetMonitor tests must be visible on the screen.
+
+<p>If you turn this test on and then back off, the light will go out
+(it won't react on key presses) for several minutes (good for games -
+saves battery)...
+
+<p>The light can be also constantly enabled, if you connect a car kit
+(or simulate it - check <b><a href="faq_net5.htm#Menu75">test 75</a></b>)
+and "Light" setting (<b>Menu 2-5</b> in Nokia 5110) will be set to "All".
+This will work without NetMonitor (and any of its test) enabled!
+</td>
+</tr>
+</table>
+
+<p>Changes to this menu can be made by entering it directly.
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> LIGHTS <br>
+ aaa<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to <br>
+ toggle<br>
+ lights<br>
+ ON/OFF</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>
+<ul>
+<li>
+aaa - can be set to either "ON" or "OFF" (default)</li>
+</ul>
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt>
+LIGHTS aaa<p>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Control <br>
+Lights<br>Status
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p><a NAME="Menu19"></a><b>Test 19</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>Each operator before giving a new or repaired base station
+(<a href="faq_net1.htm#BTS">BTS</a>) for normal use, tests its cells.
+GSM phones read this information and avoid using these cells. However, using
+this menu, you can set your phone to use such cells, too
+(DISCARD option) - sometimes it allows you to "improve" the coverage and range of your
+network .
+
+<p>If you want your phone to use only such barred cells, just set this menu to
+REVERSE (but you won't be able to make or receive calls if there are no tested
+cells in your neighborhood - good phone lock ?).
+
+<p>ACCEPTED means that your phone uses only normal cells, which are allowed for use
+(it works like any other phone).
+</td>
+</tr>
+</table>
+
+<p>Information about cell status is broadcasted on <a href="faq_net2.htm#BCCH">BCCH</a>
+channel as a CELL_BARRED parameter value. The settings of this menu can be
+changed by entering it directly (but if you have previously enabled test in
+<b><a href="#Menu17">test 17</a></b>, current cell may have other status
+than the chosen here (for example: you chosen barred cells only, but the phone
+uses a normal one)).
+
+<p>New settings are applied during next signal quality measurements (you can
+advance this by making a call, forcing the phone to search for a network or
+by holding the antenna with fingers for certain amount of time).
+
+<p>Sometimes your phone may not be able to find cells with particular status
+- it will show parameters of the cells with such status belonging to other
+network (once I've set this menu to REVERSE and the phone started displaying
+data of barred cells in forbidden for my SIM card network, because there were
+no tested my home network cells in my neighborhood). Information about cell
+status can be found in <b><a href="faq_net2.htm#Menu1">test 1</a></b> to
+<b><a href="faq_net2.htm#Menu5">test 5</a></b>.
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt><nobr> CELL BARR <br>
+ ACCEPTED<br>
+ </nobr></tt></td>
+</tr>
+</table>
+
+<p>The phone works as any other GSM phone (default) - only normal cells
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt><nobr> CELL BARR <br>
+ REVERSE<br>
+ </nobr></tt></td>
+</tr>
+</table>
+
+<p>The phone uses only tested cells</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt><nobr> CELL BARR <br>
+ DISCARD<br>
+ </nobr></tt></td>
+</tr>
+</table>
+
+<p>The phone uses all existing cells (both normal and barred ones)</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><nobr><tt><b>Use menu to <br>
+toggle cell<br>
+barr status<br>
+DIS/ACC/REV</b></tt></nobr></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>In Nokia 2110i/2140:
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt><nobr>CELL<br>
+BARRING<br>
+ACCEPTED
+</nobr></tt></td>
+</tr>
+</table>
+
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt><nobr>CELL<br>BARRING<br>
+REVERSED </nobr></tt></td>
+</tr>
+</table>
+
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt><nobr>CELL<br>BARRING<br>
+DISCARDED </nobr></tt></td>
+</tr>
+</table>
+
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><nobr><tt><b>
+ DISCARD <br>
+ CELL<br>
+ BARRING
+</b></tt></nobr></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p><a NAME="Menu20"></a><b>Test 20</b>
+<br>Information about battery and phone charger mode
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaa bbbbb<br>
+Tccc ddd<br>
+Ceee Wfff<br>
+gggg hhhh</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>BatVol ChMod<br>
+BTemp ChTime<br>
+ChrgVol Pwm<br>
+ BTyp BFDC</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - battery voltage (V/100 - for instance 7.19V is displayed as 719).
+Range 0.00 - 9.99 V. When value decreases, your battery is more discharged
+- you have less standby/speech time to next charging...
+</li>
+
+<li>
+bbbbb - information about battery charging:
+
+<p>
+<ul>
+<li><tt>xxxxx</tt> - charger not connected or charging disabled</li>
+<li><tt>BatCk</tt> - checking battery charge level (after each
+<a href="faq_net1.htm#TCH">TCH</a> channel usage (a call) when charging NiMH battery)</li>
+<li><tt>BSIFa</tt> - charging interrupted (battery BSI
+(<b>B</b>attery <b>S</b>ize <b>I</b>ndicator: one of battery connectors connected
+with ground (BGND) to resistor inside battery - phone measure its
+opór and can read battery type))
+measurement failed)
+</li>
+<li><tt>CelBr</tt> - charging interrupted (one or more cells broken inside battery)</li>
+<li><tt>ChaCk</tt> - EM checks charger</li>
+<li><tt>Charg</tt> - charging</li>
+<li><tt>ColdC</tt> - charging a cold battery</li>
+<li><tt>ColdM</tt> - battery is cold, maintenance charging</li>
+<li><tt>CurFa</tt> - charging interrupted (charger current measurement failed)</li>
+<li><tt>DisCh</tt> - discharging</li>
+<li><tt>Faile</tt> - error</li>
+<li><tt>FastC</tt> - fast charging</li>
+<li><tt>FullM</tt> - battery full, maintenance charging</li>
+<li><tt>F_Che</tt> - checking fast charging process</li>
+<li><tt>HotM </tt> - battery is hot, maintenance charging</li>
+<li><tt>I_Che</tt> - initialization of charging parameters test (then the phone displays 'Charging')</li>
+<li><tt>InitC</tt> - charging process initialization</li>
+<li><tt>L_Che</tt> - checking parameters of LiIon battery charging</li>
+<li><tt>LiAFu</tt> - fff parameter (Pwm) level is higher than max limit for a full battery</li>
+<li><tt>LiDCH</tt> - DCH charging (some kind of maintenance charging ?) of LiION battery</li>
+<li><tt>LiFul</tt> - fff (Pwm) parameter exceeded the max limit for a full battery during given period of time</li>
+<li><tt>LiHot</tt> - charging hot (warm) LiION battery</li>
+<li><tt>LithC</tt> - charging LiION battery</li>
+<li><tt>LiTxO</tt> - charging LiION battery, transmitter active (connection in progress)</li>
+<li><tt>LNFTx</tt> - charging LiION battery (but the phone uses as much power, as it receives from charger), transmitter active (connection in progress)</li>
+<li><tt>M_Che</tt> - maintenance charging process test</li>
+<li><tt>MaBFD</tt> - maintenance charging (BFD)</li>
+<li><tt>Maint</tt> - maintenance charging</li>
+<li><tt>TmpFa</tt> - charging interrupted (phone's wasn't able to read natê¿enie
+of resistor NTC inside battery connected to BTEMP and BGND battery connectors
+and wasn't able to calculate battery temperature)</li>
+<li><tt>TxNoF</tt> - charging NiMH battery (but the phone uses as much power, as it receives from charger), transmitter active (connection in progress)</li>
+<li><tt>TxOnC</tt> - charging NiMH battery, transmitter active (connection in progress)</li>
+<li><tt>VolFa</tt> - charging interrupted (error checking voltage from charger)</li>
+</ul>
+<p>
+</li>
+
+<li>
+ccc - battery temperature (for example T+27 means +27 degrees centigrade).
+Sometimes (when the phone was turned off and not used for a long time
+(no connections, low power consumption), this parameter can match outdoor
+temperature (so you will have a thermometer). If you need a temperature in
+Fahrenheit degrees, you can use following formula: F = 32 + 9C/5
+(where F and C are Fahrenheit and Celsius degrees). The temperature of LiION
+battery is also given in <b><a href="#Menu23">test 23</a></b>.</li>
+
+<li>
+ddd - charging time in hours (first digit) and minutes (2 last digits).
+This counter is cleared when charging process begins (but not always -
+it doesn't happen if:
+
+<p>
+<ul>
+<li>
+previous charging process wasn't complete
+</li>
+
+<li>
+mains parameters don't meet some requirements
+</li>
+</ul>
+
+<p>I have also experienced that Nokia 6110 doesn't clear this counter after
+changing the battery (for example from LiION to NiMH). It continues after
+connecting the charger and stops when the battery is full or when you
+disconnect the charger.
+</li>
+
+<li>
+eee - charging voltage (V/100). The battery isn't charged with a direct
+current, but with a pulse current (this indicator constantly changes).
+Range 0.0 - 18.7 V. When charging is complete, maintenance charging begins.
+</li>
+
+<li>
+fff - Charge control output (decimal - range 000 - 255)</li>
+
+<li>
+ggg - capacity of the battery in mAh (some English descriptions and
+NetMonitor help in Nokia 3110 write, that it's BSI battery multiplied by 4):
+in case of LiION battery you will find here the same value as on battery casing
+in NiMH batteries this value can differ even by 200 mAh and change depending
+on the temperature (it it connected with battery's memory effect ?).
+Unfortunately, it doesn't change always immedietaly after changing battery...
+See also question
+<a href=faq_net6.htm#41>Netmonitor shows different battery capacity than info on it...</a>
+</li>
+
+<li>
+hhhh - this counter lets us calculate remaining charging time: when charging
+current is less than predefined limit, this timer will be started.
+If timer reaches 0, charging will be stopped (it should be according to
+some English descriptions, but I observed it very rarely).
+</li>
+</ul>
+
+<p>In Nokia 3110 this menu looks as follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaa bbbbb<br>
+ Tccc ddd<br>
+ Ceee Wfff<br>
+w gggg hhhh z</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>BatVol ChMode<br>
+BTemp ChrTime<br>
+ChrgVol Pwm<br>
+S 4BSI BFDC B</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+bbbbb - in N3110 this field can additionally contain NOTCH (no charging)</li>
+</ul>
+
+<p>In Nokia 9110 this menu looks as follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaa bbbbbb<br>
+Tccc ddd<br>
+i Ceee Wfff<br>
+ gggg hhhh</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>BatVol ChMod<br>
+BTemp ChTime<br>
+ChrgVol Pwm<br>
+BTyp BFDC</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+i - information, whether travel charger is connected (1) or not (0)</li>
+</ul>
+
+<p>Fast charging (FastC in NetMonitor) means charging with bigger current
+and with clever charger it doesn't damage your battery.
+
+<p>When battery charging is ended, maintenance charging starts
+(it's normal, that phone uses some energy and battery's discharging process
+starts; still connected charger can complete energy losses).
+
+<p>In Polish version of this manual you can also find links to some pages
+in Polish language explaining some topics connected with charging and batteries.
+
+<p>For curious people: some of the data, which are displayed here, can also be
+found in Nokia service programs (like WinTesla - menu "Testing" / "ADC Readings...").
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>This test allows us to check the charger. You can also verify some of the battery parameters like:
+<ul>
+<li>
+capacity</li>
+
+<li>
+efficiency (of the battery cells)</li>
+
+<li>
+voltage (if you are - say - on a trip, here you can check whether battery voltage is suitable for your flashlight)</li>
+</ul>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu21"></a><b>Test 21</b>
+<br>Charging parameters (I noticed, that these values are correct only after
+making a call while charging - they change only then (after ending call display
+last registred values))
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb <br>
+ ccc ddd<br>
+ eee fff<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>MTDif MPDif<br>
+BUpV BDownV<br>
+AverV SumMF<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - difference between measured and required charging voltage</li>
+
+<li>
+bbbb - difference between measured voltage and the result of the
+previous measurement, fraction is not displayed</li>
+
+<li>
+ccc - the highest measured voltage in battery (with charging battery and
+using it in the same time it can change)
+</li>
+
+<li>
+ddd - the lowest measured voltage in battery</li>
+
+<li>
+eee - average voltage</li>
+
+<li>
+fff - the sum of the parameters from <b><a href="#Menu22">test 22</a></b>
+(range 0.00 - 9.99, for example 1.53 is displayed as 153) - my own observations
+show, that DerivCount (Eaaa) parameter is not counted here. If this counter
+reaches 1.00 or 0.99, 'Battery full' message is displayed and bar indicator
+on the right side of the display stops.
+</li>
+</ul>
+
+<p><a NAME="Menu22"></a><b>Test 22</b>
+<br>Charging parameters and indicators
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> Eaaa Cbbb <br>
+ Dccc Rddd <br>
+ Ieee Afff <br>
+ Tggg Vhhh</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>DeriC ChAm<br>
+ VDif VDrop <br>
+ VDTi AvDif<br>
+ Temp Volt</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaa - DerivCount</li>
+<li>bbb - ChargeAmount</li>
+<li>ccc - VolDiffToMax</li>
+<li>ddd - VolDropCnt</li>
+<li>eee - VolDiffTime</li>
+<li>fff - AverDiff</li>
+<li>ggg - temperature</li>
+<li>hhh - voltage</li>
+</ul>
+
+<p>Here you can find several charging parameters and indicators.
+All these fields (except for DerivCount) range is from 0.00 to 1.00
+(dot is not shown - for example 0.23 is displayed as 023). After disconnecting
+the charger these fields can contain various values. Letters E, C, D, R, I,
+A, T and V are displayed when the number is shorter than four digits.
+
+<p>I received info, that in some (all ?) Nokia 6150 phones with firmware 4.13
+(LiION battery) there are ALWAYS displayed these values (is it bug in this
+version of firmware ?):
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ E251 C254 <br>
+ 6399 6896<br>
+ I255 A256<br>
+ 1024 8447</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu23"></a><b>Test 23</b>
+<br>Information about the battery
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb<br>
+ cccc dddd<br>
+eee fff gggg<br>
+hhh iiiijjjj</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>TxOn TxOff<br>
+ChCur Stdby<br>
+Age CAP Curr<br>
+Tmp CmAhTarg</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - voltage from the battery when transmitter is active (a.aaa mV)</li>
+
+<li>
+bbbb - voltage from the battery when transmitter is inactive (b.bbb mV)</li>
+
+<li>
+cccc - charging current (c.ccc mA). If the charger is not connected, 0 is shown.
+In Nokia 3210 ALWAYS equal 0 (I think, that firmware in this model has some bug).</li>
+
+<li>
+dddd - expected voltage from the battery in standby mode (d.ddd mV). You can
+check whether your SIM card 's clock can be stopped in
+<b><a href="faq_net4.htm#Menu51">test 51</a></b>.</li>
+
+<li>
+eee - estimate battery age (0 - new, 100 - old) for LiION batteries (the
+value of this counter is probably based on measurements of work/discharging
+time of the battery and its capacity (shown in <b><a href="#Menu20">test 20</a></b>);
+this is only a reference!) or 33 for NiMH batteries.</li>
+
+<li>
+fff - battery charge level in percent (in older phones, like Nokia 5110,
+25 - 1 bar, 50 - 2 bars, 75 - 3, 100 - 4 bars on
+the right side of the screen; in never, like Nokia 6210 - 100 - 6 bars,
+80 - 4 bars, 60 - 3 bars, 40 - 2 bars, 20 - 1 bar).
+This indicator (and parameter) is very
+inaccurate during charging process (it reaches 100 almost immediately) -
+better use ii and jjj parameters then.
+</li>
+
+<li>
+gggg - temporary power consumption indicated by PSM (according to some
+English descriptions in decimal parts of mA; I think that this field shows
+values in mA - see on calculation of approximate battery work time below)
+</li>
+
+<li>
+hhh - LiION battery temperature (also shown in <b><a href="#Menu20">test 20</a></b>
+- sometimes both these indicators are different) or 0 (for NiMH battery)
+</li>
+
+<li>
+iiii - how many mAh were "loaded" to the battery until now. If it is approximately
+equal to jjj, the latter parameter raises (or charging is complete). This parameter
+is cleared after each use of <a href="faq_net1.htm#TCH">TCH</a> channel
+(for example: after a call) while charging (with NiMH battery) - you can use
+this tip to extend charging time almost ad infinitum. I noticed it with Nokia 6110
+and LiION battery (when I turned off and on phone during charging process) too.
+This value is updated every 14 seconds (Nokia 5110 with standard charger).
+</li>
+
+<li>
+jjjj - battery capacity value (in mAh) by which next charging stage is complete
+(see description of the previous parameter). I noticed, that it's cleared
+during LiION battery charging (when I turned off and on phone during charging
+process) in Nokia 6110.
+</li>
+</ul>
+
+<p>For curious: some of the data, which are displayed here, can also be found
+in Nokia service programs (like WinTesla - menu "Testing" / "ADC Readings...").
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>Here you can check your battery type (LiION or NiMH).
+</td>
+</tr>
+</table>
+
+<p>Approximate power consumption (this can be changed and modified by many other factors) while using individual channels
+(Nokia 5xxx and 6xxx):
+
+<p>
+<ul>
+<li>
+during transmission (TX parameter value - phone transmission power - can be
+checked in <b><a href="faq_net2.htm#Menu1">test 1</a></b>) - using
+<a href="faq_net2.htm#SDCC">SDCC</a> and <a href="faq_net2.htm#TFR">TFR</a> channels (Nokia 6110):
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td>TX</td><td>power consumption (gg parameter)</td></tr>
+<tr ALIGN=CENTER><td>over 19</td><td>92</td></tr>
+<tr ALIGN=CENTER><td>16-18</td><td>99</td></tr>
+<tr ALIGN=CENTER><td>14-15</td><td>105</td></tr>
+<tr ALIGN=CENTER><td>13</td><td>114</td></tr>
+<tr ALIGN=CENTER><td>12</td><td>123</td></tr>
+<tr ALIGN=CENTER><td>11</td><td>136</td></tr>
+<tr ALIGN=CENTER><td>10</td><td>151</td></tr>
+<tr ALIGN=CENTER><td>9</td><td>173</td></tr>
+<tr ALIGN=CENTER><td>8</td><td>198</td></tr>
+<tr ALIGN=CENTER><td>7</td><td>232</td></tr>
+<tr ALIGN=CENTER><td>6</td><td>269</td></tr>
+<tr ALIGN=CENTER><td>5</td><td>300</td></tr>
+</table>
+
+<p>Conclusion: battery work time depends in a very high degree on the network
+parameters (most advertising materials contain standby time measured for the
+phone transmitting with lowest power (highest TX)).
+</li>
+
+<li>
+<a href="faq_net2.htm#AGCH">AGCH</a>: 310 mA in Nokia 5110 and 6110</li>
+
+<li>
+<a href="faq_net2.htm#CCCH">CCCH</a> i <a href="faq_net2.htm#CBCH">CBCH</a>:
+Nokia 6110 phones with older software (like 4.73) show 20 and 34 accordingly.
+I don't know whether this is caused by some bug in their firmware (these values
+are most probably given in mA/10) or the power consumption is really that high
+(because Nokia 5130 shows 34 too).
+Anyway, I checked, that Nokia 5110 (and 6110 v5.31) phones display 3 mA while
+using <a href="faq_net2.htm#CCCH">CCCH</a> channel. I think that turning off
+"cell broadcasting" (if it is not supported by your network) can be very
+"profitable" for your phone (longer standby time etc.) - look
+<a href="faq_net2.htm#Wylacz504">here</a>). When the phone collects
+<a href="faq_net1.htm#BTS">BTS</a> identification data
+(for <a href="faq_net1.htm#BTS">BTS</a>, which will be now used - has stronger
+signal than previous - see <a href="faq_net1.htm#C2"><b>C2</b> description</a>
+for details), this value changes to 220 mA (but only for a short while).
+</li>
+
+<li>
+<a href="faq_net2.htm#NSPS">NSPS</a>: 55 in both Nokia 5110 and 6110 (is this value
+in mA or in mA/10 ?)
+</li>
+</ul>
+
+<p>Turning on backlight takes 90 mA more, and while charging another 17 mA should be added.
+
+<p>In Nokia 3210 these data are different for different person (does it depend on firmware version,
+frequency ?)
+
+<table border=1>
+<tr><td>standby</td><td>reading <a href="faq_net1.htm#BTS">BTS</a> identification data</td><td>turning on backlight</td></tr>
+<tr><td>52 mA</td><td>90 mA</td><td>+155 mA</td></tr> <!-- 4.43 Era, Idea bez cellinfo -->
+<tr><td>8 or 9 mA</td><td>?</td><td>+159 or +160 mA</td></tr> <!-- Idea 1800 -->
+<tr><td>53, sometimes (rarely, during short time) 8 mA</td><td>93 mA</td><td>+158 or +159 mA</td></tr> <!-- +GSM 900 mHz -->
+<tr><td>8 mA</td><td>?</td><td>+154 mA</td></tr></table> <!-- Idea 1800 mHz, Plus 900 -->
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>If you know the power consumption, you can calculate approximate battery work time:
+<ul>
+<li>
+900 mAh / 225 mA = 4 hours of talk time (on average)</li>
+
+<br>Please note, that when using <a href="faq_net2.htm#SDCC">SDCC</a> channel
+the phone initially uses full power and the gradually reduces it.
+
+<li>
+900 mAh / 5,45 mA = 165 hours of standby time (on average)</li>
+
+<br>Remember, that the phone makes <a href="faq_net1.htm#PLU">PLU</a> even in standby mode.
+</ul>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu24"></a><b>Test 24</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+3476 3481<br>
+BSI: 551<br>
+ET: 9<br>
+ 111 1</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>V_inst V_avg<br>
+BSI value<br>
+Elapsed time<br>
+RST_m RST_h</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>This is probably meaning of these parameters:
+
+<p>
+<ul>
+<li>bbbb - (Voltage average ?) average value of voltage from battery ?</li>
+<li>ccc - (Battery Size Indicator) info connected with battery</li>
+<li>dddd - how many minutes phone work from enabling ? (minutes)</li>
+<li>eeee - (Rest Standby Time minutes ?)
+does phone estimate here, how long phone can be in standby up to
+next charging ? (minutes)</li>
+<li>ffff - (Rest Standby Time hours ?)
+does phone estimate here, how long phone can be in standby up to
+next charging ? (hours)</li>
+</ul>
+
+<p><a NAME="Menu25"></a><b>Test 25</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ 0 1<br>
+10059<br>
+ 5664 641<br>
+ 1 0
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Chrgtp #Bars<br>
+alpha<br>
+zeta phi<br>
+noblw nobcr
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<br>
+<a class="shref" href="#Top"><small><em>Back to the top</em></small></a><br>
+
+<center>
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><b>[Part 4]</b><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wiacek<Marcin-Wiacek@topnet.pl>">Marcin Wiacek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Last modification: 5 January 2002</font>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta name="Author" content="Marcin Wiacek">
+ <meta name="Description" content="NOKIA NetMonitor description (English version)">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="language" content="us">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, Marcin, Wiacek, Marcin Wiacek">
+ <title>NetMonitor in Nokia phones (5/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<font class="drukuj">
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+</font>
+<center><font color="#1F409F" size=+2 class="tytul">NetMonitor in Nokia phones (5/7)</font>
+<font class="drukuj">
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><b>[Part 5]</b><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</font>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+<a NAME="Top"></a>
+
+<font class="drukuj">
+<ol>
+<li><a href="faq_net0.htm#1"><b>What is it ?</b></a></li>
+<li><a href="faq_net0.htm#2"><b>Do I need it ?</b></a></li>
+<li><a href="faq_net0.htm#3"><b>Does my phone use more power with NetMonitor enabled ?</b></a></li>
+<li><a href="faq_net0.htm#4"><b>How to activate it ?</b></a></li>
+<li><a href="faq_net0.htm#5"><b>Which NetMonitor version can be activated in my phone ?</b></a></li>
+<li><a href="faq_net0.htm#6"><b>Does NetMonitor activation void warranty ?</b></a></li>
+<li><a href="faq_net0.htm#7"><b>NetMonitor menu in my phone has different number than 10. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#8"><b>NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#9"><b>How to use it ?</b></a></li>
+<li><a href="faq_net0.htm#10"><b>Can I damage my phone ?</b></a></li>
+<li><a href="faq_net1.htm#11"><b>Glossary</b></a></li>
+<li><a href="faq_net2.htm#12"><b>Description of the individual tests</b></a></li>
+<li><a href="faq_net6.htm#13"><b>You can also use a program...</b></a></li>
+<li><a href="faq_net6.htm#14"><b>Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</b></a></li>
+<li><a href="faq_net6.htm#15"><b>How can I disable NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#16"><b>Do I need to disable NetMonitor before sending my phone to the service ?</b></a></li>
+<li><a href="faq_net6.htm#17"><b>Is it possible to re-activate NetMonitor after disabling it ?</b></a></li>
+<li><a href="faq_net6.htm#18"><b>Is NetMonitor available in analog Nokia phones ?</b></a></li>
+<li><a href="faq_net6.htm#19"><b>Does NetMonitor allow to use phone like broadcast station ?</b></a></li>
+<li><a href="faq_net6.htm#20"><b>I don't have all described tests in my phone. Why ? Can I increase their number ?</b></a></li>
+<li><a href="faq_net6.htm#21"><b>Does NetMonitor allow to identify place, where is my interlocutor ?</b></a></li>
+<li><a href="faq_net6.htm#22"><b>Does NetMonitor allow to identify place, where am I ?</b></a></li>
+<li><a href="faq_net6.htm#23"><b>What are NetMonitor codes ?</b></a></li>
+<li><a href="faq_net6.htm#24"><b>Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</b></a></li>
+<li><a href="faq_net6.htm#25"><b>Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</b></a></li>
+<li><a href="faq_net6.htm#26"><b>I have non existing networks on the list of forbidden networks...</b></a></li>
+<li><a href="faq_net6.htm#27"><b>How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</b></a></li>
+<li><a href="faq_net6.htm#28"><b>Can I use DLR-2/DLR-3 cables for activating netmonitor ?</b></a></li>
+<li><a href="faq_net6.htm#29"><b>Can I activate netmonitor using Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="faq_net6.htm#30"><b>Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</b></a></li>
+<li><a href="faq_net6.htm#31"><b>How to change settings in tests ?</b></a></li>
+<li><a href="faq_net6.htm#32"><b>My phone has very short snandby time - it is possible to see the reason of it ?</b></a></li>
+<li><a href="faq_net6.htm#33"><b>Is netmonitor available in English version only ?</b></a></li>
+<li><a href="faq_net6.htm#Literatura"><b>Information sources</b></a></li>
+<li><a href="faq_net6.htm#35"><b>Additional information</b></a></li>
+<li><a href="faq_net6.htm#36"><b>Does using/activating netmonitor cost anything ?</b></a></li>
+<li><a href="faq_net6.htm#37"><b>Does using netmonitor is legall ?</b></a></li>
+<li><a href="faq_net6.htm#38"><b>Which entries on SIM card are used in netmonitor tests ?</b></a></li>
+<li><a href="faq_net6.htm#39"><b>Can I activate netmonitor in 3310 using soft working with 3210 ?</b></a></li>
+<li><a href="faq_net6.htm#40"><b>After activating netmonitor/BTS TEST my phone can't find network...</b></a></li>
+<li><a href="faq_net6.htm#41"><b>Netmonitor shows different battery capacity than info on it...</b></a></li>
+</ol>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<p><a NAME="Menu30"></a><b>Test 30</b>
+<br>Audio API register display
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb<br>
+ cccc dddd<br>
+ eeee ffff<br>
+ gggg hhhh </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>A1Cnf A2Cnf<br>
+ ST AU3<br>
+1Tone 2Tone<br>
+ Conf HFVol</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaa - API_AUD1_CTRL</li>
+<li>bbbb - API_AUD2_CTRL</li>
+<li>cccc - API_SIDETONE</li>
+<li>dddd - API_AU3</li>
+<li>eeee and ffff - API_1_TONE and API_2_TONE (see description below)</li>
+
+<li>
+gggg - API_CONFIG: connected with sound setting from
+<b><a href="faq_net5.htm#Menu71_72">test 71 and 72</a></b>:
+you will see here number (hexadecimal),
+which was displayed there below AUDIO ENHANCEMENT (in last selected menu).
+Here are some examples:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td><b>normally (for example during standby)</b></td><td><b>wybieranie numeru</b></td><td><b>call</b></td></tr>
+<tr ALIGN=CENTER><td>5148 (cracks) - 20808 decimal</td><td>5149</td><td>5140</td></tr>
+<tr ALIGN=CENTER><td>851A - 34074 decimal</td><td>851B</td><td>8512</td></tr>
+<tr ALIGN=CENTER><td>C6A4 (cracks) - 50852 decimal</td><td>C6AD</td><td>C6A4</td></tr>
+<tr ALIGN=CENTER><td>DB34 (cracks) - 56116 decimal</td><td>DB3D</td><td>DB34</td></tr>
+<tr ALIGN=CENTER><td>DF29 (after enabling phone) - 57129 decimal</td><td>DF29</td><td>DF20</td></tr>
+<tr ALIGN=CENTER><td>F436 - 62518 decimal</td><td>F43F</td><td>F436</td></tr>
+<tr ALIGN=CENTER><td>F437 - 62519 decimal</td><td>F43F</td><td>F436</td>
+</tr>
+</table>
+<p>
+</li>
+
+<li>
+<p>hhhh - API_HF_VOL: volume during call - you will count it from
+the "110 - hhhh" formula (subtract value of this parameter from 110).
+It's displayed too (during call only) in
+<b><a href="faq_net5.htm#Menu76">test 76</a></b>.
+When you connect headset, values here change - volume can be count
+from "510 - hhhh" formula then (for car kit use "2210 - hhhh").
+Type of connected audio accesories can be checked in
+<a href="faq_net5.htm#Menu75"><b>test 75</b></a> too.
+Phone remembers volume for each audio accesory separately.
+</li>
+</ul>
+
+<p>When you press any key, phone generates sound, which consist of two tones.
+Parameters eeee and ffff change then. First tone is short, second is emited
+all time, when you press key. When you press C, NaviKey, Up or Down
+keys, change parameter eeee only (value 0E10 - 3600 decimal) -
+sound consist of one tone only. And now the most important thing:
+you will divide displayed in these parameters values by 4,
+you will have frequencies in Hz conncected with pressing adequate keys in
+DTMF (<b>D</b>ual <b>T</b>one <b>M</b>ulti <b>F</b>requency) system.
+I think, you use DTMF very often - it's used in tone system in all
+modern phones during calling number. Adequate values are in table (decimal)
+- parameter eeee is connected with vertical values, ffff with horizontal:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td></td><td>1209 Hz</td><td>1336 Hz</td><td>1477 Hz</td></tr>
+<tr ALIGN=CENTER><td>697 Hz</td><td>1</td><td>2</td><td>3</td></tr>
+<tr ALIGN=CENTER><td>770 Hz</td><td>4</td><td>5</td><td>6</td></tr>
+<tr ALIGN=CENTER><td>852 Hz</td><td>7</td><td>8</td><td>9</td></tr>
+<tr ALIGN=CENTER><td>941 Hz</td><td>#</td><td>0</td><td>*</td></tr>
+</table>
+
+<p><a NAME="Menu32"></a><b>Test 32</b>
+
+<p>Test from Nokia 6250 (no help):
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ 0 <br>
+0002922<br>
+3000<br>
+0205714
+</i></tt></td>
+</tr>
+</table>
+
+<p>In 4'th line there is clock. Example:
+0205714 means 20 hours 57 minutes 14 seconds of the day ...
+
+<p><a NAME="Menu34"></a><b>Test 34</b>
+<br>Information about FBUS connection between phone and computer.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aa bb cc dd<br>
+eee fff ggg<br>
+hhh iii jjj <br>
+k</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CM LD LM NM <br>
+PEC FEC OEC<br>
+ACC RXS TXS <br>
+Mod</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aa - current fbus media in hex</li>
+<li>bb - last sender dev in hex</li>
+<li>cc - last sender media in hex</li>
+<li>dd - next media to be connected. Same as aa if the connection is not pending</li>
+<li>eee - fbus parity error counter</li>
+<li>fff - fbus framing error counter</li>
+<li>ggg - fbus overrun error counter</li>
+<li>hhh - fbus alive check counter</li>
+<li>iii - received sequence number</li>
+<li>jjj - sent sequence number</li>
+<li>k - phone mode: S=slave, H=host</li>
+</ul>
+
+<p>Description above is from some English documents. As you can see in some phones
+(like Nokia 5110) values in this test looks rather different, but help is the same.
+But, when you make connection with FBUS cable and make transmission, first line of values
+in this test changes to "1E0C1E -". When you will look into some
+<a href="faq_net6.htm#25">FBUS protocol descriptions</a>,
+you will see, that:
+
+<ul>
+<li>"1E" could mean datas send with <a href="faq_net6.htm#25">FBUS protocol</a> over cable</li>
+<li>"0C" could mean, that FBUS cable is connected to phone</li>
+</ul>
+
+<p>and it's the truth. So, it means, that this description is real (even, that
+test looks a little different).
+
+<p>Observation from Nokia 6150:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aabbccdd <br>
+eeffgghh i j<br>
+kk<br>
+l-m</tt></td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aabbcc:
+<ul>
+<li>000000 - no transmission after enabling phone</li>
+<li>1E0C1E - there was FBUS transmission</li>
+<li>140000 - there was infrared connection using NBS (business card, calendar entry, etc.)</li>
+<li>1C7F1C - there was 2-players snake game (host)</li>
+<li>1C001C - there was 2-players snake game (slave)</li>
+</ul>
+</li>
+<li>hh: 0 - no infrared transmission in this moment</li>
+<li>i: increases for example after each sending data using infrared and NBS or ending
+transmission</li>
+<li>j: P - infrared enabled, searching next device (blinking indicator in phone)</li>
+<li>l: H - host in infrared transmission; S - slave in infrared transmission</li>
+<li>m: T - infrared enabled, connection terminated (blinking indicator in phone)</li>
+</ul>
+
+<p>In Nokia 9110 this menu looks different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>ll mm nn oo <br>
+ee ff gg<br>
+p q<br>
+r s tt</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>PA RS DR PR <br>
+PE FE OE<br>
+Rx Tx<br>
+D U DC</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+p and q are probably iii and jjj</li>
+</ul>
+
+<p>Links to pages with FBUS (MBUS) protocol are in the <a href="faq_net6.htm#25">question 25</a>.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>If values in this test changed after enabling phone, it means, that
+it was connected to computer and datas were transmitted with
+<a href="faq_net6.htm#25">FBUS protocol</a> (not MBUS).</td>
+</tr>
+</table>
+
+<p><a NAME="Menu35"></a><b>Test 35</b>
+<br>Reason of last reboting internal firmware of phone.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaaa <br>
+ bbbbbbbb<p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Reset reason<br>
+Task name<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aa - reason:
+
+<p>
+<ul>
+<li>NORM: probably normal power up</li>
+<li>UNKNO: default value, reset reason is unknown</li>
+<li>SWSIM: SIM contact failure reset. Shown, when phone has simlock and wrong mastercode was entered.</li>
+<li>STACK: task stack overflow</li>
+<li>SWIDL: idle task not running reset</li>
+<li>HW lub WD: <a href="faq_net1.htm#ASIC">ASIC</a> watchdog timeout. SW WD in Nokia 3310 ?</li>
+<li>SWDSP: restart <a href="faq_net1.htm#DSP">DSP</a> recovery reset</li>
+</ul>
+<p>
+</li>
+
+<li>
+bbbbbbbb - name of running task before reset (for example,
+<nobr>"AUD TASK"</nobr>,
+<nobr>"CC TASK"</nobr> (confirmed),
+<nobr>"DDI TASK"</nobr>,
+<nobr>"DEV IO"</nobr> (confirmed),
+<nobr>"EM TASK"</nobr>,
+"FBUSTASK" (confirmed - after errors in cable transmission),
+<nobr>"L1 CONTR"</nobr>,
+<nobr>"L1 MEAS"</nobr>,
+<nobr>"L1 SYSPA"</nobr> (confirmed),
+<nobr>"L2 TASK"</nobr>,
+"LOCAL" (confirmed - shown, for example, when phone had to restart because of error in firmware),
+<nobr>"MDI RECE"</nobr> (confirmed),
+<nobr>"MDI SEND"</nobr> (confirmed),
+<nobr>"MM TASK"</nobr> (confirmed),
+<nobr>"OS IDLE"</nobr> (confirmed),
+<nobr>"PN TASK"</nobr> (confirmed),
+<nobr>"RR TASK"</nobr> (confirmed),
+<nobr>"RM TASK"</nobr>,
+<nobr>"SIM L2"</nobr> (confirmed),
+<nobr>"SIM UPL"</nobr> (confirmed),
+<nobr>"SMS TASK"</nobr> (confirmed),
+"TONETASK",
+<nobr>"UI TASK"</nobr> (confirmed)
+<nobr>"PND TASK"</nobr> (for example Nokia 6210),
+"WMLSTASK" (for example Nokia 6210),
+"IRDATASK" (for example Nokia 6210),
+<nobr>"IRDA MGR"</nobr> (for example Nokia 6210),
+<nobr>"PH TASK"</nobr> (for example Nokia 6210),
+<nobr>"DGC TASK"</nobr> (for example Nokia 6210),
+<nobr>"DGNTB TA"</nobr> (for example Nokia 6210),
+<nobr>"DGFAX TA"</nobr> (for example Nokia 6210),
+<nobr>"SCKT SRV"</nobr> (for example Nokia 6210),
+<nobr>"PMM CLUP"</nobr> (for example Nokia 6210),
+<nobr>"PMM WRBA"</nobr> (for example Nokia 6210),
+<nobr>"ND TASK"</nobr> (for example Nokia 6210),
+<nobr>"PPC TASK"</nobr> (for example Nokia 6210),
+<nobr>"No task!"</nobr> (for example Nokia 6210)
+or "UNKNOWN" (confirmed - after normal phone enabling)). We can notice, that tasks names are similiar to
+names in help to <a href="faq_net5.htm#Menu84_86">tests 84-86</a>.</li>
+</ul>
+
+<p><a NAME="Menu36"></a><b>Test 36</b>
+<br>Reasons of last reboting internal firmware of phone (you will
+find here information, how many times phone made restarts because of reasons
+from previous test).
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aa bb cc <br>
+ dd ee ff<p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> UN WD DSP <br>
+SIM IDL STK<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aa - unknown resets</li>
+
+<li>bb - <a href="faq_net1.htm#ASIC">ASIC</a> watchdog timeout resets (in some
+you can simulate it - see <a href="faq_net0.htm#9">question 9</a> for details)</li>
+
+<li>cc - <a href="faq_net1.htm#DSP">DSP</a> recovery resets. In Nokia 3310 displayed also
+in <a href=faq_net6.htm#Menu130>test 130</a>.</li>
+
+<li>
+dd - some English descriptions say, that it's connected with
+SIM contact failure reset (in some phones you can force reset because of this reason
+- see <a href="faq_net0.htm#9">question 9</a>). I noticed too, that this counter
+increases when to try to enter mastercode connected with simlock level 1
+using <b>#pw+2222222222+1#</b> code (where mastercode is instead of 2222222222), when
+your phone has simlock.
+</li>
+
+<li>ee - idle task not running resets</li>
+
+<li>ff - task stack overflow resets</li>
+</ul>
+
+<p>Counters are stored to EEPROM.
+
+<p>In Nokia 3310 some counters (DSP only ?) are displayed from end (for example, 01 is displayed as 10,
+02 as 20, etc.)
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>You can reset counters from this menu using some Nokia service programs
+- for example, in Pc-Locals 1.3 enter to menu 8 ("Event Trace"),
+menu 5 ("Permanent Counter Table...") and press F6 key ("Clear Counters").
+Unfortunatelly :(, "real" counters connected with mastercode entering attempts
+(Counter for example in WinTesla and WinLock) don't reset then...
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu38"></a><b>Test 38</b>
+<br>Memory dump
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaaaaaaaaa<br>
+aaaaaaaaaaaa<br>
+aaaaaaaaaaaa<br>
+aaaaaaaaaaaa</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Memory dump <br>
+ <p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaa.... - hex dump of 24 successive memory locations</li>
+</ul>
+
+<p>The start address of the dump is entered as 6 digit address value
+into location 30 into phonebook on SIM card (information, how to make it,
+are in <b><a href="faq_net3.htm#Menu17">test 17</a></b>).
+An example: for address 0x0C89AB enter 0C2089AB value there...
+Dump address is changed only when you directly enter to this menu.
+
+<p>This display rather is not included in offcial firmware (I found only one
+phone with it). It can be switched on by defining flag DEV_FT_MEMORY_DUMP_IN_USE in ftd_conf.h.
+
+<p><a NAME="Menu39"></a><b>Test 39</b>
+<br>Reason of last connection end (asterisk means, that the diagnosis won't be sent to the
+network - it'll be only shown in phone) and making
+<a href="faq_net1.htm#LocationUpdate">Location Update</a>:
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> CC: aaa <br>
+ MM: bbb<br>
+ RR: ccc<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CC CauseValu<br>
+MM CauseValu<br>
+RR CauseValu<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+reason from the CallControl-Layer - it's displayed in
+<b><a href="faq_net2.htm#Menu2">test 2</a></b> and
+<b><a href="faq_net5.htm#Menu63">test 63</a></b> too:
+
+<p>
+<ol>
+<li>
+from the GSM specifications (section 10.5.4.11/GSM 04.08):
+
+<p>
+<ul>
+<li>
+<tt> 1</tt>: unassigned (unallocated) number</li>
+
+<li>
+<tt> 3</tt>: no route to destination</li>
+
+<li>
+<tt> 8</tt>: operator determined barring</li>
+
+<li>
+<tt>16</tt>: normal end of call (you were speaking or you heard some
+text - that dialled number was busy or something similiar)
+</li>
+
+<li>
+<tt>17</tt>: user busy
+
+<p>
+<ul>
+<li>
+if it was outgoing call, dialled number was busy (phone even displayed
+'Number busy')</li>
+
+<li>
+if it was incoming call, a man, who dialled to you, heard busy signal
+- you were speaking or you rejected it (in Nokia 5110 or 5130 to make
+it you have to press C key, in Nokia 6110, 6130 or 6150 red receiver)
+</li>
+</ul>
+<p>
+</li>
+
+<li>
+<tt>18</tt>: no user responding</li>
+
+<li>
+<tt>19</tt>: user alerting (from specification - I had it
+with normal connection too (phone displayed
+'No answer' ('Nie odpowiada')) or when incoming call was diverted to
+voice mailbox), no answer
+</li>
+
+<li>
+<tt>21</tt>: call rejected
+
+<p>
+<ul>
+<li>
+phone wasn't in network coverage (message 'No coverage network'), when you
+tried to make call
+</li>
+
+<li>
+you tried to call to non existing phone number or you heard busy signal
+</li>
+</ul>
+<p>
+</li>
+
+<li>
+<tt>22</tt>: number changed</li>
+
+<li>
+<tt>27</tt>: destination out of order</li>
+
+<li>
+<tt>28</tt>: invalid number format/number incomplete. Phone displayed
+'Invalid phone number'</li>
+
+<li>
+<tt>31</tt>: unspecidied. It seems, that with this error connection
+is end by network (for example, when it's overcharged).
+Shown sometimes too, when you call for not supported for some tariffs numbers.
+</li>
+
+<li>
+<tt>34</tt>: no circuit/channel available to make call. Phone displayed
+'Network busy'. I noticed too, that in my network RR value changed to
+1 with this error. More about situations, when network is busy, I write
+in <a href="faq_net1.htm#TS">TS description</a>.</li>
+
+<li>
+<tt>38</tt>: network out of order</li>
+
+<li>
+<tt>41</tt>: temporary failure</li>
+
+<li>
+<tt>42</tt>: switching equipment congestion
+(message "Network busy")
+</li>
+
+<li>
+<tt>44</tt>: requested channel not available</li>
+
+<li>
+<tt>47</tt>: ressource unavailable. I had it, when connection was "brutal" broken.
+Concrete: during call phone of my interlocutor disabled because of empty battery.
+My phone displayed 'Error in connection'</li>
+
+<li>
+<tt>50</tt>: requested facility not subscribed
+(you must subscribe it to use it)
+In some networks shown too, when you set not supported by network function
+(for example, "Own number sending" in Era-GSM network).
+Message "Check operator services".
+</li>
+
+<li>
+<tt>65</tt>: bearer service not implemented</li>
+
+<li>
+<tt>68</tt>: ACM equal to or greater than ACMmax</li>
+
+<li>
+<tt>69</tt>: requested facility not implemented</li>
+
+<li>
+<tt>88</tt>: incompatible destination</li>
+
+</ul>
+<p>
+</li>
+
+<li>
+from mine (and not only) experiences:
+
+<p>
+<ul>
+
+<li><tt> 28</tt>: I had it, when phone number was too long</li>
+
+<li><tt> 57</tt>: no asynchronous data transmission allowed (concrete:
+phone wasn't able to connect to WAP from this concrete SIM card)</li>
+
+<li><tt> 63</tt>: "Poza zasiêgiem sieci"</li>
+
+<li>
+<tt>79</tt>: error with message 'Check operator services'.
+You have it, when you enable ALS (<b>A</b>lternative <b>L</b>ine <b>S</b>ervice) function,
+don't have second number on SIM card, select it and try to make call
+</li>
+
+<li>
+<tt>111</tt>:'Error in connection'</li>
+
+</ul>
+<p>
+</ol>
+</li>
+</li>
+
+<li>
+reason from the MobilityManagement-Layer
+- it's shown in <b><a href="faq_net5.htm#Menu64">test 64</a></b> too.
+It's from GSM specification (section 10.5.3.6/GSM 04.08):
+
+<p>
+<ul>
+<li>
+<tt> 2</tt>: <a href="faq_net1.htm#IMSI">IMSI</a> unknown in <a href="faq_net1.htm#HLR">HLR</a>
+(SIM card not active in network)</li>
+
+<li>
+<tt> 3</tt>: illegal phone</li>
+
+<li>
+<tt> 4</tt>: <a href="faq_net1.htm#IMSI">IMSI</a> unknown in <a href="faq_net1.htm#VLR">VLR</a></li>
+
+<li>
+<tt> 5</tt>: phone's <a href="faq_net1.htm#IMEI">IMEI</a> was not accepted</li>
+
+<li>
+<tt> 6</tt>: illegal ME</li>
+
+<li>
+<tt>11</tt>: <a href="faq_net1.htm#PLMN">PLMN</a> not allowed (you tried to log into
+network, which doesn't have roaming convention with your home network - your phone
+displays 'No access', when you try to select it manually; I don't know only, if
+this code is displayed only, when this network is saved on forbidden list on SIM
+card (see <b><a href="faq_net2.htm#Menu6">test 6</a></b>)</li>
+
+<li>
+<tt>12</tt>: Location Area not allowed. You can check it in <b><a href="faq_net3.htm#Menu11">test 11</a></b>.</li>
+
+<li>
+<tt>13</tt>: roaming not allowed in this Location Area</li>
+
+<li>
+<tt>17</tt>: network failure</li>
+
+<li>
+<tt>22</tt>: network congestion</li>
+
+<li>
+<tt>32</tt>: service option not supported</li>
+
+<li>
+<tt>33</tt>: service option not subscribed</li>
+
+<li>
+<tt>34</tt>: service temporarily out of order</li>
+
+<li>
+<tt>38</tt>: call cannot be identified (call RE)<p></li>
+
+</ul>
+
+<li>
+reason from RadioRessourceManagement-Layer)
+- see GSM specifications: section 10.5.2.31/GSM 04.08:
+
+<p>
+<ul>
+<li>
+<tt> 0</tt>: normal release</li>
+
+<li>
+<tt> 1</tt>: unspecified</li>
+
+<li>
+<tt> 2</tt>: channel unacceptable</li>
+
+<li>
+<tt> 3</tt>: timer expired </li>
+
+<li>
+<tt> 4</tt>: no activity on the radio path</li>
+
+<li>
+<tt> 5</tt>: Pre-emptive release</li>
+
+<li>
+<tt> 8</tt>: <a href="#Handover">handover</a> impossible,
+<a href="faq_net2.htm#TA">TA</a> out of range</li>
+
+<li>
+<tt> 9</tt>: channel mode unacceptable</li>
+
+<li>
+<tt> 10</tt>: frequency not implemented</li>
+
+<li>
+<tt> 65</tt>: call already cleared</li>
+
+<li>
+<tt> 97</tt>: message type not compatible with protocol state</li>
+
+<li>
+<tt>101</tt>: no cell allocation available</li>
+
+<li>
+<tt>111</tt>: protocol error unspecified</li>
+</ul>
+</li>
+</ul>
+
+<p>When you will see "*" before third parameter from this test, it means
+(the most often), that call is in progress. Sometimes phone displays different
+values - I don't know their meaning :-(.
+
+<p>Values of counters are not saved in EEPROM. When phone makes another measure,
+doesn't reset them (changes only these values during next measure, which are connected
+with it; doesn't change the rest of them).
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>This test allows to find, why exactly your phone doesn't want to work
+- doesn't want to make calls.</td>
+</tr>
+</table>
+
+<p><a NAME="Menu40"></a><b>Test 40</b>
+<br>Resets <a href="#Handover">handover</a> counters (by direct enter)...
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> RESET<br>
+ HANDOVER <br>
+ COUNTERS<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Use menu <br>
+ to reset<br>
+ handover<br>
+ counters</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu41"></a><b>Test 41</b>
+<br>Information about <a href="#Handover">handover</a>
+
+<p><a NAME="Handover"></a>Handover - it's transfer of radio connection
+(between phone and cell) from one cell to another (without breaking call).
+It's made, when:
+
+<p>
+<ol>
+<li>
+new radio connecting will give better quality (it's parameters are all the time
+checked by phone and base station)
+</li>
+
+<li>
+when phone is between few cells and can use "new" cells for him
+(it frees some place for phones, which can use "old" cell only)
+</li>
+</ol>
+
+<p>When they're problems with transmission, decision about handover is made
+by phone (otherwise it's made by <a href="faq_net1.htm#BSC">BSC</a>).
+If you enabled using one channel by phone (<b><a href="faq_net3.htm#Menu17">test 17</a></b>),
+handovers are not made.
+
+<p>There are 4 types of handovers:
+
+<p>
+<ul>
+<li>
+<a NAME="Intra"></a><b>Intra cell - Intra <a href="faq_net1.htm#BSC">BSC</a>
+handover</b> (called <b>handoff</b> too): it's the smallest handover
+inside one cell. Receiver is "thrown over" from one channel to another
+(gennerally to another frequency inside one cell). Decision, if it should
+be done, is made by <a href="faq_net1.htm#BSC">BSC</a>.</li>
+
+<li>
+<b>Inter cell - Intra <a href="faq_net1.htm#BSC">BSC</a> handover</b>:
+receiver is moved from one cell to another. Decision about it
+is made by <a href="faq_net1.htm#BSC">BSC</a>. Connection with first cell
+is broken after moment, when connection with another is made (displacement
+between two <a href="faq_net1.htm#BTS">BTSes</a> inside one
+<a href="faq_net1.htm#BSC">BSC</a>).</li>
+
+<li>
+<b>Inter cell - Inter <a href="faq_net1.htm#BSC">BSC</a> handover</b>:
+displacement of connection between two cells, which are not served by
+the same <a href="faq_net1.htm#BSC">BSC</a>. In this case handover is moved
+by <a href="faq_net1.htm#MSC">MSC</a>, but decision about it made
+by first <a href="faq_net1.htm#BSC">BSC</a>. Connection with first
+<a href="faq_net1.htm#BSC">BSC</a> (and <a href="faq_net1.htm#BTS">BTS</a>)
+is broken before moment, when connection with another <a href="faq_net1.htm#BSC">BSC</a>
+(and <a href="faq_net1.htm#BTS">BTS</a>) is made.
+</li>
+
+<li>
+<b>Inter <a href="faq_net1.htm#MSC">MSC</a> handover</b>: receiver moves from
+cell served by <a href="faq_net1.htm#MSC">MSC</a>/<a href="faq_net1.htm#VLR">VLR</a>
+to another controlled by another <a href="faq_net1.htm#MSC">MSC</a>/<a href="faq_net1.htm#VLR">VLR</a>.
+It's more complicated situation. We can notice, that
+<a href="faq_net1.htm#MSC">MSC</a> is connected to GSMc over PSTN.
+In this case is visible, that another <a href="faq_net1.htm#MSC">MSC</a>
+can't receive information from first normally.
+
+<p>What will happen, when connection will be moved to target
+<a href="faq_net1.htm#MSC">MSC</a>/<a href="faq_net1.htm#VLR">VLR</a> ?
+
+<p>Because both <a href="faq_net1.htm#MSC">MSC</a> belongs to the same network,
+connection is kept. To move it from one to another <a href="faq_net1.htm#MSC">MSC</a>
+special number HON (HON=CC+NDC+SN, CC - country code, NDC - network code,
+SN - subscriber's number) must be generated. It's similiar to roaming number
+(it's connection between two <a href="faq_net1.htm#MSC">MSC</a> too). During
+handover between two <a href="faq_net1.htm#MSC">MSC</a> connection can't be
+broken (phone connection realised by network's subscriber).
+</li></ul>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>HandOOk: aaa<br>
+PrevCh : bbb<br>
+HONotOK: ccc<br>
+HOIntra: ddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>HandOvOKCntr<br>
+PrevChanCntr<br>
+HandOvNOKCnt<br>
+HOIntraOKCnt</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - counter for successful <a href="#Handover">handovers</a></li>
+
+<li>
+bbb - counter for successful back to previous channel attempts
+(number of actual used channel is displayed, for example, in
+<b><a href="faq_net2.htm#Menu1">test 1</a></b>)</li>
+
+<li>
+ccc - counter for failed <a href="#Handover">handovers</a></li>
+
+<li>ddd - counter for successful <a href="#Intra">Intra cell - Intra BSC</a> <a href="#Handover">handovers</a>
+or assignments</li>
+</ul>
+
+<p>Counters will stop when they reach their maximum (999). To initialize them
+to zero, use <b><a href="#Menu40">test 40</a></b> (or
+<b><a href="faq_net5.htm#Menu60">test 60</a></b>).
+
+<p>In dual phones (like Nokia 6150 or 3210) <b>test 41</b> looks
+different and is connected with Inter cell - Intra BSC,
+Inter cell - Inter BSC and Inter MSC <a href="#Handover">handovers</a>:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb<br>
+ cccc dddd<br>
+eeefffggghhh<br>
+iiijjjkkklll</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>G>G InterD>D<br>
+G>D OK D>G<br>
+InterHoFail<br>
+BackToPrev</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaa - counter of successful <a href="#Handover">handovers</a> from GSM 900 to GSM 900</li>
+<li>bbb -counter of successful <a href="#Handover">handovers</a> from GSM 1800 to GSM 1800</li>
+<li>ccc - counter of successful <a href="#Handover">handovers</a> from GSM 900 to GSM 1800</li>
+<li>ddd - counter of successful <a href="#Handover">handovers</a> from GSM 1800 to GSM 900</li>
+<li>eee - counter of failed <a href="#Handover">handovers</a> from GSM 900 to GSM 900</li>
+<li>fff - counter of failed <a href="#Handover">handovers</a> from GSM 1800 to GSM 1800</li>
+<li>ggg -counter of failed <a href="#Handover">handovers</a> from GSM 900 to GSM 1800</li>
+<li>hhh - counter of failed <a href="#Handover">handovers</a> from GSM 1800 to GSM900</li>
+
+<li>
+iii - counter of successful back to previous channel attempts
+(number of actual used channel is displayed, for example, in
+<b><a href="faq_net2.htm#Menu1">test 1</a></b>)
+from GSM 900 to GSM 900</li>
+
+<li>jjj - counter of successful back to previous channel attempts from GSM 1800 to GSM 1800</li>
+
+<li>kkk - counter of successful back to previous channel attempts from GSM 900 to GSM 1800</li>
+
+<li>lll - counter of successful back to previous channel attempts from GSM 1800 to GSM 900</li>
+</ul>
+
+<p>Counters will stop when they reach their maximum (9999 dla dwóch pierwszych
+linii, 999 dla dwóch ostatnich). To initialize them to zero, use <b><a href="#Menu40">test 40</a></b>
+(or <b><a href="faq_net5.htm#Menu60">test 60</a></b>).
+
+<p>In Nokia 3310 sum of all <a href=faq_net4.htm#handover>handovers</a> is also
+displayed in <a href=faq_net6.htm#Menu131>test 131</a> (?).
+
+<p>In Nokia 3110 this test looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>HandOOk: aaa <br>
+PrevCh : bbb <br>
+HONotOK: ccc <br>
+T200: eeee</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>HandOvOKCntr <br>
+PrevChanCntr <br>
+HandOvNOKCnt <br>
+T200Cntr</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+eeee - I write about T200 counter in <b><a href="#Menu43">test 43</a></b></li>
+</ul>
+
+<p>and here's for Nokia 6185/6188:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+BSI 01000<br>
+VBAT 388<br>
+BTEMP 018<br>
+BATT 2 CHG 0</i>
+</tt></td>
+</tr>
+</table>
+
+<p><ul>
+<li>VBAT - battery voltage (/100V)</li>
+<li>BTEMP - battery temperature in C</li>
+<li>CHG - battery charge status: 1 - charging, 0 - not charging</li>
+</ul>
+
+<p><a NAME="Menu42"></a><b>Test 42</b>
+<br>This test is in dual phones (for example, Nokia 6150 or 3210) only
+and is connected with first kind of <a href="#Handover">handovers</a>
+(<a href="#Intra">Intra cell - Intra BSC</a>):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb<br>
+ cccc dddd<br>
+eeefffggghhh<br>
+iiijjjkkklll</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>G>G IntraD>D<br>
+G>D OK D>G<br>
+IntraHoFail<br>
+BackToPrev</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaa - counter of successful <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 900 to GSM 900</li>
+<li>bbbb - counter of successful <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 1800 to GSM 1800</li>
+<li>cccc - counter of successful <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 900 to GSM 1800</li>
+<li>dddd - counter of successful <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 1800 to GSM 900</li>
+<li>eee - counter of failed <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 900 to GSM 900</li>
+<li>fff - counter of failed <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 1800 to GSM 1800</li>
+<li>ggg - counter of failed <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 900 to GSM 1800</li>
+<li>hhh - counter of failed <a href="#Intra">Intra cell - Intra BSC handovers</a> from GSM 1800 to GSM 900</li>
+
+<li>
+iii - counter of successful back to previous normal channel
+(you can check number of actual used channel for example in
+<b><a href="faq_net2.htm#Menu1">test 1</a></b>) attempts
+inside one cell (INTRA CELL) from GSM 900 to GSM 900
+</li>
+
+<li>
+jjj - counter of successful back to previous normal channel attempts
+inside one cell (INTRA CELL) from GSM 1800 to GSM 1800
+</li>
+
+<li>
+kkk - counter of successful back to previous normal channel attempts
+inside one cell (INTRA CELL) from GSM 900 to GSM 1800</li>
+
+<li>
+lll - counter of successful back to previous normal channel attempts
+inside one cell (INTRA CELL) from GSM 1800 to GSM 900</li>
+</ul>
+
+<p>Counters will stop when they reach their maximum (9999 for two first lines,
+999 for two last). To initialize them
+to zero, use <b><a href="#Menu40">test 40</a></b>
+(or <b><a href="faq_net5.htm#Menu60">test 60</a></b>).
+
+<p>In Nokia 6185/6188 this test looks like <a href="faq_net3.htm#Menu20">test 20</a>.
+
+<p><a NAME="Menu43"></a><b>Test 43</b>
+
+<p>Some English descriptions write about this test:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>T200MS: aaaa<br>
+T200BS: bbbb<br>
+T200MS: cccc<br>
+T200BS: dddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>T200 MS GSM <br>
+T200 BS GSM<br>
+T200 MS DCS<br>
+T200 BS DCS</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - for GSM 900: counts how many times T200 in phone has expired and
+therefore L2 transmission has been repeated.</li>
+
+<li>
+bbbb - for GSM 900: counts how many times T200 in <a href="faq_net1.htm#BTS">BTS</a> (network) has expired
+and therefore L2 transmission has been repeated.
+</li>
+
+<li>
+cccc - for GSM 1800 called earlier DCS (in dual phones only): counts how many times T200 in phone
+has expired and therefore L2 transmission has been repeated.
+</li>
+
+<li>
+dddd - for GSM 1800 (in dual phone only): counts how many times T200 in <a href="faq_net1.htm#BTS">BTSie</a>
+(network) has expired and therefore L2 transmission has been repeated.</li>
+</ul>
+
+<p>Counters will stop when they reach their maximum (9999 for two first lines,
+999 for two last). To initialize them to zero, use <b><a href="#Menu40">test
+40</a></b> (or <b><a href="faq_net5.htm#Menu60">test 60</a></b>).
+
+<p>I noticed, that some things are a little different: in all 900, 1800, 900/1800 MHz
+phones, I saw, info is displayed ONLY in two first lines. Help is a little different too:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+T200 MS <br>
+T200 BS<p>
+
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+or:
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+T200Cntr MS<br>
+T200Cntr Net<p>
+
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+or:
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+T200Cutr MS<br>
+T200Cutr Net<p>
+
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>In Nokia 6185/6188 this test looks like <a href="faq_net3.htm#Menu21">test 21</a>.
+
+<p><a NAME="Menu44"></a><b>Test 44</b>
+<br>You change value from 01 (default) to 00 (or vice versa) by direct enter to this test.
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> REVISION<br>
+LEVEL IS aa <br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to <br>
+ change<br>
+ Revision<br>
+ Level</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 6185/6188 this test looks like <a href="faq_net3.htm#Menu22">test 22</a>.
+
+<p><a NAME="Menu45"></a><b>Test 45</b>
+<br>This test allows to simulate situations. when phone can normally
+receive network signal (but network can't receive any information from phone).
+It's very realistic (even in <b><a href="faq_net2.htm#Menu1">test
+1</a></b> in ddd parameter an asterisk (*) is displayed, when
+you try to make connection), but not always (in
+<b><a href="faq_net3.htm#Menu10">test 10</a></b> you will see
+'xxxxxxxx' instead of TMSI, when T3212 counter in first
+parameter will be expired).
+
+<p>You can change it by direct enter.
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt>TRANSMITTER <br>
+ ENABLED<br>
+ </td>
+</tr>
+</table>
+
+<p>(default setting)</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt>TRANSMITTER <br>
+ DISABLED<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to <br>
+ enable or<br>
+ disable<br>
+transmitter</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>When you enable it, phone won't be able, for example, to update
+location (see <b><a href="faq_net5.htm#Menu64">test 64</a></b>) and
+make calls. It will allow to:
+
+<ul>
+<li>"blockade" phone to the moment of another enabling it (for example,
+when you want to observe network parameters, but you don't want to be
+accessible for others - when somebody will call to you, for network
+your phone will be outside range)
+</li>
+
+<li>
+fast remind you of number written to phonebook (it's written on leaf,
+but you don't remember name of person assigned to): simple call it.
+When phone will choose number, it will display this name; it will be written
+on list odf last dialed numbers too.
+</li>
+</ul>
+</td>
+</tr>
+</table>
+
+<p>This test DOESN'T WORK CORRECTLY in Nokia 3210, 3310 and 7110 (you change setting,
+but it doesn't give described above results).
+
+<p>In Nokia 6185/6188 this test looks like <a href="faq_net3.htm#Menu23">test 23</a>.
+
+<p><a NAME="Menu46"></a><b>Test 46</b>
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<b>BAND CLASS a<br>
+CS SUBSTATE<br>
+EM STATEnnn<br>
+TX POWER DB</b>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu48"></a><b>Test 48</b>
+<br>In Nokia 3110 this test looks like <b><a href="faq_net2.htm#Menu7">test 7</a></b>.
+
+<p><a NAME="Menu51"></a><b>Test 51</b>
+<br>Information about SIM card
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaa bbb ccc <br>
+ dddddddd<br>
+ e f gg hh<br>
+ i jjjj</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>VSel Bau SAl<br>
+SCond CStop<br>
+PIN12 PUK12<br>
+ ATR FE/PE</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aa - SIM voltage selection type (3, 3/5 or 5)</li>
+
+<li>
+bbb - division coefficient, which define speed of communication phone with
+SIM card (372, 64, 32 or 0) saved in ATR (first sequence send by SIM card
+after reset - <b>A</b>nswer <b>T</b>o <b>R</b>eset).
+When you will divide clock frequency (maximal 3,25 MHz = 3 250 000 Hz)
+by it, you will have speed of transmission
+(for example, 3 250 000 Hz / 372 = 8736,5 bods)
+WARNING ! YOU CAN'T CHANGE SPEED OF COMMUNICATION PHONE WITH SIM CARD
+AND VALUE OF THIS PARAMETER !
+</li>
+
+<li>
+ccc - information, whether SIM clock stop is allowed (it saves energy)
+during standby (YES or NOT - possible or not). This information is displayed
+(in Nokia phones and not only) using <b>*#SIM0CLOCK#</b> code
+- when you will see "SIM clock stop allowed", SIM card allows to make it.
+Some Nokia 6110 phones (it depeneds on their firmware) can not support
+correctly this code - they display, for example, "Result unknown".
+Phone disables SIM card clock automatically - you can't make it manually !
+</li>
+
+<li>
+dddd - information about clock stop condition:
+
+<p>
+<ul>
+<li>UP</li>
+<li>DOWN</li>
+<li>DOWN(UP) - in tested by me SIM cards</li>
+<li>UP(DOWN)</li>
+<li>xxxxxxxx</li>
+</ul>
+<p>
+</li>
+
+<li>
+e - number of left PIN1 code entering attempts. When it's bigger than 9,
+you will see only last digit of it (for example, I found some prepaid cards
+with 10 value). Maximal number of entering code attempts depends on concrete
+SIM card (it can be set to any value), but the most often it's equal 3. In some SIM cards
+you can disable answering for this code (for example, you can select it in
+<b>Menu 4-3-1</b> in Nokia 5110). When it's equal 0, phone shows
+"Sim card blocked" and asks for PUK1. If it was entered correctly, this counter
+is reset to maximal value. Disabling and enabling phone doesn't reset it !
+</li>
+
+<li>
+f - number of left PIN2 code entering attempts (when SIM card doesn't support
+PIN2 functions, you will see "x" here). You can check, if these functions are supported,
+using call cost function too (if they're not, phone displays "Not allowed").
+If you wanted to use them and your card doesn't support them (you will see "x"
+here), you (or your operator ;-) rather) have to change it.
+Maximal number of entering code attempts depends on concrete
+SIM card (it can be set to any value), but the most often it's equal 3. When this counter
+is equal 0, phone asks for PUK2. When this code was entered correctly, counter
+is reset to maximal value. Of course, even when it's equal 0, you can normally
+use SIM card (PIN2/PUK2 are independent of PIN1/PUK1), when you know PIN1.
+Disabling and enabling phone doesn't reset it !
+If SIM card has blocked PIN2/PUK2 codes, you can enter to the menus contains supported
+by these codes functions (but after changing next settings you will see error).
+</li>
+
+<li>
+gg - number of left PUK1 code entering attempts.
+Maximal number of entering code attempts depends on concrete
+SIM card (it can be set to any value), but the most often it's equal 10.
+Phone asks for it, when counter of left PIN1 code entering attempts is equal 0
+(phone shows "Sim card blocked"). When this counter is equal 0 too, SIM card
+can be blocked (phone shows "Sim card rejected") or (it depends on card)
+asks for PUK2. When this code was entered correctly, counters of left PIN1 and
+PUK1 codes entering attempts are reset to maximal values.
+Disabling and enabling phone doesn't reset it !
+</li>
+
+<li>
+hh - number of left PUK2 code entering attempts (when SIM card doesn't support
+PIN2 functions, you will see "x" here).
+Maximal number of entering code attempts depends on concrete
+SIM card (it can be set to any value), but the most often it's equal 10.
+When it's equal 0, using PIN2 functions can be impossible on this SIM card (ask operator for help).
+Additionaly, when you were asked for PUK2, when counters of left PIN1 and
+PUK1 codes entering attempts were equal 0 and now left PUK2 code entering attempts
+is equal 0 too, using this SIM card can be impossible (you have to replace it to new).
+When it was entered correctly, counters for this code and PIN2 (when you entered
+PUK2, because PIN2 was blocked) are reset to maximal values or counters for this,
+PIN1 and PUK1 are reset (when you entered PUK2, because PIN1 and PUK1 were blocked).
+Disabling and enabling phone doesn't reset it !
+</li>
+
+<li>
+i - ATR repeat counter (ATR is first sequence sent by SIM card in answet to reset -
+<b>A</b>nswer <b>T</b>o <b>R</b>eset) (0-9)</li>
+
+<li>
+jjjj - number of retransmissions/parity errors in transmission with SIM card
+(when the happen, two first chars are equals FE (<b>F</b>rame <b>E</b>rror) or
+PE (<b>P</b>arity <b>E</b>rror), two last number of retransmission/errors)</li>
+</ul>
+
+<p>If you don't have SIM card in the phone, you will see "ERROR1" in this test.
+
+<p>If phone has problems with communication with SIM card, this test can look like
+follows (i and jjjj parameters are described above):
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>ERROR1 5 55<br>
+55<br>
+ i jjjj<br>
+
+</tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>CStop parameter (information, if SIM card clock is disabled in this moment)
+is displayed in help only. Why ? Probably somebody didn't remember about it...
+
+<p>Here are some observations for SIM voltage selection type (first parameter)
+Nokia 5110 and tested SIM cards:
+
+<p>After enabling phone reads some information from SIM card (for example,
+number saved on it SMS messages, numbers from phonebook) - when you try to read
+something, what is written there (for example, phonebook),
+"SIM card not ready" message is displayed then (and first parameter shows 3).
+I noticed, that phone can't display names assigned to numbers in phonebook too
+(for example, when you call somebody) and shows, that "Inbox" and "Outbox"
+are empty (even, when some messages are saved there).
+
+<p>Later value of parameter changes to 3/5 - I suppose, SIM card clock is
+enabled then.
+
+<p>Phone disables it (in test value 3), when communicates with network
+(requesting services, sending or receiving SMS messages) because of saving
+energy (the same in <a href="faq_net2.htm#NSPS">NSPS</a> state).
+
+<p>When you call to number assigned to name in phonebook (or phone
+recognizes incoming number), value to the end of call is equal 3/5
+(otherwise it changes to 3). After end of call is always equal 3. Logical
+conclusion: after enabling phone saves in own memory checksum for
+all numbers from phonebook (it's enought to make for 7 last digits - they're
+used to identify number in Nokia phones). If this checksum is the same to
+checksum for number, you're calling (or incoming number), phone reads name
+from phonebook...
+
+<p>And the last observation: without connection (see above) value of first
+parameter is equal 3/5 (is some energy loose ? Probably yes... But why counter from
+<b><a href="faq_net3.htm#Menu20">test 20</a></b> doesn't show any change in their
+consumption ?)
+
+<p>When you try to open "Outbox" or "Inbox", phone doesn't enable clock,
+when they're empty (that's why I think, that phone saves into own memory
+number of saved SMS messages too).
+
+<p>Many information about SIM card are displayed by
+<a href="http://www.compelson.cz/simedit.htm">SIMedit</a> (unfortunatelly, in Czech language only :-( )...
+Parameters like ATR you can study using SIM Scan (it's on the <a href="http://www.net.yu/~dejan">www.net.yu/~dejan</a>
+or <a href="http://members.tripod.com/~dejank/">http://members.tripod.com/~dejank/</a> pages). They both work with
+SIM card readers only...
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>
+If you want to see "Insert SIM card" and (sometimes) "SIM card rejected"
+messaeges, try to make such activities (checked for Nokia 5110):
+
+<p>Press very delicately the locking catch of the battery and start to slide the battery
+downwards very slowly (stop, when you will hear silently crack).
+
+<p>In this moment you should see first message and phone will start to inform
+about problems with communication with SIM card (you will see "ERROR1" here)...
+</td>
+</tr>
+</table>
+
+<p>In Nokia 6185/6188 this test looks like follows:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+TASK0 0134 <br>
+TASK1 015C<br>
+TASK2 0138<br>
+TASK3 0170</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu52"></a><b>Test 52</b>
+<br>Reads datafield from SIM card
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+Read SIM-<br>
+data field <br>
+to SIM-SCM<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Use menu to <br>
+read SIM-<br>
+data field<br>
+to SIM-SCM</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>This display reads a binary datafield from SIM card to SIM SCM memory
+(SCM = <b>S</b>hort <b>C</b>ode <b>M</b>emory and it means phonebook on SIM card).
+
+<p>Prior using this display the identifier of datafield has to be stored as an
+alpha-identifier of SCM location number 34 of SIM memory. The datafield
+must be written in hexadecimal notation. The identifiers can be found from
+the GSM 11.11.
+
+<p>The contents of datafield is stored as a data-identifier of SCM location
+number 35 of SIM memory. The contents are displayed in hexadecimal notation.
+The maximum length of the datafield is 10 bytes, but the length depends on
+the name length of the SIM memory. In case the datafield cannot be read the
+alpha-identifier of SCM location is NOT DONE.
+
+<p>The information of how the read succeeded can be read from the SCM location
+36 of SIM memory and on the display for a short period.
+
+<p>The following results are possible:
+
+<p>
+<table cellspacing=4 cellpadding=0>
+<tr><td>OK</td><td>datafield was read correctly</td></tr>
+<tr><td>NOT BINARY</td><td>datafield is either formatted or cyclic</td></tr>
+<tr><td>NOT FOUND</td><td>datafield was not found from SIM card</td></tr>
+<tr><td>CARD ERROR</td><td>something weird happened, card did not respond as expected</td></tr>
+<tr><td>NO RIGHTS</td><td>not enough rights to read the datafield (PIN2,adm..)</td></tr>
+<tr><td>NOT STORED</td><td>could not store into the result memory place</td></tr>
+<tr><td>NO ADDRESS</td><td>could not read the address from the SCM-location</td></tr>
+<tr><td>UNKNOWN</td><td>unidentified error</td></tr>
+</table>
+
+<p>For the time being following binary datafields exist in SIM. In future
+there could be more. All of these are not necessarily on all SIM cards.
+
+<p>
+<table cellspacing=4 cellpadding=0>
+<tr><td>2FE2</td><td>ICC identification</td><td>(10 bytes)</td></tr>
+<tr><td>6F05</td><td>Language preference</td><td>(variable length)</td></tr>
+<tr><td>6F07</td><td><a href="faq_net1.htm#IMSI">IMSI</a></td><td>(9 bytes)</td></tr>
+<tr><td>6F20</td><td>Ciphering key Kc (it's read from card after entering PIN)</td><td>(9 bytes)</td></tr>
+<tr><td>6F30</td><td><a href="faq_net1.htm#PLMN">PLMN</a> selector</td><td>(variable length)</td></tr>
+<tr><td>6F31</td><td>HPLMN (home network ?) search period</td><td>(1 byte)</td></tr>
+<tr><td>6F37</td><td>ACM maximum value</td><td>(3 bytes)</td></tr>
+<tr><td>6F38</td><td>SIM service table</td><td>(2-4 bytes)</td></tr>
+<tr><td>6F41</td><td>Price per unit and currency table</td><td>(5 bytes)</td></tr>
+<tr><td>6F45</td><td>Cell broadcast message identifier selection</td><td>(variable length)</td></tr>
+<tr><td>6F74</td><td>Broadcast control channels</td><td>(16 bytes)</td></tr>
+<tr><td>6F78</td><td>Access control class</td><td>(2 bytes)</td></tr>
+<tr><td>6F7B</td><td>Forbidden <a href="faq_net1.htm#PLMN">PLMNs</a> (see <a href="faq_net2.htm#Menu7">test 7</a>)</td><td>(12 bytes)</td></tr>
+
+<tr><td>6F7E</td><td>Location information
+(<a href="faq_net3.htm#Menu10">TMSI</a>,
+<b>L</b>ocal <b>A</b>rea <b>I</b>nformation (consist of MCC, MNC & LAC -
+see <a href="faq_net3.htm#Menu11">test 11</a> for them),
+last <a href="faq_net1.htm#LocationUpdate">Location Update</a> status)</td><td>(11 bytes)</td></tr>
+
+<tr><td>6FAD</td><td>Administrative data</td><td>(variable length)</td></tr>
+<tr><td>6FAE</td><td>Phase identification</td><td>(1 byte)</td></tr>
+<tr><td>6F43</td><td>SMS status</td><td>(variable length)</td></tr>
+<tr><td colspan=3> <p>Next two binary datafields are phase 2+ features which are not currently in use<p> </td></tr>
+<tr><td>6F3E</td><td>Group Identifier Level 1</td><td>(variable length)</td></tr>
+<tr><td>6F3F</td><td>Group Identifier Level 2</td><td>(variable length)</td></tr>
+</table>
+
+<p>In Nokia 6185/6188 this test looks like follows:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+TASK4 0134 <br>
+TASK5 015C<br>
+TASK6 0138<br>
+TASK7 0170</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu53"></a><b>Test 53</b>
+<br>Writes datafield into SIM card
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ Write<br>
+ data field<br>
+from SIM-SCM<br>
+ to SIM</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Use menu to<br>
+write data<br>
+field to SIM<br>
+
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>This display writes data for a binary datafield in SIM card by using data
+in SCM memory of SIM card.
+
+<p>Prior using this display the identifier of datafield has to be stored as an
+alpha-identifier of SCM location number 34 of SIM memory. The datafield
+must be written in hexadecimal notation. The identifiers can be found from
+the GSM 11.11. In addition the data to be stored into SIM card has to be
+entered as an alpha-identifier of SCM location number 35 of SIM memory.
+The data has to be stored in hexadecimal notation.
+
+<p>The result of write operation can be seen from the alpha-identifier of
+SCM-location 36 of SIM-memory and on the display for a short period.
+
+<p>The following results are possible:
+
+<p>
+<table cellspacing=4 cellpadding=0>
+<tr><td>OK</td><td>datafield was read correctly</td></tr>
+<tr><td>NOT BINARY</td><td>datafield is either formatted or cyclic</td></tr>
+<tr><td>NOT FOUND</td><td>datafield was not found from SIM card</td></tr>
+<tr><td>CARD ERROR</td><td>something weird happened, card did not respond as expected</td></tr>
+<tr><td>NO RIGHTS</td><td>not enough rights to read the datafield (PIN2,adm..)</td></tr>
+<tr><td>DATA ERROR</td><td>the data contents in SCM location is coded wrongly</td></tr>
+<tr><td>NOT STORED</td><td>could not store into the result memory place</td></tr>
+<tr><td>NO ADDRESS</td><td>could not read the address from the SCM location</td></tr>
+<tr><td>UNKNOWN</td><td>unidentified error</td></tr>
+</table>
+
+<p>If you want to see changes, often you have to restart your phone.
+
+<p>In Nokia 6185/6188 this test looks like follows:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+TASK8 0134 <br>
+TASK9 015C<br>
+TASK10 0138<br>
+TASK11 0170</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu54"></a><b>Test 54</b>
+<br>Information about memory blocks
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aa bb aa bb<br>
+aa bb aa bb<br>
+aa bb aa bb<br>
+aa bb aa bb</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>ResF1 ResF2<br>
+ResF3 ResF4<br>
+ResF5 ResF6<br>
+ResF7 ResF8</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Meaning of the individual lines (information about another blocks):
+
+<p>
+<ol>
+<li>1, 2</li>
+<li>3, 4</li>
+<li>5, 6</li>
+<li>7, 8</li>
+</ol>
+
+<p>
+<ul>
+<li>aa - number of reserved blocks</li>
+<li>bb - number of free blocks in worst case</li>
+</ul>
+
+<p>In Nokia 6185/6188 this test looks like follows:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+TASK12 0134 <br>
+TASK13 015C<br>
+TASK14 0138<br>
+TASK15 0170</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu55"></a><b>Test 55</b>
+<br>Information about memory blocks (some phones don't have this test -
+they don't have such big memory)
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aa bb aa bb<br>
+aa bb aa bb<br>
+aa bb aa bb<br>
+aa bb aa bb</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>ResF9 ResF10<br>
+ResF11ResF12<br>
+ResF13ResF14<br>
+ResF15ResF16</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Meaning of the individual lines (information about another blocks):
+
+<p>
+<ol>
+<li>9, 10</li>
+<li>11, 12</li>
+<li>13, 14</li>
+<li>15, 16</li>
+</ol>
+
+<p>
+<ul>
+<li>aa - number of reserved blocks</li>
+<li>bb - number of free blocks in worst case</li>
+</ul>
+
+<p>In Nokia 7110 counters end on ResF11, in 6210/6250 on ResF15.
+
+<p>In Nokia 3110 this test looks like <b><a href="#Menu56">test 56</a></b>.
+
+<p>In Nokia 8210/3310 help to this test is a little
+different (another firmware "bug" ? ;-))):
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<tt><b>
+ResF9 ResF10<br>
+ResF11ResF12<br>
+ResF13ResF14<br>
+ResSF15ResF1<br>
+</b>
+</tt></td>
+</tr>
+</table>
+</td>
+
+</tr></table></center>
+
+<p>and values are displayed in first line only...
+
+<p><a NAME="Menu56"></a><b>Test 56</b>
+<br>Block display
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaaaa bbb <br>
+ cccccccc<p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Ptr Cntr <br>
+ Task<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaaa - pointer to memory where double deallocation was called, in hex
+format.</li>
+
+<li>
+bbb - counter for failed deallocations.</li>
+
+<li>
+cccccccc - name of task which last tried to double deallocate a block
+(you can find their list in <a href="#Menu35"><b>test 35</b></a> description).
+
+<!--(np. "OS IDLE", "UNKNOWN" (nieznane) albo "NONETASK" (dwa ostatnie
+pokazuj± siê po naci¶niêciu klawisza)) -->
+
+</li>
+</ul>
+
+<p>This test has correct values only, when counter bbb is different from 0.
+
+<p>In Nokia 3110 it looks like <b><a href="#Menu57">test 57</a></b>.
+
+<p><a NAME="Menu57"></a><b>Test 57</b>
+<br>Memory status before reset
+
+<p>
+<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaaaaaaaaa<br>
+aaaaa...<br>
+bbbbbbbb<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Status of<br>
+ stacks<br>
+ Block sets <br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaaa... - Status of each stack before reset. First position contains
+the status of stack 0, second position the status of
+stack 1 and so on. The last position contains the status
+of System stack. Number of stacks depends on the current
+configuration of software. Possible values for each stack are:
+
+<p>
+<ul>
+<li>0: status OK, no overflow - <b>it's normally !</b></li>
+<li>1: status not OK, stack overflow</li>
+</ul>
+<p>
+</li>
+
+<li>
+bbbbbbb - status of each block set before reset. First position
+contains the status of block set 1, second position the
+status of block set 2 and so on. Possible values for each
+block set are:
+
+<p>
+<ul>
+<li>0: status OK</li>
+<li>1: block set full - <b>it's normally !</b></li>
+<li>2: (de)allocation error or total memory corruption</li>
+</ul>
+</li>
+
+</ul>
+
+<p>This display is only valid when a unknown or
+a stack overflow interrupt has occured. In some phones you can make
+restart connected with stack overflow (see <a href="faq_net0.htm#9">question 9</a>)
+and see this test in "action"...
+
+<p>In Nokia 6210 this test is bigger and displayed on full screen...
+
+<p>In Nokia 6185/6188 this test is different:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+16:3A 32:26<br>
+64:18 128:21<br>
+168:14<br>
+264:0E
+</i>
+</tt></td>
+</tr>
+</table>
+
+<font class="drukuj">
+<br><a class="shref" href="#Top"><small><em>Back to the top</em></small></a><br>
+
+<center>
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><b>[Part 5]</b><a href="faq_net5.htm">[Part 6]</a><a href="faq_net6.htm">[Part 7]</a>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wiacek<Marcin-Wiacek@topnet.pl>">Marcin Wiacek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Last modifcation: 5 January 2002</font>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="Description" content="FAQ dotycz±cy monitora sieci w Nokiach (NOKIA NetMonitor description)">
+ <meta name="language" content="pl">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, monitor sieci, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek">
+ <title>FAQ - monitor sieci w Nokiach (czê¶æ 6/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<font class="drukuj">
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Strona g³ówna</a></p>
+</font>
+<center><font color="#1F409F" size=+2 class="tytul">Monitor sieci w telefonach Nokia (6/7)</font>
+<font class="drukuj">
+<p><a href="faq_net0.htm">[Czê¶æ 1]</a><a href="faq_net1.htm">[Czê¶æ 2]</a><a href="faq_net2.htm">[Czê¶æ 3]</a><a href="faq_net3.htm">[Czê¶æ 4]</a><a href="faq_net4.htm">[Czê¶æ 5]</a><b>[Czê¶æ 6]</b><a href="faq_net6.htm">[Czê¶æ 7]</a>
+</font>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+<a NAME="Top"></a>
+
+<font class="drukuj">
+<ol>
+<li><a href="faq_net0.htm#1"><b>Co to jest ?</b></a></li>
+<li><a href="faq_net0.htm#2"><b>Czy jest mi potrzebny ?</b></a></li>
+<li><a href="faq_net0.htm#3"><b>Czy po w³±czeniu monitora telefon pobiera wiêcej energii ?</b></a></li>
+<li><a href="faq_net0.htm#4"><b>Jak go w³±czyæ ?</b></a></li>
+<li><a href="faq_net0.htm#5"><b>Jak± wersjê monitora mogê w³±czyæ w telefonie ?</b></a></li>
+<li><a href="faq_net0.htm#6"><b>Czy w³±czenie monitora powoduje utratê gwarancji ?</b></a></li>
+<li><a href="faq_net0.htm#7"><b>W moim telefonie menu monitora ma numer inny ni¿ 10. Czy to normalne ?</b></a></li>
+<li><a href="faq_net0.htm#8"><b>W moim telefonie menu monitora ma numer 11, natomiast poprzednia pozycja numer 9. Czy to normalne ?</b></a></li>
+<li><a href="faq_net0.htm#9"><b>Jak siê nim pos³ugiwaæ ?</b></a></li>
+<li><a href="faq_net0.htm#10"><b>Czy mogê zepsuæ sobie telefon ?</b></a></li>
+<li><a href="faq_net1.htm#11"><b>S³owniczek</b></a></li>
+<li><a href="faq_net2.htm#12"><b>Znaczenie poszczególnych testów</b></a></li>
+<li><a href="faq_net6.htm#13"><b>Mo¿na te¿ u¿yæ programu...</b></a></li>
+<li><a href="faq_net6.htm#14"><b>Czy mo¿na korzystaæ z monitora sieci, gdy nie ma w telefonie karty SIM, nie zosta³ podany jej PIN lub jest nieaktywna ?</b></a></li>
+<li><a href="faq_net6.htm#15"><b>W jaki sposób mogê wy³±czyæ monitor sieci ?</b></a></li>
+<li><a href="faq_net6.htm#16"><b>Czy powinienem wy³±czyæ monitor sieci przed oddaniem telefonu do serwisu ?</b></a></li>
+<li><a href="faq_net6.htm#17"><b>Czy po wy³±czeniu monitora sieci bêdê go móg³ w³±czyæ ponownie ?</b></a></li>
+<li><a href="faq_net6.htm#18"><b>Czy monitor sieci jest dostêpny tak¿e w analogowych Nokiach ?</b></a></li>
+<li><a href="faq_net6.htm#19"><b>Czy monitor sieci pozwoli na u¿ywanie telefonu podobnie jak radiostacji ?</b></a></li>
+<li><a href="faq_net6.htm#20"><b>Dlaczego w moim telefonie jest znacznie mniej testów ni¿ zosta³o tutaj opisane ? Czy mogê zwiêkszyæ ich ilo¶æ ?</b></a></li>
+<li><a href="faq_net6.htm#21"><b>Czy mogê stwierdziæ z pomoc± monitora sieci, gdzie znajduje siê mój rozmówca ?</b></a></li>
+<li><a href="faq_net6.htm#22"><b>Czy mogê stwierdziæ z pomoc± monitora sieci, gdzie siê znajdujê ?</b></a></li>
+<li><a href="faq_net6.htm#23"><b>Co to s± kody monitora sieci ?</b></a></li>
+<li><a href="faq_net6.htm#24"><b>Czy jest prawd±, ¿e monitor sieci w telefonie z dodatkowym urz±dzeniem zmieniaj±cym jego pasmo dzia³a niepoprawnie ?</b></a></li>
+<li><a href="faq_net6.htm#25"><b>Gdzie znajdê opis protoko³u MBUS/FBUS i komendy zwi±zane z monitorem sieci ?</b></a></li>
+<li><a href="faq_net6.htm#26"><b>Na li¶cie sieci zabronionych mam nieistniej±ce sieci...</b></a></li>
+<li><a href="faq_net6.htm#27"><b>Jak sprawdziæ, w jakim pasmie czêstotliwo¶ci (900 czy 1800 Mhz) dzia³a telefon ?</b></a></li>
+<li><a href="faq_net6.htm#28"><b>Czy mogê u¿yæ kabla DLR-2/DLR-3 do aktywacji monitora ?</b></a></li>
+<li><a href="faq_net6.htm#29"><b>Czy mogê u¿yæ aktywowaæ monitor sieci korzystaj±c z Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="faq_net6.htm#30"><b>Czy mogê zmusiæ telefon do u¿ywania konkretnego pasma czêstotliwo¶ci (900 lub 1800 Mhz) ?</b></a></li>
+<li><a href="faq_net6.htm#31"><b>Jak zmieniaæ ustawienia w testach ?</b></a></li>
+<li><a href="faq_net6.htm#32"><b>Mój telefon ma bardzo krótki czas czuwania - czy mo¿na sprawdziæ, co jest tego przyczyn± ?</b></a></li>
+<li><a href="faq_net6.htm#33"><b>Czy monitor sieci dostêpny jest tylko po angielsku ?</b></a></li>
+<li><a href="faq_net6.htm#Literatura"><b>U¿yte materia³y</b></a></li>
+<li><a href="faq_net6.htm#35"><b>Dodatkowe informacje</b></a></li>
+<li><a href="faq_net6.htm#36"><b>Czy u¿ywanie/aktywacja monitora co¶ kosztuje ?</b></a></li>
+<li><a href="faq_net6.htm#37"><b>Czy u¿ywanie monitora jest legalne ?</b></a></li>
+<li><a href="faq_net6.htm#38"><b>Które komórki na karcie SIM s± u¿ywane w testach monitora ?</b></a></li>
+<li><a href="faq_net6.htm#39"><b>Czy mogê netmonitora w 3310 uaktywniæ programem do 3210?</b></a></li>
+<li><a href="faq_net6.htm#40"><b>Po uaktywnieniu netmonitora/BTS TEST telefon "gubi" sieæ komórkow±...</b></a></li>
+<li><a href="faq_net6.htm#41"><b>Netmonitor pokazuje inn± pojemno¶æ baterii ni¿ informacja na niej...</b></a></li>
+</ol>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<p><a NAME="Menu58"></a><b>Test 58</b>
+
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>384:02 <br>
+512:02<br>
+752:02<br> </i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu59"></a><b>Test 59</b>
+
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+0087<br>
+00 00 00 00 <p>
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu60"></a><b>Test 60</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> FIELD TEST <br>
+ DISPLAY <br>
+ COUNTERS <br>
+ RESET</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to<br>
+reset field<br>
+test display<br>
+counters</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Przez bezpo¶rednie wej¶cie do tego menu mo¿esz wyzerowaæ liczniki od
+<b><a href="#Menu41">testu 41</a></b> do <b><a href="#Menu43">testu 43</a></b>
+i od <b><a href="#Menu61">testu 61</a></b> do <b><a href="#Menu66">testu 66</a></b>.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>Je¿eli wyzerujesz te liczniki na pocz±tku ka¿dego miesi±ca, to bêdziesz
+móg³(mog³a) porównaæ ilo¶æ wys³anych <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>
+(<b><a href="#Menu65">test 65</a></b>) i rozmów (<b><a href="#Menu63">test 63</a></b>)
+z Twoim rachunkiem telefonicznym.
+Dodatkowo (w niektórych kartach prepaid - np. Tak-Tak) pobierana jest z góry
+op³ata za wys³anie pewnej ilo¶ci <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>
+- je¿eli wyzerujesz te liczniki na pocz±tku "cyklu", bêdzie wiedzieæ, kiedy
+z Twojego konta zostan± odjête kolejne pieni±dze...
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu61"></a><b>Test 61</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>NOPSW :aaaa<br>
+SYNCR :bbbb<br>
+RESELEC:cccc<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>PSWMesgCntr<br>
+SyncMeasCntr<br>
+CellReselCtr<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - licznik (szesnastkowy) zliczaj±cy komunikaty MDI_NO_PSW_FOUND
+z <a href="faq_net1.htm#DSP">DSP</a></li>
+
+<li>
+bbbb - licznik (dziesiêtny) prób zmierzenia synchronizacji. Je¿eli przekroczy
+9999, pokazywane s± cztery x.</li>
+
+<li>
+cccc - licznik (szesnastkowy) powtórnych wyborów komórki</li>
+</ul>
+
+<p>Warto¶ci liczników s± zapamiêtywane przy wy³±czaniu telefonu. Mo¿esz je
+wyzerowaæ u¿ywaj±c <b><a href="#Menu60">testu 60</a></b>. S± one zerowane,
+gdy osi±gn± warto¶ci maksymalne.
+
+<p>W telefonach dualnych pojawi siê takie <b>test 61</b>:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaa bbbbb<br>
+ccccc ddddd<br>
+eeeee fffff<br>
+ggggg hhhhh</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>NOPswGSM DCS<br>
+Sync GSM DCS<br>
+reselG>G D>D<br>
+reselG>D D>G</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaa - dla GSM 900: licznik (dziesiêtny) zliczaj±cy komunikaty MDI_NO_PSW_FOUND
+z <a href="faq_net1.htm#DSP">DSP</a></li>
+
+<li>
+bbbb - dla GSM 1800: licznik (dziesiêtny) zliczaj±cy komunikaty MDI_NO_PSW_FOUND
+z <a href="faq_net1.htm#DSP">DSP</a></li>
+
+<li>
+ccccc - dla GSM 900: licznik (dziesiêtny) prób zmierzenia synchronizacji.
+Je¿eli przekroczy 99999, pokazywane jest piêæ x.</li>
+
+<li>
+ddddd - dla GSM 1800: licznik (dziesiêtny) prób zmierzenia synchronizacji.
+Je¿eli przekroczy 99999, pokazywane jest piêæ x.</li>
+
+<li>
+eeeee - licznik (dziesi±tkowy) powtórnych wyborów komórki GSM 900 - GSM
+900</li>
+
+<li>
+fffff - licznik (dziesi±tkowy) powtórnych wyborów komórki GSM 1800 - GSM
+1800</li>
+
+<li>
+ggggg - licznik (dziesi±tkowy) powtórnych wyborów komórki GSM 900 - GSM
+1800</li>
+
+<li>
+hhhhh - licznik (dziesi±tkowy) powtórnych wyborów komórki GSM 1800 - GSM
+900</li>
+</ul>
+
+<p>Warto¶ci liczników s± zapamiêtywane przy wy³±czaniu telefonu. Mo¿esz je
+wyzerowaæ u¿ywaj±c <b><a href="#Menu60">testu 60</a></b>. S± one zerowane,
+gdy osi±gn± warto¶ci maksymalne.
+
+<p>W Nokii 6210/8210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+NOPSW: 008A<br>
+SYNCR: 766<br>
+RESELEC:872D<br>
+RmMonTO:0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+PSWMesgCntr<br>
+SyncMeasCntr<br>
+CellReselCtr<br>
+RM Mon TOuts
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Natomiast w Nokii 3310 pomoc wygl±da jak pomoc w modelu 6210/8210, natomiast warto¶ci
+mniej wiêcej tak:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ 17<br>
+ 135 <br>
+5112<br>
+
+</i></tt></td>
+</tr>
+</table>
+
+<p>W Nokii 6185/6188 jest on jeszcze inny:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+V<br>
+aaaaaaaaaaaa<br>
+bbbbbbbbbb<br>
+ccccccc
+</tt></td>
+</tr>
+</table>
+
+<ul>
+<li>aaaaaaaaaaaa - wersja oprogramowania telefonu</li>
+<li>bbbbbbbbbb - data oprogramowania telefonu</li>
+<li>ccccccc - oznaczenie kodowe telefonu (NSD-3AX)</li>
+</ul>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>Ten telefon pokazuje te informacje równie¿ po u¿yciu kodu <b>*#837#</b>.
+Je¿eli chcesz siê wiêcej dowiedzieæ o wewnêtrznym oprogramowaniu telefonów Nokia
+(ró¿nice, wersje, itd.), kliknij <a href="../firmware/firmware.htm">tutaj</a>.</td>
+</tr>
+</table>
+
+<p><a NAME="Menu62"></a><b>Test 62</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> PSW :aaaa <br>
+ SYNCR:bbbb<br>
+ BCCH :cccc <br>
+ BCCHE:dddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>NeghbrPSWCtr<br>
+SyncMeasCntr<br>
+BCCHMeasAtmp<br>
+BCCHExtMeAtm</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - ilo¶æ prób pomiarów PSW w s±siednich komórkach</li>
+
+<li>
+bbbb - ilo¶æ prób zmierzenia synchronizacji w s±siednich komórkach</li>
+
+<li>
+cccc - ilo¶æ prób pomiarów kana³ów
+<a href="faq_net2.htm#BCCH">BCCH</a>
+(tzn. jako¶ci transmisji z nimi) w s±siednich komórkach (patrz opis <a href="faq_net1.htm#C1">C1</a>)</li>
+
+<li>
+dddd - ilo¶æ prób rozszerzonych pomiarów kana³ów <a href="faq_net2.htm#BCCH">BCCH</a>
+(tzn. jako¶ci transmisji z nimi) w s±siednich komórkach (patrz opis <a href="faq_net1.htm#C1">C1</a>)</li>
+</ul>
+
+<p>Warto¶ci liczników s± zapamiêtywane przy wy³±czaniu telefonu. Mo¿esz je
+wyzerowaæ u¿ywaj±c <b><a href="#Menu60">testu 60</a></b>. S± one zerowane,
+gdy osi±gn± warto¶ci maksymalne.
+
+<p>W Nokii 3310 warto¶ci liczników s± piêciocyfrowe i wyrównane do prawej strony ekranu...
+
+<p>W Nokii 6185/6188 ten test wygl±da inaczej:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>DSP ROM 2 <br>
+VERS 430<br>
+BETA 0014<br> </i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu63"></a><b>Test 63</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aa bb<br>
+ ccc ddd <br>
+ eee fff<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CalRel RelDi<br>
+MOCAtmp MOOK<br>
+AllMT MTOK<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aa - tutaj znajdziesz przyczynê zakoñczenia ostatniego po³±czenia (parametr
+ten jest równie¿ podawany w <b><a href="faq_net2.htm#Menu2">te¶cie 2</a></b>
+i <b><a href="faq_net4.htm#Menu39">te¶cie 39</a></b> (w tym ostatnim menu
+znajdziesz wyja¶nienia - patrz opis pierwszego parametru))</li>
+
+<li>
+bb - kolejna informacja o zakoñczeniu ostatniego po³±czenia:
+
+<p>
+<ul>
+<li>
+UN: nieznana (przyk³adowo: od w³±czenia Twojego telefonu nie by³y wykonywane
+¿adne po³±czenia)</li>
+
+<li>
+IN: przyczyna wewnêtrzna (przyk³adowo: w³±czy³e¶(a¶) w <b><a href="faq_net3.htm#Menu17">te¶cie 17</a></b>
+test <a href="faq_net1.htm#BTS">BTSa</a>, telefon nie odnalaz³
+sieci na podanym kanale, a Ty próbowa³e¶(a¶) wykonaæ po³±czenie)</li>
+
+<li>
+MT: przerwanie przez sieæ</li>
+
+<li>
+MO: nast±pi³o roz³±czenie (od³o¿enie s³uchawki) z którego¶ telefonu</li>
+</ul>
+<p>
+</li>
+
+<li>
+ccc - ilo¶æ wybieranych po³±czeñ z Twojego telefonu</li>
+
+<li>
+ddd - ilo¶æ poprawnie zrealizowanych po³±czeñ wychodz±cych z Twojego telefonu
+(tzn. ile razy dodzwoni³e¶(a¶) siê do Twojego rozmówcy). W Nokii 3310 równie¿
+w <a href=faq_net6.htm#Menu132>te¶cie 132</a>.</li>
+
+<li>
+eee - ilo¶æ wszystkich rozmów przychodz±cych</li>
+
+<li>
+fff - ilo¶æ odebranych rozmów przychodz±cych. W Nokii 3310 równie¿
+w <a href=faq_net6.htm#Menu132>te¶cie 132</a>.</li>
+</ul>
+
+<p>Po osi±gniêciu warto¶ci maksymalnej liczniki s± zerowane (mo¿esz to te¿
+zrobiæ w <b><a href="#Menu60">te¶cie 60</a></b>). Ich warto¶ci (od licznika
+ccc w³±cznie) s± zapamiêtywane przy wy³±czaniu telefonu.
+
+<p>W Nokii 3310 parametry s± nieco poprzesuwane w stosunku do rysunku powy¿ej.
+
+<p>W Nokii 6185/6188 ten test wygl±da inaczej:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+C1M 00 <br>
+C1L 00<br>
+C2M 00<br>
+C2L 03
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu64"></a><b>Test 64</b>
+<br>Zawiera m.in. informacje, ile razy Twój telefon informowa³ sieæ o swoim
+po³o¿eniu (patrz równie¿ opis <b><a href="faq_net3.htm#Menu10">test 10</a></b>)
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aa bbb ccc <br>
+ dd eee fff <p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Nfai NL NLOK<br>
+PFai PL PLOK<br>
+ Loc update<br>
+ counters</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - kod b³êdu (zerowany po w³±czeniu telefonu) przy ostatnim b³êdnym
+<a href="faq_net1.htm#LocationUpdate">Location
+Update</a> (tzn. zmienia siê tylko wtedy, gdy gdy wyst±pi³ b³±d przy jego
+wykonywaniu). Znajdziesz go równie¿ w <b><a href="faq_net4.htm#Menu39">te¶cie 39</a></b>
+- jest to warto¶æ parametru MM (tam podane s± równie¿ warto¶ci
+kodów z wyja¶nieniami).</li>
+
+<li>
+bbb - ile razy próbowano wykonaæ <a href="faq_net1.htm#LocationUpdate">Location
+Update</a></li>
+
+<li>
+ccc - ilo¶æ prób wykonania <a href="faq_net1.htm#LocationUpdate">Location
+Update</a> zakoñczonych sukcesem</li>
+
+<li>
+ddd - b³±d przy ostatnim <a href="faq_net1.htm#PLU">PLU</a> lub <a href="faq_net1.htm#IMSIattach">IMSI
+Attach</a> (17 oznacza prawdopodobnie zajêto¶æ sieci)</li>
+
+<li>
+eee - ile razy telefon próbowa³ wykonaæ <a href="faq_net1.htm#PLU">PLU</a> lub
+<a href="faq_net1.htm#IMSIattach">IMSI Attach</a></li>
+
+<li>
+fff - ilo¶æ udanych prób wykonania <a href="faq_net1.htm#PLU">PLU</a> lub
+<a href="faq_net1.htm#IMSIattach">IMSI Attach</a></li>
+</ul>
+
+<p>Warto¶ci tych liczników (z wyj±tkiem kodów b³êdów) s± zapamiêtywane przy
+wy³±czaniu telefonu. Mo¿esz je wyzerowaæ w <b><a href="#Menu60">te¶cie 60</a></b>
+(jest robione równie¿, gdy osi±gn± warto¶ci maksymalne).
+
+<p>W Nokii 3310 parametry s± nieco poprzesuwane w stosunku do rysunku powy¿ej.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27 align=LEFT></td>
+
+<td>Je¿eli nie wy³±czasz telefonu i jeste¶ ca³y czas w zasiêgu swojej sieci,
+to z tego menu mo¿esz siê dowiedzieæ (w przybli¿eniu), jak d³ugo jest w³±czony
+(musisz w
+<b><a href="faq_net3.htm#Menu10">te¶cie 10</a></b> sprawdziæ,
+co ile jest zerowany licznik T3212 (parametr ccc) i pomno¿yæ tamten czas
+przez parametr eee z tego menu). Mo¿esz u¿yæ do tego celu równie¿ licznika
+z <b><a href="#Menu82">testu 82</a></b> (jest dok³adniejszy, ale wymaga
+w³±czenia którego¶ testu) albo menu serwisowego (Nokia 6130 lub 3210).</td>
+</tr>
+</table>
+
+<p>W Nokii 6185/6188 ten test wygl±da inaczej:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+C3M 00 <br>
+C3L 00<br>
+C4M 00<br>
+C4L 03
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu65"></a><b>Test 65</b>
+<br>Menu zwi±zane z wiadomo¶ciami <a href="http://www.fkn.pl/faqs/smsfaq.html">SMS</a>
+(raporty nie s± uwzglêdniane)
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aa bbb ccc <br>
+ dd eee fff<br>
+ gggg<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>SFai MO MOOK<br>
+RFai MT MTOK<br>
+Sched Msgs<br>
+SMS counters</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - numer b³êdu przy wysy³aniu ostatniego <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSa</a>
+(zerowany po w³±czeniu telefonu):
+
+<p>
+<ul>
+<li>
+<tt> 1</tt>: 'Nie ma takiego numeru' ('Number not in use')</li>
+
+<li>
+<tt> 21</tt>: 'Wys³anie nieudane tym razem' ('Message not sent this
+time'). B³±d pojawiaj±cy siê przy próbie wys³ania wiadomo¶ci z Tak-Taka
+(gdy nie mo¿na jeszcze by³o ich by³o z niego wysy³aæ - przed 28.04.2000),
+wysy³aniu pod b³êdny numer (dobre SMSC), przez SMSC zablokowane na
+Twoj± sieæ albo przy próbie wys³ania SMS z numerem alfanumerycznym
+przez SMSC nieobs³uguj±ce tego formatu</li>
+
+<li>
+<tt> 28</tt>: 'Nie ma takiego numeru' ('Number not in use')</li>
+
+<li>
+<tt> 38</tt>: 'Wys³anie nieudane tym razem' ('Message not sent this
+time'). B³±d przy wysy³aniu wiadomo¶ci przez SMSC zablokowane na Twoj±
+sieæ.</li>
+
+<li>
+<tt> 42</tt>: prawdopodobnie b³±d ten pojawia siê, gdy u¿yte SMSC
+jest przeci±¿one (za du¿o wys³anych na raz wiadomo¶ci przez u¿ytkowników)
+i nie mo¿e wys³aæ Twojej wiadomo¶ci</li>
+
+<li>
+<tt> 50</tt>: "Sprawd¼ us³ugi operatora" ("Check operator services").
+B³±d pojawiaj±cy siê przy próbie wys³ania wiadomo¶ci z Tak-Taka
+(gdy nie mo¿na jeszcze by³o ich by³o z niego wysy³aæ - przed 28.04.2000).
+</li>
+
+<li>
+<tt> 96</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed').
+Przyczyn± jest niew³a¶ciwy numer SMSC (+1)</li>
+
+<li>
+<tt>111</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed').
+Przyczyn± jest niew³a¶ciwy numer, pod który wysy³a³e¶ wiadomo¶æ (albo numer
+SMSC)</li>
+
+<li>
+<tt>166</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed').
+Pokazuje siê przy b³êdnym numerze SMSC albo SMSC zablokowanym na Twoj±
+sieæ.</li>
+
+<li>
+<tt>169</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed').
+Brak pieniêdzy przy karcie prepaid.</li>
+
+<li>
+<tt>178</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed').
+B³±d pojawiaj±cy siê przy próbie wys³ania wiadomo¶ci z Tak-Taka
+(gdy nie mo¿na tego jeszcze by³o z niego robiæ - przed 28.04.2000).</li>
+
+<li>
+<tt>252</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed').
+Pojawia siê, gdy zosta³ wy³±czony nadajnik telefonu w <b><a href="faq_net4.htm#Menu45">te¶cie 45</a></b>
+albo telefon nie móg³ znale¼æ sieci (w te¶cie <a href="faq_net1.htm#BTS">BTSa</a>
+z <b><a href="faq_net3.htm#Menu17">testu 17</a></b> zosta³ ustawiony
+taki kana³).</li>
+
+<li>
+<tt>253</tt>: 'Nieudane wys³anie wiadomo¶ci' ('Message sending failed'). Pokazuje
+siê przy b³êdnym numerze SMSC.</li>
+</ul>
+<p>
+</li>
+
+<li>
+bbb - ilo¶æ prób wys³ania <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>.
+Nale¿y pamiêtaæ, ¿e raport o oczekiwaniu SMSa na dostarczenie
+(pending albo oczekuje) nie jest nigdzie
+wysy³any z telefonu i uwzglêdniany w tym parametrze
+(natomiast informacja o jego (nie)dostarczeniu
+przes³ana z SMSC ju¿ tak - patrz opis parametru eee i fff). Przyk³adowo:
+w opcjach telefonu zaznaczy³e¶, ¿e chcesz otrzymywaæ raporty. Wysy³asz SMSa
+- telefon zwiêksza warto¶æ tego parametru. Je¿eli pokaza³, ¿e wys³anie jest udane,
+zwiêksza równie¿ warto¶æ parametru ccc o 1 i zapisuje raport dotycz±cy oczekiwania
+na dostarczenie wys³anego SMSa. Je¿eli SMSC go dostarczy³o (lub nie) i wysy³a
+o tym raport (Nieudane/Failed lub Delivered/Dostarczono), zwiêksza siê warto¶æ parametru eee.
+Je¿eli odebranie tego raportu
+powiedzie siê, zwiêksza siê o 1 równie¿ warto¶æ parametru fff (telefon sprawdza
+teraz wszystkie zapisane raporty. W wiêkszo¶ci Nokii: je¿eli w którym¶ z
+raportów dotycz±cym oczekiwania na dostarczenie zgadza siê numer SMSC i
+numer, pod który wysy³ano wiadomo¶æ, telefon kasuje tamten i zapisuje na jego miejsce
+otrzymany).
+</li>
+
+<li>
+ccc - ilo¶æ poprawnie wys³anych <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>
+(tzn. takich, które zosta³y zaakceptowane przez u¿yte centrum SMS - tylko
+za nie zap³aci³e¶(a¶)). Uwagi dotycz±ce tego parametru s± podane przy opisie
+poprzedniego.</li>
+
+<li>
+ddd - numer b³êdu przy otrzymywaniu ostatniego <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSa</a>
+(zerowany po w³±czeniu telefonu):
+
+<p>
+<ul>
+<li>
+<tt>22</tt>: pe³na pamiêæ przeznaczona na wiadomo¶ci (telefon próbowa³
+przyj±æ <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSa</a> - zwiêkszy³a
+siê warto¶æ licznika eee, nie zmieni³a siê warto¶æ fff). Informuje o tym
+równie¿ mrugaj±ca koperta na samym górze wy¶wietlacza, a telefon pokaza³
+równie¿ oddzielny komunikat 'Brak miejsca na wiêcej wiadomo¶ci' ('No space
+for new messages'). Je¿eli zapisujesz wiadomo¶ci na karcie SIM, ich ³±czna
+ilo¶æ w 'Skrzynce nadawczej' ('Outbox') i 'Skrzynce odbiorczej' ('Inbox')
+zale¿y w³a¶nie od niej (w ró¿nych sieciach komórkowych oferowane s± karty
+SIM z ró¿n± ilo¶ci± mo¿liwych do zapisania wiadomo¶ci <a href="http://www.fkn.pl/faqs/smsfaq.html">SMS</a>
+- dla kart <a href="http://www.plusgsm.pl/">Plusa</a> wynosi ona 10 lub 25, <a href="http://www.eragsm.pl/">Ery</a>
+15, a <a href="http://www.idea.centertel.pl/">Idei</a> 30). Nie mo¿esz
+wiêc dopisywaæ nowych wiadomo¶ci (komunikat 'Pe³na pamiêæ wiadomo¶ci' ('Message
+memory full')). Je¿eli nie wykasujesz której¶ z ju¿ zapisanych wiadomo¶ci,
+mo¿esz utraciæ te przychodz±ce (je¿eli sieæ nie dostarczy ich przez czas
+okre¶lony przez ich nadawcê, zostan± bezpowrotnie wykasowane).</li>
+</ul>
+<p>
+</li>
+
+<li>
+eee - ilo¶æ prób odebrania <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>.
+Uwaga podana przy opisie nastêpnego parameteru dotyczy równie¿ tego.</li>
+
+<li>
+fff - ilo¶æ poprawnie odebranych <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>.
+Nale¿y pamiêtaæ, ¿e raporty o (nie)dostarczeniu <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSa</a>,
+loga, dzwonki, wizytówki i wiadomo¶ci graficzne s± równie¿ dostarczane w tej formie
+(jako odpowiedni <a href="http://www.fkn.pl/faqs/smsfaq.html">SMS</a>)
+i uwzglêdnianie w tym parametrze
+(przy czym ka¿da wiadomo¶æ graficzna wys³ana np. z Nokii 3210 zajmuje
+a¿ 3 <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSy</a>)</li>
+
+<li>
+gggg - ilo¶æ odebranych komunikatów nadawania komórkowego (czy obs³uguje je aktualnie u¿ywany
+<a href="faq_net1.htm#BTS">BTS</a>, sprawdzisz w <a href="faq_net2.htm#Menu7">te¶cie 7</a>):
+ile razy Twój telefon odebra³ komunikaty tzw. cell-info (w³±czasz jego odbiór w <b>Menu 4-2-2</b> w Nokii 5110)
+oraz cell-broadcast (<b>Menu 2-5</b> w Nokii 5110).</li>
+</ul>
+
+<p>Warto¶ci tych liczników (z wyj±tkiem kodów b³êdów) s± zapamiêtywane przy
+wy³±czaniu telefonu. Mo¿esz je wyzerowaæ w <b><a href="#Menu60">te¶cie 60</a></b>
+(jest to robione równie¿, gdy osi±gn± maksymalne warto¶ci).
+
+<p>Otrzyma³em równie¿ informacje, ¿e w niektórych (?) Nokiach 6150 z oprogramowaniem 4.13
+nie zmienia siê warto¶æ licznika gggg pomimo otrzymywania komunikatów
+(czy jest to b³±d w tej wersji oprogramowania ?)
+
+<p>W Nokii 3310 parametry s± nieco poprzesuwane w stosunku do rysunku powy¿ej.
+
+<p>Je¿eli chcesz siê dowiedzieæ troszkê wiêcej o wysy³aniu <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSów</a>
+(albo poznaæ numery SMSC operatorów), zajrzyj pod adres <a href="http://www.vdheyden.demon.nl/sms/index1.htm">www.vdheyden.demon.nl/sms/index1.htm</a>.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>Spora czê¶æ programów komputerowych nie sygnalizuje u¿ytkownikowi, czy
+wiadomo¶æ zosta³a poprawnie wys³ana - Ty bêdziesz móg³ to natomiast sprawdziæ
+dziêki temu testowi.</td>
+</tr>
+</table>
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu64">test 64</a></b>.
+
+<p>W Nokii 6185/6188 ten test wygl±da inaczej:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+C5M 00 <br>
+C5L 00<br>
+C6M 00<br>
+C6L 03
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu66"></a><b>Test 66</b>
+<br>Liczniki przekroczenia czasu zwi±zane z <a href="http://www.fkn.pl/faqs/smsfaq.html">SMSami</a>
+(jak wiadomo, przy wysy³aniu takiej wiadomo¶ci mo¿na ustaliæ czas, przez
+jaki czas sieæ bêdzie próbowa³a j± dostarczyæ do telefonu odbiorcy - przypuszczam,
+¿e te liczniki s± w jaki¶ sposób z tym zwi±zane).
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaa bbb cc <br>
+ ddd eee ff<p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>TR1 TR2 TRA <br>
+TC1 TC2 SCH <br>
+SMS timeout<br>
+ counters</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaa - licznik przekroczenia czasu dla TR1M</li>
+<li>bbb - licznik przekroczenia czasu dla TR2M</li>
+<li>cc - licznik przekroczenia czasu dla TRAM</li>
+<li>ddd - licznik przekroczenia czasu dla TC1M</li>
+<li>eee - licznik przekroczenia czasu dla TC2M</li>
+<li>ff - licznik przekroczenia czasu dla nadawania komórkowego</li>
+</ul>
+
+<p>Warto¶ci liczników za zapamiêtywane przy wy³±czaniu telefonu. Je¿eli osi±gn±
+warto¶ci maksymalne, s± zerowane. Mo¿esz je równie¿ wyzerowaæ w
+<b><a href="#Menu60">te¶cie 60</a></b>.
+
+<p>W Nokii 6185/6188 ten test wygl±da inaczej:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+CT1 82 <br>
+CT2 00<br>
+RF 23<br>
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu67"></a><b>Test 67</b>
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+REC 00<br>
+SEND 00 <br>
+CTR 4C<br>
+STA 68
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu68"></a><b>Test 68</b>
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+CNT 00 <br>
+ACK 00<br>
+ <br>
+M1M B3
+</i>
+</tt></td>
+</tr>
+</table>
+
+<p><a NAME="Menu70"></a><b>Test 70</b>
+<br>Zawarto¶æ tymczasowych liczników <a href="faq_net1.htm#DSP">DSP</a> (szesnastkowe
+warto¶ci komórek pamiêci oznaczanych w opisach jako r_dsp2ftd+0, r_dsp2ftd+1,
+r_dsp2ftd+2, itd.)
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaa bbbbb<br>
+ccccc ddddd<br>
+eeeee fffff<br>
+ggggg hhhhh</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Temporary<br>
+DSP counters<br>
+ R DSP2FTD<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Ten test jest u¿ywany przez debuggery
+oprogramowania <a href="faq_net1.htm#DSP">DSP</a>. Mog± one wstawiaæ pewne
+u¿yteczne informacje do okre¶lonych komórek pamiêci. Kiedy ten test jest wybrany,
+<a href="faq_net1.htm#MCU">MCU</a> pokazuje zawarto¶æ tych komórek pamiêci
+na wy¶wietlaczu w podanym wy¿ej formacie.
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu80">test 80</a></b>.
+
+<p><a NAME="Menu71_72"></a><b>Test 71, 72</b>
+<br>Oba menu pozwalaj± kontrolowaæ ustawienia <a href="faq_net1.htm#DSP">DSP</a>
+
+<p>Je¿eli wejdziesz bezpo¶rednio do którego z nich, w obu zmieniaj± siê
+cyferki pod AUDIO ENHANCEMENT - ich warto¶ci zale¿± od w³o¿onej karty SIM.
+W zale¿no¶ci od tego, które z nich teraz ogl±da³e¶(a¶) (u¿ywaj±c strza³ek),
+zmieni siê d¼wiêk (mog± siê np. pojawiæ okropne szumy i trzaski). Mo¿esz
+mieæ wp³yw na te warto¶ci (mog± mieæ maksymaln± warto¶æ 65536) - wystarczy
+je zapisaæ odpowiednio w 31 i 32 pozycji ksi±¿ki telefonicznej na karcie
+SIM (jak to zrobiæ ? opis znajdziesz przy <b><a href="faq_net3.htm#Menu17">te¶cie 17</a></b>).
+Parametr Conf z <b><a href="faq_net4.htm#Menu30">testu 30</a></b>
+pokazuje natomiast wybran± tutaj warto¶æ. ¯eby wróciæ do stanu wyj¶ciowego,
+musisz wy³±czyæ i w³±czyæ telefon. Na jako¶æ d¼wiêku (tzn. czy przy pewnych
+ustawieniach pojawiaj± siê zak³ócenia) nie wp³ywa pod³±czenie zestawu s³uchawkowego
+i samochodowego.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> AUDIO<br>
+ ENHANCEMENT<br>
+ aaaaa<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to<br>
+control DSP<br>
+ audio<br>
+enhancements</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>W Nokii 3110 test 71 wygl±da jak <b><a href="#Menu81">test 81</a></b>.
+
+<p><a NAME="Menu73"></a><b>Test 73</b>
+<br>Ogólne informacje o ustawieniach <a href="faq_net1.htm#DSP">DSP</a>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaa bb aaa<br>
+cccc bb cccc<br>
+cccc bb cccc<br>
+ cccc cccc</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>DB1 B1 DB2<br>
+HEX1 B2 HEX2<br>
+HEX3 B3 HEX4<br>
+ HEX5 HEX6</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - g³ówna g³o¶no¶æ (poziom sygna³u) w dB. Znak czê¶ci u³amkowej i znak
+nie jest pokazywany (np. zamiast -10.5 zobaczysz 105)</li>
+
+<li>
+bb - g³ówna warto¶æ (podana szesnastkowo) bajtu (u¿ywana dla mieszanych
+znaczników).</li>
+
+<li>
+cccc - g³ówna warto¶æ szesnastkowa</li>
+</ul>
+
+<p>Angielskie opisy pisz± o tym te¶cie:
+<br>"Warto¶ci liczników s± pokazywane tylko w czasie rozmowy
+(gdy w³±czone s± testy monitora). Je¿eli po³±czenie
+jest przerwane, zatrzymuj± siê one na ostatnich warto¶ciach. Ich warto¶ci
+nie s± zapamiêtywane przy wy³±czaniu telefonu."
+
+<p>...ale ja tego nie zauwa¿y³em i u mnie zawsze by³y równe 0
+(czy trzeba jako¶ dodatkowo w³±czyæ ten test ?)
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu82">test 82</a></b>.
+
+<p><a NAME="Menu74"></a><b>Test 74</b>
+<br>Informacje o g³o¶no¶ci podczas rozmowy
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaa bbb <br>
+ ccc<br>
+ dd ee<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>DSigL USigL<br>
+ NseLvl<br>
+ DTbl UTbl<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - g³o¶no¶æ sygna³u z telefonu naszego rozmówcy.</li>
+
+<li>
+bbb - g³o¶no¶æ sygna³u z Twojego telefonu.</li>
+
+<li>
+ccc - g³o¶no¶æ tzw. "komfortowego szumu" (patrz opis <a href="faq_net1.htm#DTX">DTX</a>).</li>
+
+<li>
+dd - warto¶æ DRC dla sygna³u z telefonu naszego rozmówcy (dwucyfrowa liczba
+ca³kowita)</li>
+
+<li>
+ee - warto¶æ DRC dla sygna³u z Twojego telefonu (dwucyfrowa liczba ca³kowita)</li>
+</ul>
+
+<p>Pierwsze trzy parametry s± podawane w dB i obliczane na podstawie DRC.
+Znak czê¶ci u³amkowej i znak liczby nie s± pokazywane (np. zamiast
+-10.5 zobaczysz 105).
+
+<p>Angielskie opisy pisz± o tym te¶cie:
+<br>"Warto¶ci liczników s± pokazywane tylko w czasie rozmowy
+(gdy w³±czone s± testy monitora). Je¿eli po³±czenie
+jest przerwane, zatrzymuj± siê one na ostatnich warto¶ciach. Ich warto¶ci
+nie s± zapamiêtywane przy wy³±czaniu telefonu."
+
+<p>...ale ja tego nie zauwa¿y³em i u mnie zawsze by³y równe 0
+(czy trzeba jako¶ dodatkowo w³±czyæ ten test ?)
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu71_72">test 72</a></b>.
+
+<p><a NAME="Menu75"></a><b>Test 75</b>
+<br>Informacje o trybie pracy pod³±czonych akcesoriów d¼wiêkowych
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>Mod:aaaaaaa<br>
+AudReq: bbbb<br>
+AccMod: cccc<br>
+H2Path: dddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>ExtAudStatus<br>
+AudioRequest<br>
+AccAudMode<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaa - rodzaj pod³±czonych do telefonu akcesoriów d¼wiêkowych
+(dla niektórych telefonów mo¿liwe warto¶ci to:
+HP, HF, HEADSET, EXT albo HP_OFFHO). W Nokii 7110 podawany w <a href="faq_net6.htm#Menu99">test 99</a>.
+
+<p>Je¶li chodzi o Nokiê 5110, przyjmowane by³y nastêpuj±ce
+warto¶ci:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr ALIGN=CENTER><td></td><td>warto¶æ</td></tr>
+<tr ALIGN=CENTER><td>stan normalny (nie pod³±czono nic, jest kabel FBUS/M2BUS albo ³adowarka)</td><td>HP</td></tr>
+
+<tr ALIGN=CENTER><td>zestaw s³uchawkowy (telefon wy¶wietla Mikrozestaw (Headset))
+<br>Mo¿esz go zasymulowaæ
+<br>³±cz±c piny 1-2 z³±cza na dole telefonu
+<br>(patrz±c od lewej strony, gdy telefon le¿y wy¶wietlaczem do góry).
+<br>W Nokii 9110 mo¿esz do tego u¿yæ równie¿ <b><a href="faq_net6.htm#Menu92">testu 92</a></b>.</td>
+<td>HD (skrót od <b>H</b>ea<b>D</b>set)</td>
+</tr>
+
+<tr ALIGN=CENTER>
+<td>zestaw samochodowy (telefon wy¶wietla Samochód (Car))
+<br>Mo¿esz go zasymulowaæ
+<br>³±cz±c piny 2-3 z³±cza na dole telefonu
+<br>(patrz±c od lewej strony, gdy telefon le¿y wy¶wietlaczem do góry)</td>
+<td>HFU 1 (skrót od <b>H</b>ands <b>F</b>ree <b>U</b>nit 1)</td>
+</tr>
+</table>
+
+<p>Powy¿sze metody symulacji zestawów s± poprawne dla Nokii 5xxx, 6xxx
+i zapewne 9110 (u¿ywasz ich na W£ASN¡ odpowiedzialno¶æ).
+
+<p>Po pod³±czeniu (symulacji) obu zestawów w telefonie uaktywnia³a siê funkcja
+"Odbiór samoczynny" ("Automatic answer") - <b>Menu 4-1-6</b> w Nokii 5110 - dziêki
+której telefon mo¿e automatycznie odbieraæ przychodz±ce po³±czenie. W Nokii 9110
+mo¿esz j± uaktywniæ równie¿ m.in. u¿ywaj±c <a href="faq_net6.htm#Menu92"><b>testu 92</b></a>.
+<p>
+</li>
+
+<li>
+bbbb - audio_request bitmap in hex</li>
+
+<li>
+cccc - tryb pracy akcesoriów d¼wiêkowych</li>
+
+<li>
+dd - ¶cie¿ka dla HFU-2 (<b>H</b>ands <b>F</b>ree <b>U</b>nit-2)</li>
+</ul>
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu73">test 73</a></b>.
+
+<p><a NAME="Menu76"></a><b>Test 76</b>
+<br>Informacje o d¼wiêku, który Ty s³yszysz w swoim telefonie
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> Vab Pccc<br>
+ Cddd CAeee<br>
+PAfff<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>EVol PeakVal<br>
+CutOff COAve<br>
+PkAver<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+ab - g³o¶no¶æ (poni¿sze informacje s± na pewno poprawne dla Nokii 5110):
+
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr><td></td><td><b>a</b></td><td><b>b</b></td></tr>
+<tr ALIGN=CENTER><td>g³o¶nik wy³±czony</td><td>0</td><td>F</td></tr>
+
+<tr ALIGN=CENTER>
+<td>wydawany jest d¼wiêk po naci¶niêciu klawisza (poziom g³o¶no¶ci 1)</td>
+<td>0</td><td>8</td>
+</tr>
+
+<tr ALIGN=CENTER>
+<td>wydawany jest d¼wiêk po naci¶niêciu klawisza (poziom g³o¶no¶ci 2)</td>
+<td>0</td><td>4</td>
+</tr>
+
+<tr ALIGN=CENTER>
+<td>wydawany jest d¼wiêk po naci¶niêciu klawisza (poziom g³o¶no¶ci 3 albo
+w³±czone g³o¶ne d¼wiêki)</td>
+<td>0</td><td>0</td>
+</tr>
+
+</table>
+
+<p>W czasie po³±czenia parametr a przyjmuje warto¶æ "A", natomiast parametr
+b pozwala obliczyæ ustawion± g³o¶no¶æ d¼wiêku (musisz przeliczyæ go na
+warto¶æ dziesiêtn± i odj±æ od niego 11) - tê ostatni± mo¿esz równie¿ sprawdziæ
+w <b><a href="faq_net4.htm#Menu30">te¶cie 30</a></b>. Przy pod³±czonym
+zestawie s³uchawkowym parametr a przyjmuje natomiast warto¶æ "C" (wzór do obliczenia
+g³o¶no¶ci rozmowy przyjmuje wtedy warto¶æ 10 - b). Je¿eli do telefonu pod³±czony
+jest zestaw samochodowy, parametr a jest równy "2", a wzór na g³o¶no¶æ podczas rozmowy
+przyjmuje warto¶æ 10 - b.
+
+<p>Je¿eli kto¶ do Ciebie dzwoni (nie odebra³e¶(a¶) jeszcze po³±czenia),
+telefon nie zawsze pokazuje g³o¶no¶æ emitowanego d¼wiêku (zachowuje siê
+tak jak przy wy³±czonym g³o¶niku) - nie wiem, czy jest to b³±d w oprogramowaniu
+testuj±cym (wersja 5.07), czy co¶ innego. Tylko bowiem przy pewnych kombinacjach
+ustawieñ rodzaju dzwonka (ci±g³y, wzrastaj±cy, itp.) i jego g³o¶no¶ci jest
+ona pokazywana (podajê od razu warto¶ci obu parametrów): poziom 1 - A7,
+poziom 2 - A6, poziom 4 - A4, poziom 5 - A0.
+</li>
+
+<li>
+<p>ccc - maksymalna g³o¶no¶æ sygna³u z telefonu Twojego rozmówcy w czasie
+ostatniej ramki (podawana w dB). Znak i znak czê¶ci dziesiêtnej nie s±
+pokazywane (np. zamiast -10.5 zobaczysz 105).</li>
+
+<li>
+<p>ddd - licznik pokazuj±cy ilo¶æ próbek sygna³u akustycznego, w których nast±pi³o
+przepe³nienie (tak jak przesterowanie), w czasie ostatniej ramki.</li>
+
+<li>
+<p>eee - ¶rednia licznika podawanego jako poprzedni parametr. Znak i znak
+czê¶ci dziesiêtnej nie s± pokazywane (np. zamiast -10.5 zobaczysz 105).</li>
+
+<li>
+<p>fff - ¶rednia g³o¶no¶æ s³yszanego przez Ciebie d¼wiêku</li>
+</ul>
+
+<p>Angielskie opisy pisz± o tym te¶cie:
+<br>"Warto¶ci liczników s± pokazywane tylko w czasie rozmowy
+(gdy w³±czone s± testy monitora). Je¿eli po³±czenie
+jest przerwane, zatrzymuj± siê one na ostatnich warto¶ciach. Ich warto¶ci
+nie s± zapamiêtywane przy wy³±czaniu telefonu."
+
+<p>...ale ja tego nie zauwa¿y³em i u mnie zawsze (bez pierwszego) by³y równe 0
+(czy trzeba jako¶ dodatkowo w³±czyæ ten test ?)
+
+<p><a NAME="Menu77"></a><b>Test 77</b>
+<br>Informacje o d¼wiêku, który s³yszy Twój rozmówca (tzn. parametry d¼wiêku
+wysy³anego przez Twój telefon)
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> Paaa Abbb <br>
+ Cccc CAddd<p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>MicPeak MAve<br>
+CutOff COAve<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - maksymalna g³o¶no¶æ wysy³anego d¼wiêku w czasie ostatniej ramki w
+dB. Znak czê¶ci u³amkowej i znak liczby nie s± pokazywane (np. zamiast
+-10.5 zobaczysz 105).</li>
+
+<li>
+bbb - przeciêtna g³o¶no¶æ wysy³anego d¼wiêku w dB. Znak czê¶ci u³amkowej
+i znak liczby nie s± pokazywane (np. zamiast -10.5 zobaczysz 105).</li>
+
+<li>
+ccc - licznik pokazuj±cy ilo¶æ próbek sygna³u akustycznego, w których nast±pi³o
+przepe³nienie (tak jak przesterowanie), w czasie ostatniej ramki.</li>
+
+<li>
+ddd - ¶rednia licznika podawanego jako poprzedni parametr.</li>
+</ul>
+
+<p>Angielskie opisy pisz± o tym te¶cie:
+<br>"Warto¶ci liczników s± pokazywane tylko w czasie rozmowy
+(gdy w³±czone s± testy monitora). Je¿eli po³±czenie
+jest przerwane, zatrzymuj± siê one na ostatnich warto¶ciach. Ich warto¶ci
+nie s± zapamiêtywane przy wy³±czaniu telefonu."
+
+<p>...ale ja tego nie zauwa¿y³em i u mnie zawsze by³y równe 0
+(czy trzeba jako¶ dodatkowo w³±czyæ ten test ?)
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu75">test 75</a></b>.
+
+<p><a NAME="Menu78"></a><b>Test 78</b>
+<br>Kolejne parametry <a href="faq_net1.htm#DSP">DSP</a>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaa bbb ccc <br>
+ddd eee fff<br>
+ggg h i jjj<br>
+ kkkk llll</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>EAA Ada ERL <br>
+RxG TxG GLi<br>
+TxN Sta Mod<br>
+ RVAD TVAD</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaa - poziom cyfrowego t³umienia echa z punktu widzenia <a href="faq_net1.htm#DSP">DSP</a>
+:-) w dB. Znak liczby i czê¶ci u³amkowej nie s± pokazywane (np. -10.5 dB
+bêdzie wy¶wietlane jako "105", -0.5 dB za¶ jako " 5"). 20*log10(
+Q15 )</li>
+
+<li>
+bbb - poziom adaptacyjnego t³umienia echa (znak czê¶ci u³amkowej nie jest
+pokazywany). 20*log10( Q15 )</li>
+
+<li>
+ccc - poziom st³umienia sygnalu, który wraca po odbiciu (znak czê¶ci u³amkowej
+nie jest pokazywany). 20*log10( Q15 )</li>
+
+<li>
+ddd - t³umienie t³umika sygna³u odbieranego (akustyczne) w dB. Znak liczby
+i czê¶ci u³amkowej nie s± pokazywane. 20*log10( Q15 aec_rx_gain )</li>
+
+<li>
+eee - t³umienie t³umika sygna³u nadawanego (akustyczne) w dB. Znak liczby
+i czê¶ci u³amkowej nie s± pokazywane. 20*log10( Q15 aec_tx_gain )</li>
+
+<li>
+fff - ograniczenie dla dwóch powy¿szych parametrów (ddd i eee) - znak liczby
+i czê¶ci u³amkowej nie s± pokazywane. 20*log10( Q15 aec_gain_limit )</li>
+
+<li>
+ggg - g³o¶no¶æ nadawanego "komfortowego szumu" (patrz opis <a href="faq_net1.htm#DTX">DTX</a>)
+w dB. Znak czê¶ci u³amkowej i znak liczny nie s± pokazywane. 20*log10(
+Q15 aec_tx_noise)</li>
+
+<li>
+h - stan filtru adaptacyjnego. (Q0 aec_nlms_state) (bit UPDATE <<
+2) | (bit NLMS2 << 1) | (bit NLMS1)</li>
+
+<li>
+i - informacja, o tym czy jest generowany tzw. "komfortowy szum" - patrz
+opis <a href="faq_net1.htm#DTX">DTX</a> (warto¶ci 0 lub 1) (Q0 AEC_TX_COMF_GEN)</li>
+
+<li>
+jjj - tryb pracy uk³adu t³umików i filtru adaptacyjnego (AEC) (byte Q0
+s_AEC_mode)</li>
+
+<li>
+kkkk - ostatnich 16 decyzji uk³adu wykrywania g³osu dla sygna³u odbieranego
+(RX VAD) w formacie szesnastkowym. Hex( Q0 aec_rx_vadreg )</li>
+
+<li>
+llll - ostatnich 16 decyzji uk³adu wykrywania g³osu dla sygna³u nadawanego
+(TX VAD) w formacie szesnastkowym. Hex( Q0 aec_tx_vadreg )</li>
+</ul>
+
+<p>U mnie warto¶ci tych liczników zawsze by³y równe 0
+(czy trzeba jako¶ dodatkowo w³±czyæ ten test ?)
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu76">test 76</a></b>.
+
+<p><a NAME="Menu79"></a><b>Test 79</b>
+<br>Wy¶wietlacz equalizera audio
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaa bbbbb<br>
+ccccc ddddd<br>
+-ee.e -ff.f <br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>MiCutB MiCTA<br>
+EpCutB EPCTA<br>
+MiCLev EarLv<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaa - próbki sygna³u akustycznego, w których nast±pi³o przepe³nienie
+(tak jak przesterowanie), przed przej¶ciem przez equalizer mikrofonowy
+w postaci 16-bitowej ca³kowitej (dziesiêtnej) liczby.</li>
+
+<li>
+bbbbb - próbki sygna³u akustycznego, w których nast±pi³o przepe³nienie
+(tak jak przesterowanie), po przej¶ciu przez equalizer mikrofonowy w postaci
+16-bitowej ca³kowitej (dziesiêtnej) liczby.</li>
+
+<li>
+ccccc - próbki sygna³u akustycznego, w których nast±pi³o przepe³nienie
+(tak jak przesterowanie), przed przej¶ciem przez equalizer g³o¶nikowy w
+postaci 16-bitowej ca³kowitej (dziesiêtnej) liczby.</li>
+
+<li>
+ddddd - próbki sygna³u akustycznego, w których nast±pi³o przepe³nienie
+(tak jak przesterowanie), po przej¶ciu przez equalizer g³o¶nikowy w postaci
+16-bitowej ca³kowitej (dziesiêtnej) liczby.</li>
+
+<li>
+-ee.e - g³o¶no¶æ d¼wiêku wychwytywanego przez mikrofon w formacie dB. Wymaga
+funkcji matematycznej log10 w <a href="faq_net1.htm#MCU">MCU</a>.
+16 bitowa warto¶æ w <a href="faq_net1.htm#DSP">DSP</a>,
+0 dB = 32768.</li>
+
+<li>
+-ff.f - g³o¶no¶æ sygna³u po przej¶ciu przez equalizer g³o¶nikowy w formacie
+dB. Wymaga funkcji matematycznej log10 w <a href="faq_net1.htm#MCU">MCU</a>.
+16 bitowa warto¶æ w <a href="faq_net1.htm#DSP">DSP</a>,
+0 dB = 32768.</li>
+</ul>
+
+<p>Angielskie opisy pisz± o tym te¶cie:
+<br>"Warto¶ci liczników s± pokazywane tylko w czasie rozmowy. Je¿eli po³±czenie
+jest przerwane, zatrzymuj± siê one na ostatnich warto¶ciach.
+Ich warto¶ci nie s± zapamiêtywane przy wy³±czaniu telefonu. Warto¶ci liczników
+aaaaa-ddddd s± obliczane w <a href="faq_net1.htm#DSP">DSP</a> (i tylko
+nowe s± wysy³ane do <a href="faq_net1.htm#MCU">MCU</a>. Poziomy sygna³u
+mikrofonowego i g³o¶nikowego s± obliczane w <a href="faq_net1.htm#DSP">DSP</a>,
+który wysy³a liniowe warto¶ci do <a href="faq_net1.htm#MCU">MCU</a>, który z kolei
+dokonuje liniowej transformacji dB (20*log10(x)) do warto¶ci g³o¶no¶ci".
+
+<p>...ale ja tego nie zauwa¿y³em i u mnie zawsze by³y równe 0
+(czy trzeba jako¶ dodatkowo w³±czyæ ten test ?)
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu77">test 77</a></b>.
+
+<p><a NAME="Menu80"></a><b>Test 80</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> TIMERS <br>
+ RESET <br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Use menu<br>
+ to reset<br>
+ field test <br>
+ timers</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Przez bezpo¶rednie wej¶cie do tego menu mo¿esz wyzerowaæ liczniki z <b><a href="#Menu82">testu 82</a></b>.
+Telefon robi to automatycznie, gdy od³±czasz od niego ³adowarkê.
+Wed³ug opisów angielskich, dzieje siê tak równie¿, gdy akumulator jest
+na³adowany (ja tego nie zaobserwowa³em).
+
+<p>W niektórych nowych telefonach (np. Nokii 3310 z oprogramowaniem 4.45)
+po u¿yciu tego testu zeruj± siê
+ORAZ w³±czaj± (test ten dzia³a wiêc równie¿ jak
+<a href=#Menu81>test 81</a>)
+liczniki <b><a href="#Menu82">testu 82</a></b>.
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu83">test 83</a></b>.
+
+<p><a NAME="Menu81"></a><b>Test 81</b>
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> TIMERS <br>
+ aaaaaaaa<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to<br>
+control test<br>
+ display<br>
+ timers</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>Przez bezpo¶rednie wej¶cie do tego menu mo¿esz w³±czyæ (aaaaaaaa=ENABLED) lub
+wy³±czyæ (aaaaaaaa=DISABLED) licznik z <b><a href="#Menu82">testu 82</a></b>.
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu84_86">test 84</a></b>.
+
+<p><a NAME="Menu82"></a><b>Test 82</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaa bbbbb <br>
+ccccc ddddd<br>
+ TIMERS eee<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>PwrOn InServ<br>
+NSPS TxON<br>
+ Timers<br>
+ Status</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaa - informacja, ile d³ugo telefon by³ w³±czony</li>
+
+<li>
+bbbbb - informacja, jak d³ugo telefon by³ zalogowany do sieci</li>
+
+<li>
+ccccc - informacja, jak d³ugo
+telefon by³ w stanie <a href="faq_net2.htm#NSPS">NSPS</a></li>
+
+<li>
+ddddd - informacja, jak d³ugo by³ w³±czony nadajnik telefonu</li>
+
+<li>
+eee - informacja, czy liczniki s± w³±czone (ON) czy wy³±czone (OFF) (zmieniæ
+to mo¿na w <b><a href="#Menu81">te¶cie 81</a></b>)</li>
+</ul>
+
+<p>Ka¿dy z tych liczników ma formê aaabb - liczba bb zmienia siê w zakresie
+od 0 do 60 jednostek; po osi±gniêciu warto¶ci 60
+jest zerowana - równocze¶nie zwiêksza siê o 1 liczba aaa.
+W wiêkszo¶ci modeli jednostk± jest minuta (tzn. ka¿dy z liczników pokazuje czas
+jako minuty i godziny), wyj±tkiem jest Nokia 7110, gdzie jednostk± jest 30 sekund
+i niektóre Nokie 3310 (jednostka=1 minuta 7 sekund)...
+
+<p>Wed³ug angielskich opisów maksymalna warto¶æ wynosi 99 h i 59 minut. Je¿eli
+pierwszy (aaaaa) licznik osi±gnie tê warto¶æ, wszystkie liczniki stan±.
+
+<p>Niestety liczniki dzia³aj± tylko wtedy, gdy w³±czysz jaki¶ test w monitorze
+sieci (tzn. gdy wy³±czysz testy, nie bêd± odmierzaæ czasu pomimo wy¶wietlonej
+informacji, ¿e s± w³±czone). Oznacza to, ¿e faktycznie mo¿esz tutaj
+znale¼æ informacjê o tym, ile korzystasz z monitora sieci (pierwszy parametr),
+ile czasu telefon by³ w tym czasie zalogowany do sieci (nastêpny), itd.
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>Je¿eli nie mo¿esz zrezygnowaæ z odmierzania czasu, proponujê w
+<b><a href="#Menu83">te¶cie 83</a></b> wybraæ SHOW TASK MSG BUFS i w³±czyæ
+<b><a href="#Menu87">test 87</a></b> (wy¶wietlacz bêdzie pusty).
+Jedyn± niedogodno¶ci± tego rozwi±zania
+bêdzie to, ¿e nie bêdziesz mia³(a) identyfikacji osób dzwoni±cych do Ciebie.
+
+<p>W menu serwisowym Nokii 6130 (kod <b>*#WARRANTY#</b>) i 3210 (kod <b>*#WAR0ANTY#</b>) pod
+pozycj± "Life Timer" znajdziesz informacjê ile czasu rozmawia³e¶(a¶) - cyfry przed
+dwukropkiem oznaczaj± godziny, cyfry po nim minuty. Przyk³adowo, 0011:34 to 11 h 34
+minuty czasu rozmowy. W Nokii 3310 (równie¿ kod <b>*#WAR0ANTY#</b>)
+na samym pocz±tku pokazywana jest tam liczba 65536, a licznik zaczyna
+dzia³aæ, gdy przez telefon rozmawiano d³u¿ej ni¿ 1 h.
+</td>
+</tr>
+</table>
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu84_86">test 85</a></b>.
+
+<p><a NAME="Menu83"></a><b>Test 83</b>
+
+<p>
+<center><table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> SHOW TASK <br>
+ STACKS<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> SHOW TASK <br>
+ MSG BUFS<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td>
+<br><tt> SHOW TASK <br>
+ FAST BUFS<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Use menu to<br>
+select shown<br>
+ task info<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table></center>
+
+<p>Przez bezpo¶rednie wej¶cie do tego menu mo¿na spowodowaæ, ¿e w <b>Menu
+10-84</b>, <b>test 85</b>, <b>test 86</b>, <b>test 87</b> s± pokazywane
+warto¶ci innych liczników:
+
+<p>
+<ul>
+<li>
+"STACKS" - pokazuje wolne miejsce w bloku pamiêci w najgorszym razie</li>
+
+<li>
+"MSG BUFS" - pokazuje najwy¿sz± ilo¶æ bêd±cych w takcie realizacji wiadomo¶ci.</li>
+
+<li>
+"FAST BUFS" - pokazuje najwy¿sz± ilo¶æ bed±cych w trakcie realizacji szybkich
+wiadomo¶ci.</li>
+</ul>
+
+<p>W Nokii 3110 test ten wygl±da jak <b><a href="#Menu84_86">test 86</a></b>.
+
+<p><a NAME="Menu84_86"></a><b>Test 84, 85, 86</b>
+<br>Tak ogólnie wygl±daj± te menu:
+
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb <br>
+ cccc dddd<br>
+ eeee ffff<br>
+ gggg hhhh</tt></td>
+</tr>
+</table>
+
+<p>A tak wygl±da ich pomoc:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr ALIGN=CENTER>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>IDLE DEV_IO<br>
+LOCAL MDISND<br>
+MDIRCV UI<br>
+ TONE PN</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 6210/8210):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>IDLE DEV_IO<br>
+LOCAL MDISND<br>
+MDIRCV UI<br>
+ TONE PND</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 6250):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>IDLE DEV?IO<br>
+LOCAL MDISND<br>
+MDIRCV UI<br>
+ TONE PND</b></tt></td>
+</tr>
+</table>
+
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> FBUS AUD<br>
+L1CTRL L1MEA<br>
+L1SYSP L2<br>
+ CC MM</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 3210):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>IRDA FBUS<br>
+AUD L1CTRL<br>
+L1MEA L1SYSP<br>
+L2 CC</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 6210/6250):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+WMLS PN<br>
+IRDA IRDAMGR<br>
+FBUS AUD<br>
+PHCTRL L2
+</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 8210):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+IRDA IRDAMGR<br>
+FBUS AUD<br>
+PHCTRL L2<br>
+CC MM<br>
+</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 8810):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>IRDA IRMGR<br>
+FBUS AUD<br>
+L1CTRL L1MEA<br>
+L1SYSP L2</b></tt></td>
+</tr>
+</table>
+
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> RR RM<br>
+ SMS EM<br>
+SIMUPL SIML2<br>
+ DDI</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 3210):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>MM RR<br>
+RM SMS<br>
+EM SIMUPL<br>
+SIML2 DDI</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 6210/6250):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ CC MM RR<br>
+RMC SMS EM<br>
+SIM SIM2 DDI<br>
+DGC NTB FAX
+</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 8210):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+RR RM<br>
+SMS EM<br>
+SIMUPL SIML2<br>
+DDI DGC<br>
+</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 8810):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CC MM<br>
+RR RM<br>
+SMS EM<br>
+SIMUPL SIML2</b></tt></td>
+</tr>
+</table>
+
+<p>albo (w Nokii 9110):
+<p>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> RR RM<br>
+SMS EM<br>
+SIMUPL SIML2<br>
+ DGC DGNTB</b></tt></td>
+</tr>
+</table>
+
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa, bbbb,... - zadanie 0, 1, itd.</li>
+</ul>
+
+<p>Liczby okre¶laj±ce, jak bardzo komórki pamiêci zwi±zane ze stosami s± puste
+w najgorszym wypadku (je¿eli pokazuje siê 0, stos jest pe³ny). Warto¶ci
+nie s± zapisywane w pamiêci przy wy³±czaniu telefonu.
+
+<p>W Nokii 3110 test 86 wygl±da nastêpuj±co:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>MCUSW aaaaa<br>
+DATE cccccc<br>
+CHKSUM dddd<br>
+DSP eee</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>MCUSWVersion<br>
+DateOfMCUSW<br>
+MCUSWChecksum<br>
+DSPSWVersion</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Znaczenie parametrów aaaaa,cccccc, dddd i eee znajdziesz w <b><a href="#Menu88">te¶cie 88</a></b>.
+
+<p><a NAME="Menu87"></a><b>Test 87</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaa bbbb <br>
+ <p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> FIQ IRQ <br>
+ <p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - OS_SYSTEM_STACK</li>
+</ul>
+
+<p>W Nokii 8810 menu to wygl±da tak:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ ffff gggg<br>
+ eeee dddd <br>
+ aaaa bbbb <br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ DDI DGC<br>
+ DGNTB DGFAX<br>
+ FIQ IRQ<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>W Nokii 9110 menu to wygl±da natomiast tak:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> cccc dddd <br>
+ aaaa bbbb <p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> DGTB DGFAX<br>
+ FIQ IRQ<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>W Nokii 7110 jest jeszcze trochê inne:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+1040010363800<br>
+ 700 800<br>
+ 220<br>
+ 476 480
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+DGN DGF SCKT<br>
+PCL PWB<br>
+PPC<br>
+FIQ IRQ
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>i w Nokii 6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+SRVSCK PMMCL<br>
+PMMWR ND<br>
+PPC<br>
+FIQ IRQ
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>i w Nokii 8210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+NTB FAX<br>
+PMMWR ND<br>
+FIQ IRQ<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Stan licznika nie jest zapisywany przy wy³±czaniu telefonu.
+
+<p><a NAME="Menu88"></a><b>Test 88</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaa bbbbbb<br>
+Date cccccc<br>
+ChkSum dddd<br>
+eeeeeeeeeeee</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>MCUSW PPM<br>
+MCUSW_Date<br>
+MCU_Checksum<br>
+DSP_Version</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaaa i cccccc - wersja i data oprogramowania <a href="faq_net1.htm#MCU">MCU</a>
+(kody do ich sprawdzenia i ró¿nice miêdzy ró¿nymi ich wersjami
+s± szczegó³owo opisane na <a href="../firmware/firmware.htm">tej stronie</a>)</li>
+
+<li>
+bbbbbb - wersja wgranego do telefonu pakietu PPM (<b>P</b>ost-<b>p</b>rogramming <b>M</b>emory):
+firma <a href="http://www.nokia.com">Nokia</a> przygotowywuje ró¿ne wersje jêzykowe
+oprogramowania do swoich telefonów. S± one zapisywane w "paczkach" - ka¿da z nich
+zawiera komunikaty i obs³ugê kilku jêzyków.
+Powód takiego postêpowania jest prosty: komunikaty we wszystkich jêzykach ¶wiata
+nie zmie¶ci³yby siê w pamiêci telefonów.
+Tutaj zobaczysz w³a¶nie wersjê wgranego pakietu <b>PPM</b>: jest to liczba
+zgodna z wersj± oprogramowania <a href="faq_net1.htm#MCU">MCU</a>, po której
+pojawia siê litera (mo¿e to byæ "A", "B", itd. - jêzyk polski jest dostêpny w pakiecie "B").
+I st±d zapewne jasne jest, ¿e je¿eli Twój telefon zosta³ przywieziony z zagranicy
+i nie ma obs³ugi jakiego¶ jêzyka (polskiego ?), trzeba wgraæ do niego inny pakiet <b>PPM</b>.
+
+<p>Dla ciekawych: je¿eli chodzi o starsze modele (np. Nokiê 2110i) - tam nie by³o pakietów
+<b>PPM</b>, a zmiana wersji jêzykowej wi±za³a siê z wymian± CA£EGO oprogramowania s³uchawki.
+Czyta³em równie¿, i¿ sprzedawane telefony z "ogólnym" oprogramowaniem mia³y fabrycznie
+deaktywowan± obs³ugê niektórych jêzyków (np. greckiego) - mo¿na by³o j± w³±czyæ przy u¿yciu
+niektórych programów serwisowych (np. PC-Locals 0.6).
+<p>
+</li>
+
+<li>
+dddd - suma kontrolna pamiêci <a href="faq_net1.htm#MCU">MCU</a>
+(gdy jest b³êdna, telefon wy¶wietla CONTACT SERVICE)</li>
+
+<li>
+eeeeeeeeeeee - wersja oprogramowania <a href="faq_net1.htm#DSP">DSP</a></li>
+</ul>
+
+<p>Informacje z tego menu s± równie¿ podawane w ró¿nych programach serwisowych (np.
+PC-Locals 1.3 albo WinTesli).
+
+<p>W Nokii 6210 zamiast znaków "_" w pomocy pokazywane s± "?"
+
+<p><a NAME="Menu89"></a><b>Test 89</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>HW: aaaa <br>
+TXT: Ubbbbbb<p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>HW version<br>
+Text version<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+aaaa - wersja sprzêtowa telefonu (np. najnowsze mi znane Nokie 5110 pokazuj±
+tutaj 4220)</li>
+
+<li>
+bbbbbb - informacja, kiedy zosta³y opracowane teksty (prawdopodobnie nazwy operatorów)
+wy¶wietlane przez telefon</li>
+</ul>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><br>
+
+<center>
+<p><a href="faq_net0.htm">[Czê¶æ 1]</a><a href="faq_net1.htm">[Czê¶æ 2]</a><a href="faq_net2.htm">[Czê¶æ 3]</a><a href="faq_net3.htm">[Czê¶æ 4]</a><a href="faq_net4.htm">[Czê¶æ 5]</a><b>[Czê¶æ 6]</b><a href="faq_net6.htm">[Czê¶æ 7]</a>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wi±cek<Marcin-Wiacek@topnet.pl>">Marcin Wi±cek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Ostatnia aktualizacja: 5 stycznia 2002</font>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta name="Author" content="Marcin Wiacek">
+ <meta name="Description" content="NOKIA NetMonitor description (English version)">
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="language" content="us">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="3110, 9110, GSM, DCS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, FAQ, NetMonitor, Marcin, Wiacek, Marcin Wiacek">
+ <title>NetMonitor in Nokia phones (7/7)</title>
+ <link rel="stylesheet" href="../../styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<font class="drukuj">
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+</font>
+<center><font color="#1F409F" size=+2 class="tytul">NetMonitor in Nokia phones (7/7)</font>
+<font class="drukuj">
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><b>[Part 7]</b>
+</font>
+</center>
+
+<hr noshade width="60%" style="color: #004080" align=center>
+<a NAME="Top"></a>
+
+<font class="drukuj">
+<ol>
+<li><a href="faq_net0.htm#1"><b>What is it ?</b></a></li>
+<li><a href="faq_net0.htm#2"><b>Do I need it ?</b></a></li>
+<li><a href="faq_net0.htm#3"><b>Does my phone use more power with NetMonitor enabled ?</b></a></li>
+<li><a href="faq_net0.htm#4"><b>How to activate it ?</b></a></li>
+<li><a href="faq_net0.htm#5"><b>Which NetMonitor version can be activated in my phone ?</b></a></li>
+<li><a href="faq_net0.htm#6"><b>Does NetMonitor activation void warranty ?</b></a></li>
+<li><a href="faq_net0.htm#7"><b>NetMonitor menu in my phone has different number than 10. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#8"><b>NetMonitor menu in my phone has 11 number, hovewer previous position has 9 number. Is it normal ?</b></a></li>
+<li><a href="faq_net0.htm#9"><b>How to use it ?</b></a></li>
+<li><a href="faq_net0.htm#10"><b>Can I damage my phone ?</b></a></li>
+<li><a href="faq_net1.htm#11"><b>Glossary</b></a></li>
+<li><a href="faq_net2.htm#12"><b>Description of the individual tests</b></a></li>
+<li><a href="#13"><b>You can also use a program...</b></a></li>
+<li><a href="#14"><b>Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</b></a></li>
+<li><a href="#15"><b>How can I disable NetMonitor ?</b></a></li>
+<li><a href="#16"><b>Do I need to disable NetMonitor before sending my phone to the service ?</b></a></li>
+<li><a href="#17"><b>Is it possible to re-activate NetMonitor after disabling it ?</b></a></li>
+<li><a href="#18"><b>Is NetMonitor available in analog Nokia phones ?</b></a></li>
+<li><a href="#19"><b>Does NetMonitor allow to use phone like broadcast station ?</b></a></li>
+<li><a href="#20"><b>I don't have all described tests in my phone. Why ? Can I increase their number ?</b></a></li>
+<li><a href="#21"><b>Does NetMonitor allow to identify place, where is my interlocutor ?</b></a></li>
+<li><a href="#22"><b>Does NetMonitor allow to identify place, where am I ?</b></a></li>
+<li><a href="#23"><b>What are NetMonitor codes ?</b></a></li>
+<li><a href="#24"><b>Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</b></a></li>
+<li><a href="#25"><b>Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</b></a></li>
+<li><a href="#26"><b>I have non existing networks on the list of forbidden networks...</b></a></li>
+<li><a href="#27"><b>How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</b></a></li>
+<li><a href="#28"><b>Can I use DLR-2/DLR-3 cables for activating netmonitor ?</b></a></li>
+<li><a href="#29"><b>Can I activate netmonitor using Init File Editor (Nokia 9110) ?</b></a></li>
+<li><a href="#30"><b>Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</b></a></li>
+<li><a href="#31"><b>How to change settings in tests ?</b></a></li>
+<li><a href="#32"><b>My phone has very short snandby time - it is possible to see the reason of it ?</b></a></li>
+<li><a href="#33"><b>Is netmonitor available in English version only ?</b></a></li>
+<li><a href="#Literatura"><b>Information sources</b></a></li>
+<li><a href="#35"><b>Additional information</b></a></li>
+<li><a href="#36"><b>Does using/activating netmonitor cost anything ?</b></a></li>
+<li><a href="#37"><b>Does using netmonitor is legall ?</b></a></li>
+<li><a href="#38"><b>Which entries on SIM card are used in netmonitor tests ?</b></a></li>
+<li><a href="#39"><b>Can I activate netmonitor in 3310 using soft working with 3210 ?</b></a></li>
+<li><a href="#40"><b>After activating netmonitor/BTS TEST my phone can't find network...</b></a></li>
+<li><a href="#41"><b>Netmonitor shows different battery capacity than info on it...</b></a></li>
+</ol>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<p><a NAME="Menu90"></a><b>Test 90</b>
+
+<p>In Nokia 9110 this test looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> Cover aaaa<br>
+ CarKit bbbb<br>
+ Heads cccc<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>CoverCnt<br>
+CarKitCnt<br>
+HeadsetCnt <br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaa - how many times Communicator's cover was opened</li>
+<li>bbbb - how many times carkit was connected</li>
+<li>cccc - how many times headset was used</li>
+</ul>
+
+<p>Because Nokia 9110 seems to be 100% hardware compatible with 6110,
+method of simulating headset and car kit should be the same
+(see <b><a href="faq_net5.htm#Menu75">test 75</a></b>).
+First of them you can simulate using
+<b><a href="#Menu92">test 92</a></b> too (when you use it, value of the counter
+from this test doesn't change !). I recommend to read
+page <a href="http://my-communicator.com/">http://my-communicator.com/</a>,
+where you will find more informations about it (for example, another ways
+to simulate them)...
+
+<p>here's for Nokia 5190:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>M:DCS:DO4100<br>
+D:HPA:NTM:NC<br>
+D:REA:OFS:RU<br>
+0000000:000</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+MODESERVSIM <br>
+DCS AMPSMOD<br>
+DPWRAPWRSMC<br>
+PRILIST
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and in Nokia 7110/8210/6210/6250/3310 looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+PS0 aaaa<br>
+EC0 bbbbbbbb<br>
+PS1 cccc<br>
+EC1 dddddddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+PS0 FFFE<br>
+EC0 00000003<br>
+PS1 FFF8<br>
+EC1 00000002</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Page0 Status<br>
+EraseCounter<br>
+Page1 Status<br>
+EraseCounter
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaa - the same to the parameter bbbb from <a href="#Menu92">test 92</a></li>
+<li>bbbbbbbb - the same to the parameter dddddddd from <a href="#Menu92">test 92</a></li>
+<li>cccc - the same to the parameter bbbb from <a href="#Menu93">test 93</a></li>
+<li>dddddddd - the same to the parameter dddddddd from <a href="#Menu93">test 93</a></li>
+</ul>
+
+<p>Probably it's about one of phone's memory. Parameters
+"aaaa" and "cccc" show, whether banks of this memory are free
+(fffe) or not (fff8). Parameters "bbbbbbbb" and "dddddddd" show,
+how many times they were erased.
+
+<p><a NAME="Menu91"></a><b>Test 91</b>
+
+<p>In Nokia 9110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> RESET <br>
+ MISC<br>
+ COUNTERS <br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Use menu <br>
+ to reset<br>
+ misc<br>
+ counters</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>By direct enter to this test you can reset counters from
+<b><a href="#Menu90">test 90</a></b>.
+
+<p>In Nokia 7110/8210/6210/6250/3310 this test is different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+FL 005FC998<br>
+E2 0 0<br>
+PR 30 1<br>
+OM 0 0000<br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<center>
+
+Help from Nokia 7110:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+NextEntry<br>
+Addr Length<br>
+Small Long<br>
+ErCnt ErMask<br>
+</b></tt></td>
+</tr>
+</table>
+
+<p>and 8210/6210/6250/3310:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ NextEntry<br>
+Addr Length<br>
+Small Long <br>
+ErCnt ErMask<br>
+</b></tt></td>
+</tr>
+</table>
+</center>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu92"></a><b>Test 92</b>
+
+<p>In Nokia 9110 it looks different:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><br><tt> Headset <br>
+ xxx<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b> Use menu to<br>
+ toggle<br>
+ headset<br>
+ ON/OFF</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>By direct enter to this test you can enable "headset" profile
+normally accesible after connecting headset (of course,
+you don't have to have it ;-)) - xxx can have ON or OFF values.
+When you will use it, value of counter from <a href="#Menu90">test 90</a>
+don't change. I recommend to read
+page <a href="http://my-communicator.com/">http://my-communicator.com/</a>,
+where you will find more informations about it (for example, another ways
+to simulate them)...
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td><img SRC="../tip.gif" height=36 width=27></td>
+
+<td>Use this test, when you need 'Automatic Answer' function, which allow
+to receive incoming call without pressing phone's key. This function is normally
+enable in never Nokia phones with connected set only (in older phones - like
+Nokia 2110i - it's always visible)
+</td>
+</tr>
+</table>
+
+<p>and in Nokia 7110/8210/6210/6250/3310 it looks like follows:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+EP aaaa bbbb<br>
+#0 cccc<br>
+ dddddddd<br>
+eeeeffffffff
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+EP F0F0 FFFE<br>
+#0 0000<br>
+ 00000003<br>
+FFFFFFFFFFFF</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<center>
+Help from Nokia 7110:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+EMark PgStat<br>
+PgType<br>
+EraseCount<br>
+PpInd PpECnt
+</b></tt></td>
+</tr>
+</table>
+<p>and 8210/6210/6250/3310:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+EMark PgStat<br>
+ PgType<br>
+ EraseCount<br>
+PpInd PpECnt
+</b></tt></td>
+</tr>
+</table>
+</center>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>bbbb - the same to the parameter aaaa from <a href="#Menu90">test 90</a></li>
+<li>dddddddd - the same to the parameter bbbbbbbb from <a href="#Menu90">test 90</a></li>
+</ul>
+
+<p>It's info about first bank of one of phone's memories. When it's free (parameter
+bbbb=FFFE), parameters "eeeeffffffff" are equal "FFFFFFFFFFFF".
+Parameter "dddddddd" shows, how many times bank was erased.
+
+<p><a NAME="Menu93"></a><b>Test 93</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+EP aaaa bbbb<br>
+#1 cccc<br>
+ dddddddd<br>
+eeeeffffffff
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+EP F0F0 FFF8<br>
+#1 0001<br>
+ 00000002<br>
+000000000002</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<center>
+Help from Nokia 7110:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+EMark PgStat<br>
+PgType<br>
+EraseCount<br>
+PpInd PpECnt
+</b></tt></td>
+</tr>
+</table>
+<p>and 8210/6210/6250/3310:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+EMark PgStat<br>
+ PgType<br>
+ EraseCount<br>
+PpInd PpECnt
+</b></tt></td>
+</tr>
+</table>
+</center>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>bbbb - the same to the parameter cccc from <a href="#Menu90">test 90</a></li>
+<li>dddddddd - the same to the parameter dddddddd from <a href="#Menu90">test 90</a></li>
+</ul>
+
+<p>It's info about second bank of one of phone's memories. When it's free (parameter
+bbbb=FFFE), parameters "eeeeffffffff" are equal "FFFFFFFFFFFF".
+Parameter "dddddddd" shows, how many times bank was erased.
+
+<p><a NAME="Menu94"></a><b>Test 94</b>
+
+<p>Test in Nokia 3210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>Vo: aaa bbb<br>
+Pins: c<br>
+Mode: dddd<br>
+State: eeee</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>V: Req ADC <br>
+Pin Status<br>
+Mode<br>
+Band Ch</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>dddd - one of values is AUTO</li>
+<li>eeee - example values are GS05, GS09, PS01</li>
+</ul>
+
+<p>and 7110/6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+IN E111 F000<br>
+ST 0000<br>
+ 0000<br>
+ 0000
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+
+<p><center>Help from Nokia 7110:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+InExc InRec<br>
+ EmuErr<br>
+ EnvErr<br>
+ RecEr
+</b></tt></td>
+</tr>
+</table>
+
+<p>and Nokia 6210/6250:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+InExc InRec<br>
+ EmuErr<br>
+ EnvErr<br>
+ RecErr
+</b></tt></td>
+</tr>
+</table>
+</center>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu95"></a><b>Test 95</b>
+
+<p>In Nokia 3210
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>1:aaa 4:ddd <br>
+2:bbb 5:eee<br>
+3:ccc 6:fff<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>6 lowest<br>
+values at <br>
+shut down<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and newer versions of firmware in Nokia 6210 (confirmed for 5.17 and higher):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>GSM pwrcls: <br>
+4(2W)<br>
+Modified:No<br>
+ </i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Curr Band-3 <br>
+Pwr-Cls<br>
+(Watt)<br>
+Pwr-Cls Mod
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu96"></a><b>Test 96</b>
+
+<p>In Nokia 3210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>VCX0ADC: aaa<br>
+TEMP(C): bb<br>
+TEMP(K): ccc<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>ADC VALUE<br>
+RF TEMP(C)<br>
+RF TEMP(K) <br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>
+ccc - temperature of bb counter (in Kelvin degrees: K = C + 273)</li>
+</ul>
+
+<p>and 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+Co: 49 A: 279<br>
+Tu: 49 K: 305<br>
+Of: 0 C:+32<br>
+V5: 2
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Contrast ADC<br>
+Tuned Kelvin<br>
+Offset C<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu98"></a><b>Test 98</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+WR 00000000<br>
+ 0 0000<br>
+ER 00000000<br>
+ 0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+
+<center>
+<p>Help from Nokia 7110:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+WrErrCnt <br>
+WrRtry WrSta<br>
+ErErrCnt<br>
+ErSta<br>
+</b></tt></td>
+</tr>
+</table>
+
+<p>and 6210/6250:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ WrErrCnt<br>
+WrRtry WrSta<br>
+ ErErrCnt<br>
+ ErSta<br>
+</b></tt></td>
+</tr>
+</table>
+</center>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu99"></a><b>Test 99</b>
+
+<p>For Nokia 8810:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>ENTERING <br>
+FBUS<br>
+MODE<br>
+ </i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Switches <br>
+phone<br>
+to FBUS<br>
+mode
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>It's probably for enabling FBUS protocol instead of normal used infrared
+connection. I don't have additional info...
+
+<p>And here is for Nokia 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+Ead:aaaa <br>
+Mod:bb<br>
+MODE: cccc<br>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+EAD value <br>
+Acc. status<br>
+FBUS mode<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<ul>
+<li>bb - type of connected sound accesories (example values:
+HP in normal state, HD with headset - for example, HDC-9P).
+In other phones this information is displayed in
+<a href="faq_net5.htm#Menu75">test 75</a></li>
+<li>cccc - "FBUS" in connection made during FBUS or MBUS cable from older
+Nokia phone (5xxx, 6xxx) or during Irda connection</li>
+</ul>
+
+<p>Very similiar is in Nokia 6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+Ead: 03FF <br>
+Mod: HP<br>
+<p>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+EAD value <br>
+Acc. status<br>
+<p>
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p><a NAME="Menu100"></a><b>Test 100</b>
+
+<p>Test from Nokia 9110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>a b <br>
+c ddd e <p>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>UWS DWS<br>
+T1 N1 T2<p>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and 7110/6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+004D63 5.0<br>
+0018D1 1.6<br>
+05B1DD 94.0<br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+MemUseT %Use<br>
+MemRelT %Rel<br>
+MemUnuT %Unu<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Information about using phone's memory. I'm not sure exactly, what memory
+(when position to phonebook is added, information displayed here is probably about
+phonebook memory).
+
+<p>And in Nokia 8210/3310 is different (they're
+information about the voice dialling feature):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ND a b c<br>
+ d e f<br> <br>
+ggggg hhhhhh
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ND 2 1 0<br>
+ 0 0 0<br> <br>
+02.81 120399
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ND mm cs ps <br>
+ ss po da<br> <br>
+Vers: Date:
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<ul>
+<li>a - number of recorded voice tags in phone.
+Maximal value is 8 (for Nokia 8210/3310) or 10 (for Nokia 6210).
+It's displayed in <a href=#Menu101>test 101</a> and <a href=#Menu102>test 102</a>
+(Nokia 8210/3310) or <a href=#Menu108>test 108</a> and <a href=#Menu109>test 109</a> (Nokia 6210)</li>
+<li>c - info about using voice dialling engine:
+<ul>
+<li>0 - it wasn't used after enabling phone</li>
+<li>1 - voice tag was not recognized or Play/Save function were used</li>
+<li>5 - voice tag was recognized</li>
+<li>7 - user was in voice dialling function menu and selected Cancel function</li>
+<li>8 - voice dial in progress (in use)</li>
+</ul>
+</li>
+<li>ggggg - version of voice dialling engine (?)</li>
+<li>hhhhhh - date of releasing voice dialling engine (?)</li>
+</ul>
+
+<p>Values of counters (without "a" parameter) are not saved to EEPROM, when phone is disabled.
+
+<p><font color=red><b>WARNING: in some phones (like Nokia 3310), if you want to give phone
+to service for upgrading firmware, remove earlier ALL voice tags from its' memory.
+In other case memory for them can be decreased for so many voice tags, as were saved in memory
+in the moment, when it was given to service (example:
+in Nokia 3310 with two voice tags before upgrading firmware, after it it was possible
+to save maximal 6 voice tags, counter "a" showed 2, but phone in Menu 1-10 displayed,
+that memory for them is empty)
+</b></font>
+
+<p><a NAME="Menu101"></a><b>Test 101</b>
+
+<p>Test from Nokia 9110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt> aaaaaaaa<br>
+ bbbbbbbb<br>
+ cccccccc <br>
+ dddddddd</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>TX Frame Cnt<br>
+RX Frame Cnt<br>
+TX Retx Cnt<br>
+RX Tetx Cnt</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>All values are in hexadecimal values.
+
+<p>and 7110/6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+#0 0 #1 0<br>
+#2 0 #3 0<br>
+#4 0 #5 0<br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Pn LoCPn LoC<br>
+Pn LoCPn LoC<br>
+Pn LoCPn LoC<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 8210/3310 it's different (information about the recording voice
+tags in voice dialling feature):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+Train<br>
+ a b c<br>
+dddd eeee<br>
+ffff gggg
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+Train<br>
+ 0 0 2<br>
+ 0 0<br>
+0000 0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Train<br>
+ r ii mm<br>
+strt durn<br>
+minm maxm
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<ul>
+<li>a - number of voice tags failed to record
+(it increases for example, when phone didn't recognize any voice to record)</li>
+<li>b - number of recorded tags, when this test was enabled</li>
+<li>c - number of recorded tags in phone. Maximal value is 8 (for Nokia 8210/3310)
+or 10 (for Nokia 6210). It's displayed in <a href=#Menu100>test 100</a> and
+<a href=#Menu102>test 102</a> (Nokia 8210/3310) or
+<a href=#Menu107>test 107</a> and <a href=#Menu109>test 109</a> (Nokia 6210).</li>
+<li>dddd - how loud was start of recorded voice during last recording
+(the higher, the more loud) (?)</li>
+<li>eeee - how loud was recorded voice during last recording
+(the higher, the more loud) (?)</li>
+<li>ffff,gggg - another parameters unique to each recorded voice (hex values ?)</li>
+</ul>
+
+<p>Values of counters (without "c" parameter) are not saved to EEPROM, when
+phone is disabled.
+
+<p><font color=red><b>WARNING: in some phones (like Nokia 3310), if you want to give phone
+to service for upgrading firmware, remove earlier ALL voice tags from its' memory.
+In other case memory for them can be decreased for so many voice tags, as were saved in memory
+in the moment, when it was given to service (example:
+in Nokia 3310 with two voice tags before upgrading firmware, after it it was possible
+to save maximal 6 voice tags, counter "c" showed 2, but phone in Menu 1-10 displayed,
+that memory for them is empty)
+</b></font>
+
+<p><a NAME="Menu102"></a><b>Test 102</b>
+
+<p>Test from Nokia 9110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>aaaaaaaaaa<br>
+bbbbbbbbbbbb<br>
+ccccccccccc<br>
+ </tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>Data call<br>
+flow control<br>
+info<br>
+ </b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 8210/3310 it's different (information about the recognizing voice tags
+in voice dialling feature):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+Recog a b<br>
+ c dddd eeee<br>
+ f gggg hhhh<br>
+ i jjjj kkkk
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+Recog 0 2<br>
+ 0 0000 0000<br>
+ 0 0000 0000<br>
+ 0 0000 0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Recog r mm<br>
+i1 scr1 minm<br>
+i2 penH maxm<br>
+i3 penL penC
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>b - number of recorded tags in phone. Maximal value is 8 (for Nokia 8210/3310)
+or 10 (for Nokia 6210). It's displayed in <a href=#Menu100>test 100</a> and
+<a href=#Menu101>test 101</a> (Nokia 8210/3310) or
+<a href=#Menu107>test 107</a> and <a href=#Menu108>test 108</a> (Nokia 6210)
+
+<p>2'nd line - info about last recognized by phone voice tag (c=number of voice tag)
+<br>3'nd line - info about previous recognized by phone voice tag (f=number of voice tag)
+<br>4'td line - info about previous recognized by phone voice tag (i=number of voice tag)
+
+<p>Values of counters (without "b" parameter) are not saved to EEPROM, when phone is disabled.
+
+<p><font color=red><b>WARNING: in some phones (like Nokia 3310), if you want to give phone
+to service for upgrading firmware, remove earlier ALL voice tags from its' memory.
+In other case memory for them can be decreased for so many voice tags, as were saved in memory
+in the moment, when it was given to service (example:
+in Nokia 3310 with two voice tags before upgrading firmware, after it it was possible
+to save maximal 6 voice tags, counter "b" showed 2, but phone in Menu 1-10 displayed,
+that memory for them is empty)
+</b></font>
+
+<p>and from Nokia 6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Pn LoCPn LoC<br>
+Pn LoCPn LoC<br>
+Pn LoC<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p><a NAME="Menu103"></a><b>Test 103</b>
+
+<p>In Nokia 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+100 0 00<br>
+PoolS 01EA6E<br>
+RsrvS 031386<br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+%FW %BW FrCo<br>
+PoolSizeLeft<br>
+Reservations<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and 6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+92 8 00 <p>
+ <br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+%FW %BW FrCo<p>
+ <br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu104"></a><b>Test 104</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+LOG 00000000<br>
+COD 00000000<br>
+WrA 00000000<br>
+RdA 00000000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ErrorLogAddr<br>
+ErrorCode<br>
+WrErrorAddrs<br>
+RdErrorAddrs
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu105"></a><b>Test 105</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+WrC 00000000<br>
+RdC 00000000<br>
+Group 00<br>
+Index 0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+DevWrErrorCo<br>
+DevRdErrorCo<br>
+CallingGroup<br>
+CallingIndex
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p><a NAME="Menu106"></a><b>Test 106</b>
+
+<p>In Nokia 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+RtyDaRd 0000<br>
+RtyDaWr 0000<br>
+RtyHeRd 0000<br>
+RtyHeWr 0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+RtyDataRead<br>
+RtyDataWrite<br>
+RtyHeadRead<br>
+RtyHeadWrite
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and 6210/6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+GT-Call 0000<br>
+GT-Ok 0000<br>
+Cl-Task 0000<br>
+RtyHewr 0000
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Call To BGOT<br>
+Success BGOT<br>
+CleanUpTask<br>
+RtyHeadWrite
+</b></tt></td>
+</tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p><a NAME="Menu107"></a><b>Test 107</b>
+
+<p>In Nokia 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ 1 1 1 1<br>
+LLRS: 000000<br>
+DchsmEr:0000<br>
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+PB GB HB PB<br>
+LastLostSize<br>
+DtChsmErrCo<br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 6210/6250 contains information about the voice dialling feature:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ND a b c<br>
+ d e f<br>
+ggggg hhhhhh<br>
+
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ND 2 1 0<br>
+ 0 0 0<br>
+02.93 030300<br>
+
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ND mm cs ps <br>
+ ss po da<br>
+Ver Date<br>
+
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<ul>
+<li>a - number of recorded voice tags in phone.
+Maximal value is 8 (for Nokia 8210/3310) or 10 (for Nokia 6210).
+It's displayed in <a href=#Menu101>test 101</a> and <a href=#Menu102>test 102</a>
+(Nokia 8210/3310) or <a href=#Menu108>test 108</a> and <a href=#Menu109>test 109</a> (Nokia 6210)</li>
+<li>c - info about using voice dialling engine:
+<ul>
+<li>0 - it wasn't used after enabling phone</li>
+<li>1 - voice tag was not recognized or Play/Save function were used</li>
+<li>5 - voice tag was recognized</li>
+<li>7 - user was in voice dialling function menu and selected Cancel function</li>
+<li>8 - voice dial in progress (in use)</li>
+</ul>
+</li>
+<li>ggggg - version of voice dialling engine (?)</li>
+<li>hhhhhh - date of releasing voice dialling engine (?)</li>
+</ul>
+
+<p>Values of counters (without "a" parameter) are not saved to EEPROM, when phone is disabled.
+
+<p><a NAME="Menu108"></a><b>Test 108</b>
+
+<p>In Nokia 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+FF:FF FF:FF <br>
+FF:FF 00:00<br>
+FF:FF FF:FF<br>
+FF:FF FF:FF
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Link&LID 0-1<br>
+Link&LID 2-3<br>
+Link&LID 4-5<br>
+Link&LID 6-7
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>In Nokia 6210/6250 it's like <a href=#Menu101>test 101</a> in Nokia 8210...
+
+<p><a NAME="Menu109"></a><b>Test 109</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Recog r mm<br>
+i1 scr1 minm<br>
+i2 penu maxm<br>
+i3 penl curp
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>and is connected with recognizing numbers in voice dialing...
+
+<p><a NAME="Menu110_115"></a><b>Test 110, 111, 112, 113, 114, 115 (115 ONLY IN NOKIA 7110 !)</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+ a bbbbccccc<br>
+dddddd eeeee<br>
+ffffff ggggg<br>
+ h i j kkkk
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+ 0 FFFE 0.0<br>
+000002 0.0<br>
+000000 100.0<br>
+ 3 1 0 FFE0
+</i></tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<center>
+<p>Help from Nokia 7110:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Pn Sta %Use<br>
+EraseCn %Rel<br>
+NextRec %Unu<br>
+Cu Cl Cc MmC
+</b></tt></td>
+</tr>
+</table>
+
+<p>and 6210/6250:
+<p><table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+ Pn Sta %Use<br>
+EraseCn %Rel<br>
+NextRec %Unu<br>
+Cu Sl Cc MnC
+</b></tt></td>
+</tr>
+</table>
+
+<center>
+</td>
+</tr>
+</table>
+
+<p>New generation of Nokia phones (6210/6250/7110 and compatible)
+save ALL settings and datas (phonebook, SMS, ringtones, WAP, etc.)
+in one memory. It's called
+PMM (I don't know official meaning - unofficial it can be
+"Post Multiple Memory"). These tests show probably info about next banks of
+this memory:
+
+<p>
+<ul>
+<li>a - number of bank</li>
+<li>bbbb - shows, if bank is used (fff8 in Nokia 6210/7110) or not
+(fff0 in Nokia 6210, fffe in Nokia 7110)</li>
+<li>ccccc - how many percent of memory is used</li>
+<li>dddddd - erase counter</li>
+<li>eeeee - how many percent of memory was free</li>
+<li>ffffff - next (free in bank ?) position shown as absolute address</li>
+<li>ggggg - how many percent of memory is free (when add to ccccc, you have 100%)</li>
+</ul>
+
+<p><a NAME="Menu130"></a><b>Test 130</b>
+
+<p>Test from Nokia 7110:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+aaa bbbbbb<p> <br>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Slide Open<p> <br>
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<ul>
+<li>bbbbbb - how many times phone's sliding cover was opened (hex value)</li>
+</ul>
+
+<p>and 3310:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+DSP_RST:aaaa<br>
+CS: bbbbbbbb<br>
+ cc dd ee ff<br>
+0000 gggg
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+DSP_RST:0000<br>
+CS: 00000000<br>
+ 00 00 00 00<br>
+0000 0000</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+DSP resetcnt<br>
+CStandbyLoss<br>
+ sw as pw st<br>
+BadPwr insim
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaa - number of <a href=faq_net1.htm#DSP>DSP</a> resets. Displayed also in
+<a href=faq_net4.htm#Menu36>test 36</a></li>
+</ul>
+
+<p>and newer versions of firmware in Nokia 6210 (confirmed for 5.17 and higher):
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+<i>
+LRW-1 SW:<br>
+XXXXXX<br>
+PN mode<br>
+NOT DETECTED
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Shows<br>
+Connectivity<br>
+Battery<br>
+information.
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>Connected with BlueTooth module (in this phone it wasn't available).
+
+<p><a NAME="Menu131"></a><b>Test 131</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+STO:aaaaaaaa<br>
+NB:bbLB:cc<br>
+HOF:dddddddd<br>
+eeee ZR:ffff
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+STO:00000000<br>
+NB:00LB:00<br>
+HOF:00000005<br>
+0000 ZR:05CA
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Stack overfl<br>
+NoBuf LongBu<br>
+HandOver Cnt<br>
+HOfail ZonFa
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>dddddddd - sum of <a href=faq_net4.htm#handover>handovers</a> from
+<a href=faq_net4.htm#Menu41>test 41</a> (?). Unfortunately, values don't match
+always (firmware bug ?)
+</li>
+</ul>
+
+<p>Counters are in hexadecimal form...
+
+<p><a NAME="Menu132"></a><b>Test 132</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+BS: aaaaaaaa<br>
+MO: bbbbbbbb<br>
+DRC:cccccccc<br>
+TIM:dddddddd
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+BS: 00000000<br>
+MO: 00000005<br>
+DRC:00000000<br>
+TIM:00000000
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+BS_Call Cnt<br>
+MO_Call cnt<br>
+Dropped call<br>
+Call time
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaaaaaa - how many times you received call. Please notice one difference to
+MTOK parameter from <a href=faq_net5.htm#Menu63>test 63</a> - you can't reset
+this value from phone's menu</li>
+<li>bbbbbbbb - how many times you made successfull outgoing call from your phone.
+Please notice one difference to MOOK parameter from <a href=faq_net5.htm#Menu63>test 63</a>
+- you can't reset this value from phone's menu. One interesting thing: this counter
+can have bigger value than MOOK from
+<a href=faq_net5.htm#Menu63>test 63</a> (firmware bug ?)</li>
+<li>dddddddd - counter shows, how long (in second) there were calls made.
+Doesn't work in all firmware versions</li>
+</ul>
+
+<p>Counters are in hexadecimal form...
+
+<p><a NAME="Menu133"></a><b>Test 133</b>
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt>
+BFu:aaaaaaaa<br>
+ChC:bbbb cc<br>
+StB:<br>
+NSe:
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+BFu:00000002<br>
+ChC:0004 00<br>
+StB:<br>
+NSe:
+</i>
+</tt></td>
+</tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+FullChargCnt<br>
+ChaCon Wrong<br>
+Standby time<br>
+NoServTimer
+</b></tt></td>
+</tr>
+</table>
+</td>
+</tr>
+</table>
+
+<p>
+<ul>
+<li>aaaaaaaa - how many times info about full charged battery was displayed
+(when it was done correctly - for example FullM info in
+<a href=faq_net3.htm#Menu20>test 20</a>...or not - for example MaBFD info
+in the same test).
+Counter doesn't increase value, when phone is disabled.</li>
+<li>bbbb - how many times charger was connected. Counter increases value, when (each
+time, when you will do it):
+<ol>
+<li>phone is enabled, you connect charger</li>
+<li>phone is disabled, you connect changer and enable phone</li>
+</ol>
+Counter doesn't increase, when phone is disabled.
+</li>
+</ul>
+
+<p><a NAME="Menu140"></a><b>Test 140</b>
+
+<p>Test from Nokia 6250:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+AVC: 02 <br>
+SLM: 00<br>
+VOL: 09<br> </i>
+</tt>
+</td></tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+AVC state<br>
+SLM state<br>
+BIAS volume<br>
+</b>
+</tt>
+</td></tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p>Second line changes to 02, when phone measure noise level.
+
+<p>and 8210:
+
+<p>
+<table CELLSPACING=0 CELLPADDING=0 WIDTH="100%" >
+<tr>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><i>
+Driver nr:01<br>
+ManuDeviAddi<br>
+00B000480000<br>
+
+</i>
+</tt>
+</td></tr>
+</table>
+</td>
+
+<td>
+<table BORDER CELLSPACING=0 CELLPADDING=0 >
+<tr>
+<td><tt><b>
+Return value<br>
+from MFS<p>
+</b>
+</tt>
+</td></tr>
+</table>
+</td>
+
+</tr>
+</table>
+
+<p><a NAME="Menu240"></a><b>Test 240</b>
+<br>It doesn't show any values, but:
+
+<p>
+<ul>
+<li>
+clears counter reset normally by direct enter to
+<b><a href="faq_net4.htm#Menu40">test 40</a></b>,
+<b><a href="faq_net5.htm#Menu60">test 60</a></b> and
+<b><a href="faq_net5.htm#Menu82">test 80</a></b></li>
+
+<li>
+enables counters from <b><a href="faq_net5.htm#Menu82">test 82</a></b>
+(you can make it by direct enter to <b><a href="faq_net5.htm#Menu81">test 81</a></b> too).</li>
+</ul>
+
+<p><a NAME="Menu241"></a><b>Test 241</b>
+<br><b><font color="#FF6666">
+<img SRC="nm_15.gif" ALT="NetMonitor menu in Nokia 5110" height=48 width=84 align=left>
+Disables netmonitor (it means, deactivates its' menu) !
+To again activate it you will have to use methods described in
+<a href="faq_net0.htm#4"><i>How to activate it ? </i></a></font></b>
+Probably after using it you will have to disable and enable phone (to
+make arrows up/down usable). It's possible too, that these arrows will work
+only, when you will deactivate netmonitor from computer...
+
+<p><a NAME="Menu242"></a><b>Test 242</b>
+<br><b><font color="#FF6666">Enables limited netmonitor
+(tests from 1 to 19 only). To enable <a href="faq_net0.htm#5">full netmonitor version</a>
+you will have to use methods described in
+<a href="faq_net0.htm#4"><i>How to activate it ?</i></a> question
+(phone doesn't allow to use it from its' menu
+<a href="faq_net6.htm#Menu243">test 243</a>, which normally enable full
+netmonitor version - you will be able to enter it in program enabling
+netmonitor in computer only).
+</font></b>
+
+<p><a NAME="Menu243"></a><b>Test 243</b>
+<br>Enables full netmonitor.
+
+<p><a NAME="Menu250"></a><b>Test 250</b>
+<br>Some English descriptions write, that this test cleans information from
+<b><a href="faq_net4.htm#Menu57">test 57</a></b> (I didn't notice it).
+
+<p><a NAME="Menu497"></a><b>Test 497</b>
+<br>It should <b><font color="#FF6666"><font size=+1>deactivate
+netmonitor</font></font></b> like <b><a href="#Menu241">test 241</a></b> (497-256=241).
+But some sites (for example,
+<a href="http://www.versamart.com/Nokia5110/nokia5110code.shtml">www.versamart.com/Nokia5110/nokia5110code.shtml</a>)
+show, that it could make more:
+
+<p><i>The tips needs Net Monitor enabled.</i>
+<br><i>Be aware that the trick wil remove Netmonitor in some</i>
+<br><i>sw versions like v4.73 and v5.04.</i>
+
+<p>
+<ol>
+<li><i>Laungh the NetMonitor in your Nokia 51xx / 61xx</i></li>
+<li><i>Execute the test number 497</i></li>
+<li><i>Free calling for about 90 sec should now have been activated.</i></li>
+</ol>
+
+<p><i>The trick has not been comfirmed working yet.</i>
+
+<p>For me, it's rather joke...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="13"></a><font color="#1F409F" size=+2 class="dzial">13. You can also use a program...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>There are programs, which allow to track some of these parameters on computer's screen
+(of course, phone must be connected to computer):
+
+<p>
+<ul>
+<li>
+program created by Andreas Schmidt (<a href="http://www.aschmidt.de/">www.aschmidt.de/</a>):
+shows values displayed by phone in given test and allows to track
+<a href="faq_net1.htm#BTS">BTSes</a> (for example, compare their signal level)
+</li>
+
+<li>
+gnokii: it's the name of project (official page - <a href="http://www.gnokii.org">www.gnokii.org</a>)
+and software (nevest versions - <a href="ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/">ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/</a>),
+which want to be Nokia Cellular Data Suite for Unix and Linux. In this moment
+it displays information similiar to these displayed by program described earlier.
+</li>
+
+<li>Logo Manager (<a href="http://www.logomanager.co.uk/">http://www.logomanager.co.uk/</a>)
+it shows view of netmonitor tests.</li>
+
+<li>
+created by N. Hüttisch (<a href="http://www.nobbi.com/">www.nobbi.com/</a>).
+It can work with differenet phones (for example, Siemens C10).
+When you want to use it with Nokia, Nokia Cellular Data Suite is required
+(program communicates using AT commands). When you will unpack it, in file
+<b>monitor.ini</b> (it's in archive with program)
+change <b>comport</b> parameter (you will give there name of port, where
+'Nokia GSM Data' and 'Nokia GSM Voice' modems are installed). And that's all...
+</li>
+
+<li><a href=http://www.club.cz/nokia.monitor/>http://www.club.cz/nokia.monitor/</a>
+- it has the similiar possibilities to program below.
+
+<li>
+Logo Express (<a href="http://memsu1.iam.ntu.edu.tw/~jrywu/">http://memsu1.iam.ntu.edu.tw/~jrywu/</a>
+or <a href="http://logoexpress.bizland.com/">http://logoexpress.bizland.com/</a>):
+shows LAC and CID.</li>
+
+<li>
+from <a href="http://members.tripod.com/smssend/gsm_csq.htm">http://members.tripod.com/smssend/gsm_csq.htm</a>
+(versions for PSION, DOS and Windows): display chart of signal level
+(besed on signal from phone), work probably with Nokia 6xxx phones only.
+</li>
+
+<li>
+WinTesla: this commercional service program displays many detailed information
+(for details search some description on pages somewhere in Internet)
+</li>
+
+<li>software from <a href=http://members.tripod.de/gsmplanet/psion.html>
+http://members.tripod.de/gsmplanet/psion.html</a> for Psion 5mx (MX 218) and Psion Revo.
+It requires additional software supporting IrDa
+(see <a href=http://www.symbiandevnet.com/downloads/opl/projectopx/scomms.zip>http://www.symbiandevnet.com/downloads/opl/projectopx/scomms.zip</a>)
+Works with Nokia 7110, 6210, 8210 and with Siemens S35i, S25.
+Options depends on phone.</li>
+
+<li>
+version 1.3 of PC-Locals: there two ways to make it:
+
+<p>
+<ol>
+<li>
+in the window, where netmonitor is normally activated, enter number of
+test - computer will display everything, what could be displayed by phone
+in this test.
+</li>
+
+<li>enabling internal program's netmonitor:
+
+<p>
+<ol>
+<li>select menu 8 (Event Trace)</li>
+
+<li>select menu 9 (Load TRC file)</li>
+
+<li>
+write name of TRC file (with PC-Locals 1.3 in Internet you can find
+nse3_433.trc file for Nokia 6110 firmware 4.33)
+correct for phone's model and firmware (or press Enter and select adequate
+file). When version from file and phone's version is not the same, computer
+will confirm, that you really want to load it (it won't damage phone,
+but parameters displayed by program will be different than adequate parameters
+from netmonitor in phone).
+</li>
+
+<li>
+select menu 1 (MCU Events)</li>
+
+<li>
+change status of events, which will be tracked in Trace window - you can make
+it using gray + on the right side of keyboard (you can disable tracking, enable
+normal or extended tracking). If you want to enable netmonitor displayed after
+pressing F8 key, you have to enable tracking event CONSTANT_WINDOW_TRA
+(change to NORM or EXT).</li>
+
+<li>
+select menu 2 (Event Control) and change to On.</li>
+
+</ol>
+</li>
+
+<p>In "Trace" window you will see now tracked events. Network parameters can be
+observed after pressing F8. Menu 6 (Break Trace Functions)
+breakes tracking events.</ol>
+</li>
+</ul>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="14"></a><font color="#1F409F" size=+2 class="dzial">14. Can I use NetMonitor without SIM card inserted, without PIN number entered or when SIM card is not active ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>GSM standards say, that cellular phone always should allow to make
+emergency calls (usually 112) - even, when it's was blocked by GSM operator
+(it means, when normally you can't use this phone - with this
+<a href="faq_net1.htm#IMEI">IMEI</a> - in network) or when it's without
+SIM card (eventually it was blocked too). It makes, that after enabling your
+Nokia looks for available cellular networks. There are some programs in this
+moment (see in <i><a href="#13">You can also use a program...</a></i>),
+which display on computer's screen everything, what could be displayed
+by phone in this test. Or I will write it different: when you will connect your
+Nokia to computer and use (for example) Pc-Locals 1.3 or program written
+by <a href="http://www.aschmidt.de/">Andreas Schmidt</a>, you can
+see some information given normally in "Net Monitor" menu. In some phones
+(I checked it with Nokia 5110) you can have access to this menu (generally,
+to phone's menu) using gnokii: you should send dtmf sequence to phone
+(for example, run gnokii with parameter "--senddtmf sequence", where
+sequence consists of some digits).
+
+<p>When you will enter PIN code, you will be "normally" able to use "Net monitor"
+menu from phone's keyboard (of course, if it was activated) and all settings
+and tests inside (for example, not till then in
+<b><a href="faq_net2.htm#Menu6">test 6</a></b> you will see
+"preffered" and "forbidden" networks). You can still display tests using described
+above programs (it can be usefull, when you want to monitor network state and when
+you don't want to loose caller identification or when you want to check kind
+of channel after entering PIN code) - they work independent of it, if you
+have "Net monitor" menu activated and which test is displayed in phone...
+
+<p>SIM card data can be readed in <b><a href="faq_net4.htm#Menu51">test 51</a></b>
+(of course, if your phone supports this test) using these programs
+independent of it, if you entered PIN code or not. When you don't have SIM
+card in phone, you will see there "ERROR1".
+
+<p>When you use deactived SIM card, you have access to tests in netmonitor
+(of course, when its' menu was activated earlier). Network of SIM card is
+normally monitored. Phone tries to communicate with it only once after
+enabling phone (netmonitor shows, that
+<a href="faq_net2.htm#CCCH">CCCH</a>, <a href="faq_net2.htm#AGCH">AGCH</a>,
+<a href="faq_net2.htm#SDCC">SDCC</a> (phone refreshes <a href="faq_net2.htm#TA">TA</a> then),
+<a href="faq_net2.htm#BCCH">BCCH</a> and <a href="faq_net2.htm#CCCH">CCCH</a> channels
+are used then - like in normal SIM card). Later it's impossible. It's made againg
+after reseting phone. Of course, you don't have name of monitored network
+on screen or cellinfo. Interesting thing is, that, for example,
+you can normally use <a href="faq_net3.htm#Menu17">BTS test</a>...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="15"></a><font color="#1F409F" size=+2 class="dzial">15. How can I disable NetMonitor ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p><a href="faq_net1.htm#GSM">GSM</a>/<a href="faq_net1.htm#DCS">DCS</a>/PCS phones:
+
+<p>
+<a href=#Menu241><img SRC="nm_15.gif" ALT="NetMonitor menu in Nokia 5110" height=48 width=84 align=left border=0></a>
+Enter <a href="#Menu241">241 test</a> in phone or use one of described in
+question <a href="faq_net0.htm#4"><i>How to activate it ?</i></a> programs
+(you enter number 241 there, select "OFF" or something similiar...).
+
+<p>TDMA 800/TDMA 1900 phones:
+
+<p>Enter NAM programming menu (<b>*3001#12345#</b> code -
+some sources write, that you have to write security code instead of 12345), set "Field Test display" to "Off"/"Disable" and reboot phone.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a>
+</font>
+
+<p><a NAME="16"></a><font color="#1F409F" size=+2 class="dzial">16. Do I need to disable NetMonitor before sending my phone to the service ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Normally Nokia phones don't have activated netmonitor. When you will give your
+handy to service, somebody there can think, that you made some strange things with it
+(of course, it isn't any maxim - it depends on concrete service and people,
+who will repair your phone)... But I think, that it will be better to save
+eventually problems connected with it and deactivate netmonitor's menu before
+giving phone to service (I repeat: it isn't sometimes required, but it's better
+to make it, when you don't want to have problems)...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="17"></a><font color="#1F409F" size=+2 class="dzial">17. Is it possible to re-activate NetMonitor after disabling it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>YES ! You can <a href="faq_net0.htm#4">activate</a> (and <a href="#15">deactivate</a>)
+netmonitor's menu repeat infinitely (and once more ;-))
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="18"></a><font color="#1F409F" size=+2 class="dzial">18. Is NetMonitor available in analog Nokia phones ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Yes, it seems, that is available in majority of Nokia phones (working in different
+cellular systems).
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="19"></a><font color="#1F409F" size=+2 class="dzial">19. Does NetMonitor allow to use phone like broadcast station ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>No - if you want to speak without costs with people, which are near to you,
+you have to use broadcasting station or walkie-takie.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="20"></a><font color="#1F409F" size=+2 class="dzial">20. I don't have all described tests in my phone. Why ? Can I increase their number ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>This FAQ describes tests from DIFFERENT Nokia phones (models). If you want
+to increase number of available tests, you can only change your phone to
+new, which has more tests (like Nokia 7110) or change it's firmware to never
+- sometimes (like in Nokia 5110) you can have ONE :-) new test (firmware
+5.04 and never has additionaly <a href="faq_net5.htm#Menu89">test 89</a>).
+
+<p>If you have ONLY 19 first tests, you have activated ONLY standard netmonitor
+- enable full (<a href="faq_net0.htm#5">here</a> is more details).
+
+<p>Sometimes you can find concrete copies of phones, where is really a little number of tests.
+For example: I read about Nokia 6110 with 5.48 firmware, where it wasn't possible
+to activate full netmonitor and where first tests didn't have some parameters
+(for example, <a href=faq_net2.htm#Menu7>test 7</a> was empty). In such "cases"
+I can find one explanation only: phone had not "full" firmware donwloaded. User
+of such phone should take it to the service to download new firmware...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="21"></a><font color="#1F409F" size=+2 class="dzial">21. Does NetMonitor allow to identify place, where is my interlocutor ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>NO. This information are in networks registry, but they're not sent
+to your phone. NetMonitor allows however (at least theoretically)
+to look into parameters of sound, which is sent from his(her) phone...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="22"></a><font color="#1F409F" size=+2 class="dzial">22. Does NetMonitor allow to identify place, where am I ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>It's possible, but not too precisely. Why ?
+
+<p>Phone can read such parameters required to identify (location of) <a href="faq_net1.htm#BTS">BTSes</a>
+like their numbers (see <a href="faq_net3.htm#Menu11">test 11</a>) or
+<a href="faq_net2.htm#TA">TA</a> (see <a href="faq_net2.htm#Menu1">test 1</a>),
+but readed <a href="faq_net2.htm#TA">TA</a> couldn't have been distance
+from <a href="faq_net1.htm#BTS">BTS</a> station in straight line (signal can break down)
+and continuosly isn't possible finding, in what direction (what corner)
+<a href="faq_net1.htm#BTS">BTS</a> stations are located (which are "seen" by your
+phone). So, it's possible to identify area only, where you're (in cities, where
+<a href="faq_net1.htm#BTS">BTSes</a> are located more close, it will be more
+precisely). And it can be done by you or your operator...
+
+<p>More info about implementing Mobile Station Location in GSM:
+<a href="http://www.willassen.no/msl/">www.willassen.no/msl/</a>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="23"></a><font color="#1F409F" size=+2 class="dzial">23. What are NetMonitor codes ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Sometimes I read advertisements with requests about NetMonitor codes and I don't know
+exactly, what is it... It simple: in Poland (my country) rather only
+<a href="faq_net1.htm#GSM">GSM</a>/<a href="faq_net1.htm#DCS">DCS</a> phones are used
+and you don't have rather some special "secret" codes, which activate NetMonitor... When
+you need it's description - it's in this FAQ.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="24"></a><font color="#1F409F" size=+2 class="dzial">24. Is it the truth, that in phones with additional hardware changing frequency band NetMonitor doesn't work correct ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>I didn't heard about such hardware. Article about it in Polish
+<a href="http://www.twoja-komorka.com.pl">Twoja Komorka</a> number 4/2000 (page 18)
+was only joke...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="25"></a><font color="#1F409F" size=+2 class="dzial">25. Where can I find description of FBUS/MBUS protocol and commands connected with NetMonitor ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>There are not official information about it. All pages below were created by different people,
+which observed work of compiled software:
+
+<p>
+<ul>
+<li>page of <a href="http://www.gnokii.org">gnokii project</a>.
+You can find free software published with full source (it's very good to read it to understand
+protocol) there
+(on the <a href="ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/">ftp://ftp.linux.cz/pub/linux/people/pavel_janik/Gnokii/</a>
+you will find the nevest test versions), which work with more and more Nokia phones
+(<a href="http://www.nokia.com">Nokia Mobile Phones</a> changed protocols 3 or more times).
+On <a href="http://www.roads.lut.ac.uk/lists/gnokii">discussion list of this project</a> you can find
+some addresses with pages with list protocol commands:
+
+<p>
+<ul>
+<li><a href="http://www.gadgets.co.uk/nokia21xx/index.html">www.gadgets.co.uk/nokia21xx/index.html</a> (Nokia 2110)</li>
+<li><a href="http://priv5.onet.pl/wa/junk/mbus/">http://priv5.onet.pl/wa/junk/mbus/</a> (Nokia 2110 and old phones)</li>
+<li><a href="http://www.tec.puv.fi/~s98114/GSM/FBUS.html">www.tec.puv.fi/~s98114/GSM/FBUS.html</a> (NHx models)</li>
+<li><a href="http://lsc.kva.hu/dl/README.MSGTYPES.txt">http://lsc.kva.hu/dl/README.MSGTYPES.txt</a> (NSx models)</li>
+<li><a href="http://www.venia.net/tdma/">www.venia.net/tdma/</a> (TDMA phones)<p></li>
+</ul>
+</li>
+
+<li>you can look on
+<a href="http://atrey.karlin.mff.cuni.cz/~short/sw/">http://atrey.karlin.mff.cuni.cz/~short/sw/</a>
+for source to the program for sending logos for Nokia 9110 too</li>
+
+<li>some information about it are on the page
+<a href="http://www.gadgets.demon.co.uk/nokia61xx/">www.gadgets.demon.co.uk/nokia61xx/</a> too</li>
+
+</ul>
+
+<p>On the pages above you will find information about commands connected with
+NetMonitor for NSx models (if you don't know model of you phone,
+read <a href="../firmware/firmware.htm">this page</a>). Always you can use ready and free
+ActiveX control (<a href="http://www.gertjaap.com">http://www.gertjaap.com</a>)
+working with these models too...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="26"></a><font color="#1F409F" size=+2 class="dzial">26. I have non existing networks on the list of forbidden networks...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>You should remember, that it's possible to change list of forbidden and preffered networks,
+for example, using SIM card readers ot some phones (it's possible, this "strange"
+position was entered this way).
+
+<p>When we speak about 260-99 network (260-3F position) - it was number of
+test network run by the operator of <a href=http://www.eragsm.pl>Era GSM</a> network on
+the exhibition for Day of Telecommunication in Warsaw (May 2000). It presented
+GPRS.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="27"></a><font color="#1F409F" size=+2 class="dzial">27. How to check frequency band (900 or 1800 Mhz), where phone work in this moment ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Everything depends on used channel (for GSM 900 1-124, for GSM 1800 512-885) -
+see description of <a href="faq_net2.htm#Menu1">1'st test</a>...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="28"></a><font color="#1F409F" size=+2 class="dzial">28. Can I use DLR-2/DLR-3 cables for activating netmonitor ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Yes, Logo Manager (<a href="http://www.logomanager.co.uk">http://www.logomanager.co.uk</a>)
+works with DLR-3 cable. I don't know software supporting DLR-2...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="29"></a><font color="#1F409F" size=+2 class="dzial">29. Can I activate netmonitor using Init File Editor (Nokia 9110) ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>NO, Init File Editor is connected with PDA part of phone, netmonitor not...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="30"></a><font color="#1F409F" size=+2 class="dzial">30. Can I force phone to use one frequency band (900 or 1800 Mhz) only ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Unfortunatelly not (of course, some other phones - for example, Motorola - have such function).
+The only thing, you can do: you can force phone to use one selected channel
+from concrete frequency (see <a href=faq_net2.htm#Menu18>test 18</a>).
+Of course, there are some disadvantiges of it - for example, when phone will lost
+signal on this channel, will report, that network not found (in normal situation
+it would try to find another channel).
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="31"></a><font color="#1F409F" size=+2 class="dzial">31. How to change settings in tests ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<table cellspacing=0 cellpadding=0>
+<tr><td>
+<img SRC="nm_5110.gif" ALT="Netmonitor menu in Nokia 5110" height=48 width=84>
+<img SRC="nm_07.gif" ALT="Netmonitor menu in Nokia 5110" height=48 width=84>
+<a href="faq_net5.htm#Menu71_72"><img SRC="nm_08.gif" ALT="Netmonitor menu in Nokia 5110" height=48 width=84 border=0></a>
+</td><td>
+By direct enter to them. How ? You should enter to phone's menu, go into
+"Netmonitor/Field Test" menu, enter the number of test, where you want to change
+setting and ENTER DIRECTLY INTO IT. It's described more detailed in
+<a href=faq_net0.htm#9>question 9</a>.
+
+<p>Sometimes (I write it in such tests) you have to change values in some
+positions in phonebook before entering to them (see, for example,
+<a href=faq_net3.htm#Menu18>test 18</a>).
+
+</td></tr>
+</table>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="32"></a><font color="#1F409F" size=+2 class="dzial">32. My phone has very short snandby time - it is possible to see the reason of it ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Here are some possible to check reasons:
+
+<p><ul>
+<li>if it depends of configuration of your network - see
+<a href=faq_net3.htm#Menu10>test 10</a> (PRP parameter),
+<a href="faq_net3.htm#Menu12">test 12</a> and
+<a href="faq_net3.htm#Menu13">test 13</a> (<a href=faq_net1.htm#DTX>DTX</a>;
+or <a href=faq_net2.htm#Menu2>test 2</a> in Nokia 2120/2160/6160)</li>
+
+<li>general energy consumption (it can depend on
+older firmware version or enabled
+"Info service") or "Cell info display") functions -
+<a href="faq_net3.htm#Menu23">test 23</a>
+(in Nokia 6185/6188 <a href=faq_net4.htm#Menu45>test 45</a>)</li>
+
+<li>capacity of the battery (<a href=faq_net3.htm#Menu20>test 20</a>;
+in Nokia 6185/6188 <a href=faq_net4.htm#Menu42>test 42</a>)
+and their age (LiION) (<a href=faq_net3.htm#Menu23>test 23</a>;
+in Nokia 6185/6188 <a href=faq_net4.htm#Menu45>test 45</a>)</li>
+</ul>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="33"></a><font color="#1F409F" size=+2 class="dzial">33. Is netmonitor available in English version only ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<table width=100%>
+<tr><td>
+<img SRC="3210_09.gif" height=48 width=84 ALT="Menu 9 in Nokia 3210">
+<img SRC="nm_3210.gif" height=48 width=84 ALT="Menu 11 in Nokia 3210">
+</td><td>
+In Nokia phones only, in some other (for example, Motorola) in different languages...
+</td><td>
+<img SRC="3210_092.gif" height=48 width=84 ALT="Menu 9 in Nokia 3210">
+<img SRC="nm_32102.gif" height=48 width=84 ALT="Menu 11 in Nokia 3210">
+</td></tr>
+</table>
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="Literatura"></a><font color="#1F409F" size=+2 class="dzial">34. Information sources</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>To make this FAQ I used:
+
+<p>
+<ul>
+
+<li>
+netmonitor's descriptions from Internet (for example, from
+"<a href="http://www.tele-servizi.com/nokiasecrets/nokia/nokia_main.html">The Nokia page</a>", N. Hüttisch page
+(<a href="http://www.nobbi.com/">www.nobbi.com/</a>) and from
+<a href="http://www.arcx.com/sites/Nokia6188.htm">www.arcx.com/sites/Nokia6188.htm</a>,
+<a href="http://www.windows.to/wireless/nokia.htm">http://www.windows.to/wireless/nokia.htm</a>,
+<a href="http://www3.l0pht.com/~oblivion/blkcrwl/cell/nokia/">http://www3.l0pht.com/~oblivion/blkcrwl/cell/nokia/</a>
+i <a href="http://www.geckobeach.com/cellular/">www.geckobeach.com/cellular/</a>)
+</li>
+
+<li>
+information from Polish GSM FAQ "PeSTKa" (<a href="http://193.193.73.3/gsm/">http://193.193.73.3/gsm/</a>)
+and Polish site <a href="http://www.fkn.pl/">www.fkn.pl</a> (there is, for example,
+page created by Andrzej Gorny (<a href="http://www.fkn.pl/agorny/">www.fkn.pl/agorny/</a>)
+- first description of netmonitor in Polish language - I used parts
+about <a href="#Handover">handovers</a> and channel types from it)
+</li>
+
+<li>
+knowledge and help from people from Polish discussion groups
+<a href="news:pl.misc.telefonia.gsm">pl.misc.telefonia.gsm</a>
+and fkn-l (<a href="http://www.fkn.pl/fkn-l/index.html">www.fkn.pl/fkn-l/index.html</a>)</li>
+
+<li>
+help from many people (I will write here about some of them:
+Maciek Oksienciuk (<a href="http://angel.qdnet.pl">http://angel.qdnet.pl</a>),
+Jerzy Wozniakiewicz (<a href="http://student.wsp.krakow.pl/~jwozni">http://student.wsp.krakow.pl/~jwozni</a>),
+Juliusz Orlikowski, Slawomir Niemkiewicz, Andzej Bobek, Wojtek, Piotr Glowka
+(<a href="http://www.gsm.alpha.pl">www.gsm.alpha.pl</a>), Michal Jerz
+(<a href="http://my-communicator.com/">http://my-communicator.com/</a>), Andrzej Wilczynski,
+Krzysztof, Marcin Dembinski,
+Pawel Zerdzicki (<a href="http://republika.pl/vosper/">http://republika.pl/vosper/</a>,
+Tomasz Rolewski, Dawid Lorenz (<a href="http://shit.prawda.pl">http://shit.prawda.pl</a>),
+B.B. (<a href="http://www.nokiainfo.f2s.com">www.nokiainfo.f2s.com</a>,
+Bjornar Ness, jsp_m
+<a href="http://www.zamir.net/~josipm/Nokia/nokiafaq/">www.zamir.net/~josipm/Nokia/nokiafaq/</a>,
+Johan Van Bogaert, Dennis Steinhilber (<a href=http://www.steinae.de>www.steinae.de</a>),
+Andreas Garzotto, Nico Netzker and author of <a href=http://www.ras.ru/~sashka/nokia/550/>http://www.ras.ru/~sashka/nokia/550/</a> page)...
+They helped me with collecting all these information...
+</li>
+</ul>
+
+<p>People, which are not on this list, should write to me :-) !
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="35"></a><font color="#1F409F" size=+2 class="dzial">35. Additional information</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>
+<ul>
+<li>Some basic ;-) information about GSM:
+
+<p>
+<ul>
+<li>description from Javier Gozálvez Sempere - <a href="http://www.comms.eee.strath.ac.uk/~gozalvez/gsm/gsm.html">www.comms.eee.strath.ac.uk/~gozalvez/gsm/gsm.html</a></li>
+<li>description from John Scourias (more detailed) - <a href="http://ccnga.uwaterloo.ca/~jscouria/GSM/">http://ccnga.uwaterloo.ca/~jscouria/GSM/</a></li>
+<li><a href="http://www.tns.lcs.mit.edu/~turletti/gsm-overview/">www.tns.lcs.mit.edu/~turletti/gsm-overview/</a></li>
+</ul>
+<p>
+</il>
+
+<li>GSM specifications are on the <a href="http://www.etsi.org">www.etsi.org</a></li>
+
+<li>
+parts and photos from Nokia 6190 - <a href="http://jeff.trilli.com/6190.html">http://jeff.trilli.com/6190.html</a></li>
+
+<li>
+page from "MobSim - A GSM Network Simulator" project (it makes
+software for Unix, which allow to simulate cellular network in computer's memory)
+- <a href="http://mordor.cs.hut.fi/tik-76.115/95-96/palautukset/Mobiili/lt/manual.html">http://mordor.cs.hut.fi/tik-76.115/95-96/palautukset/Mobiili/lt/manual.html</a></li>
+
+<li>some interesting description can be in GSM ring too - <a href="http://www.flashback.net/~lesve/gsmring.html">www.flashback.net/~lesve/gsmring.html</a>.</li>
+
+</ul>
+
+<p>For links to pages and sources in Polish language see Polish version of this description.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a><br>
+
+<p><a NAME="36"></a><font color="#1F409F" size=+2 class="dzial">36. Does using/activating netmonitor cost anything ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Your phone HAS TO monitor network state/signal level, etc. to normal work
+(and your operator DOESN'T TAKE MONEY for it !). You only can decide, if info
+about it will be displayed or not - it depends ONLY on you. The same situation
+is with other parameters connected with phone (for example, battery charging).
+
+<p>You can activate netmonitor FREE using methods from
+<a href="faq_net0.htm#4"><b>How to activate it ?</b></a>, eventually pay
+somebody for it ANY money ;-)) - he will do it the same thing...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="37"></a><font color="#1F409F" size=+2 class="dzial">37. Does using netmonitor is legall ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Pryvatly I think: I received (free ;-)) software for it and I don't
+make anything wrong. So, why I can't observe parameters ?
+
+<p>BTW - different thing is with simlocks (especially, when phone was bought
+in promotion and signed agreement is not expired ;-)))) ....
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="38"></a><font color="#1F409F" size=+2 class="dzial">38. Which entries on SIM card are used in netmonitor tests ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>In new Nokia phones you have to write/read some values changed in some tests
+in/from some entries in phonebook on SIM card:
+
+<p>
+<ul>
+<li>31 - <a href=faq_net5.htm#Menu71_72>test 71</a> (AUDIO ENHANCEMENT). You should write value 0-65536 there</li>
+<li>32 - <a href=faq_net5.htm#Menu71_72>test 72</a> (AUDIO ENHANCEMENT). You should write value 0-65536 there</li>
+<li>33 - <a href=faq_net3.htm#Menu17>test 17</a> (BTS TEST). You should write
+channel number (for GSM 900 1-124, for GSM 1800 512-885) there</li>
+<li>34, 35, 36 - <a href=faq_net4.htm#Menu52>test 52</a> (reading files from SIM)
+and <a href=faq_net4.htm#Menu53>test 53</a> (writing files to SIM). In entry
+34 will be put address of file, 35 its' contenst and in 36 info about
+success/failure of reading/writing</li>
+</ul>
+
+<p>Similiar activities in older models (2110i, etc.) were connected with writing values
+into (for example) internal phone phonebook in entry 98.
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="39"></a><font color="#1F409F" size=+2 class="dzial">39. Can I activate netmonitor in 3310 using soft working with 3210 ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p><b>YES</b> - in all new models of Nokia phones you can use the same computer soft.
+I advice reading point <a href=faq_net0.htm#4>How to activate it ?</a>...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="40"></a><font color="#1F409F" size=+2 class="dzial">40. After activating netmonitor/BTS TEST my phone can't find network...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Nokia phones had always good firmware without too many errors, bugs and mistakes.
+Some new models (like 6210) make more problems, but even they're so good, that
+simple activating netmonitor menu doesn't make problems.
+They can be sometimes visible (like hanging phone) when use concrete tests.
+It's good to update firmware of phone then and inform me about problem :-)))
+-> I collect firmware bugs in my pages.
+
+<p>Finding and loosing network signal doesn't depend rather on netmonitor -
+it's possible, that in concrete place and time you don't have transmitters
+of your operator or network is busy. It happens and is rather normal.
+
+<p>Different situation is, when BTS TEST is enabled. Your operator can use
+set in test channel on small area only and outside it your phone will not show
+network signal. So, disable it then (see description of <a href=faq_net3.htm#Menu17>test 17</a>).
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<p><a NAME="41"></a><font color="#1F409F" size=+2 class="dzial">41. Netmonitor shows different battery capacity than info on it...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Phone takes info about battery capacity from resistor inside.
+If it's different than should be, you see such incorrect info in netmonitor.
+You can only check (and compare with original), if phone has longer standby/speech time.
+If yes, you have bigger battery...
+
+<p>You have to remember about one detail:
+In case of LiION battery you will find in netmonitor
+(<a href=faq_net3.htm#Menu20>test 20</a>)
+the same value as on battery casing, in NiMH batteries
+this value can differ even by 200 mAh (and it changes)...
+
+<font class="drukuj">
+<p><a class="shref" href="#Top"><small><em>Back to the top</em></small></a>
+</font>
+
+<center>
+<p><a href="faq_net0.htm">[Part 1]</a><a href="faq_net1.htm">[Part 2]</a><a href="faq_net2.htm">[Part 3]</a><a href="faq_net3.htm">[Part 4]</a><a href="faq_net4.htm">[Part 5]</a><a href="faq_net5.htm">[Part 6]</a><b>[Part 7]</b>
+</center>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+</font>
+
+<br><p align="RIGHT"><font class='autor' size='1'><a class="autoremail" href="mailto:Marcin Wiacek<Marcin-Wiacek@topnet.pl>">Marcin Wiacek</a> (<a class="autoremail" href="http://marcin-wiacek.topnet.pl">WWW</a>)
+<br>Last modification: 5 January 2002</font>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="Description" content="Odsy³acze do testów w opisie monitora sieci">
+ <title>Odsy³acze do testów monitora sieci</title>
+
+<STYLE TYPE='text/css'><!--
+<!-- style z www.fkn.pl -->
+<!-- nieznacznie zmienione na potrzeby -->
+<!-- strony Marcina Wi±cka (www.marcin-wiacek.topnet.pl) -->
+BODY {font-family: Arial, Helvetica; margin-right: 0pt; font-weight: normal; font-size:10pt; text-decoration: none; color:#2B2B69}
+P {font-family: Arial, Helvetica; font-weight: normal; font-size:10pt; text-decoration: none; color:#2B2B69}
+font.menu {font-family: Arial, Helvetica; font-weight: bold; font-size:8pt; text-decoration: none; color:#2B2B69}
+a.menu {font-family: Arial, Helvetica; font-weight: bold; font-size:8pt; text-decoration: none; color:#525FF5}
+a.menu:hover {font-family: Arial, Helvetica; font-weight: bold; font-size:8pt; text-decoration: underline; color:#1F409F}
+a.menu:active {font-family: Arial, Helvetica; font-weight: bold; font-size:8pt; text-decoration: underline; color:#2FA030}
+--></STYLE>
+
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<center><font class=menu>Wybierz numer testu</font><p>
+
+<a class=menu href=faq_net2.htm#Menu1 title='Informacje o trybie komunikacji z komorka' target=main>1</a>
+<a class=menu href=faq_net2.htm#Menu2 title='Nastepne parametry sieci' target=main>2</a>
+<a class=menu href=faq_net2.htm#Menu3 title='Informacje o aktualnie uzywanej i sasiednich komorkach' target=main>3</a>
+<a class=menu href=faq_net2.htm#Menu4_5 title='Informacje o sasiednich komorkach' target=main>4</a>
+<a class=menu href=faq_net2.htm#Menu4_5 title='Informacje o sasiednich komorkach' target=main>5</a>
+<a class=menu href=faq_net2.htm#Menu6 title='Informacje o "preferowanych" i zabronionych sieciach wlozonej do telefonu karty SIM' target=main>6</a>
+<a class=menu href=faq_net2.htm#Menu7 title='Informacje o aktualnie uzywanej (ostatnio monitorowanej) komorce' target=main>7</a>
+<a class=menu href=faq_net3.htm#Menu8 target=main>8</a>
+<a class=menu href=faq_net3.htm#Menu9 target=main>9</a>
+<a class=menu href=faq_net3.htm#Menu10 title='Informacje sieciowe (dotycza aktualnie uzywanej albo ostatnio monitorowanej sieci)' target=main>10</a>
+<a class=menu href=faq_net3.htm#Menu11 title='Identyfikacja aktualnie uzywanej (ostatnio monitorowanej) sieci' target=main>11</a>
+<a class=menu href=faq_net3.htm#Menu12 title='Parametry aktualnie uzywanej (ostatnio monitorowanej) sieci' target=main>12</a>
+<a class=menu href=faq_net3.htm#Menu13 title='Informacje o przerywanej transmisji (DTX) w aktualnie uzywanej (ostatnio monitorowanej) sieci' target=main>13</a>
+<a class=menu href=faq_net3.htm#Menu14 title='SCREENING INDICATOR (wartosci 0 albo 1)' target=main>14</a>
+<a class=menu href=faq_net3.htm#Menu15 title='AMPS' target=main>15</a>
+<a class=menu href=faq_net3.htm#Menu17 title='BTS TEST' target=main>17</a>
+<a class=menu href=faq_net3.htm#Menu18 title='LIGHTS (wartosci 0 albo 1)' target=main>18</a>
+<a class=menu href=faq_net3.htm#Menu19 title='CELL BARR (ACCEPTED - tylko normalne komorki, REVERSE - tylko testowane, DISCARD - wszystkie)' target=main>19</a>
+<a class=menu href=faq_net3.htm#Menu20 title='Informacje o baterii i trybie pracy ladowarki' target=main>20</a>
+<a class=menu href=faq_net3.htm#Menu21 title='Parametry ladowania' target=main>21</a>
+<a class=menu href=faq_net3.htm#Menu22 title='Wskazniki pozwalajace ocenic parametry ladowania' target=main>22</a>
+<a class=menu href=faq_net3.htm#Menu23 title='Informacje o baterii' target=main>23</a>
+<a class=menu href=faq_net3.htm#Menu24 target=main>24</a>
+<a class=menu href=faq_net3.htm#Menu25 target=main>25</a>
+<a class=menu href=faq_net4.htm#Menu30 title='Test z zawartosciami rejestrow API dzwieku' target=main>30</a>
+<a class=menu href=faq_net4.htm#Menu32 target=main>32</a>
+<a class=menu href=faq_net4.htm#Menu34 title='Informacje o polaczeniu telefonu z komputerem kablem FBUS' target=main>34</a>
+<a class=menu href=faq_net4.htm#Menu35 title='Przyczyna ostatniego restartu oprogramowania telefonu' target=main>35</a>
+<a class=menu href=faq_net4.htm#Menu36 title='Przyczyny restartu oprogramowania telefonu' target=main>36</a>
+<a class=menu href=faq_net4.htm#Menu38 title='Zrzut pamieci' target=main>38</a>
+<a class=menu href=faq_net4.htm#Menu39 title='Przyczyna zakonczenia ostatniego polaczenia' target=main>39</a>
+<a class=menu href=faq_net4.htm#Menu40 title='Zerowanie licznikow handover (testy 41-43)' target=main>40</a>
+<a class=menu href=faq_net4.htm#Menu41 title='Informacje o handoverach' target=main>41</a>
+<a class=menu href=faq_net4.htm#Menu42 title='Handovery Intra cell - Intra BSC w telefonach dualnych' target=main>42</a>
+<a class=menu href=faq_net4.htm#Menu43 title='Liczniki T200' target=main>43</a>
+<a class=menu href=faq_net4.htm#Menu44 title='REVISION LEVEL (wartosci 0 lub 1)' target=main>44</a>
+<a class=menu href=faq_net4.htm#Menu45 title='TRANSMITTER (ENABLED lub DISABLED)' target=main>45</a>
+<a class=menu href=faq_net4.htm#Menu46 target=main>46</a>
+<a class=menu href=faq_net4.htm#Menu48 title='Informacje o aktualnie uzywanej (ostatnio monitorowanej) komorce (Nokia 3110)' target=main>48</a>
+<a class=menu href=faq_net4.htm#Menu51 title='Informacje o karcie SIM' target=main>51</a>
+<a class=menu href=faq_net4.htm#Menu52 title='Czytanie zawartosci karty SIM' target=main>52</a>
+<a class=menu href=faq_net4.htm#Menu53 title='Zmiana komorek karty SIM' target=main>53</a>
+<a class=menu href=faq_net4.htm#Menu54 title='Informacje o blokach pamieci' target=main>54</a>
+<a class=menu href=faq_net4.htm#Menu55 title='Informacje o blokach pamieci' target=main>55</a>
+<a class=menu href=faq_net4.htm#Menu56 title='Informacje o blokach pamieci' target=main>56</a>
+<a class=menu href=faq_net4.htm#Menu57 title='Stan pamieci telefonu przed restartem' target=main>57</a>
+<a class=menu href=faq_net5.htm#Menu58 target=main>58</a>
+<a class=menu href=faq_net5.htm#Menu59 target=main>59</a>
+<a class=menu href=faq_net5.htm#Menu60 title='Zerowanie licznikow handover (testy 41-43) i testow 61-66' target=main>60</a>
+<a class=menu href=faq_net5.htm#Menu61 title='Liczniki braku PSW, synchronizacji i powtornych wyborow komorki' target=main>61</a>
+<a class=menu href=faq_net5.htm#Menu62 title='Liczniki PSW, synchronizacji w sasiednich komorkach i pomiarow BCCH' target=main>62</a>
+<a class=menu href=faq_net5.htm#Menu63 title='Liczniki polaczen' target=main>63</a>
+<a class=menu href=faq_net5.htm#Menu64 title='Liczniki Location Update' target=main>64</a>
+<a class=menu href=faq_net5.htm#Menu65 title='Liczniki SMSow' target=main>65</a>
+<a class=menu href=faq_net5.htm#Menu66 title='Liczniki przekroczenia czasu (zwiazane z SMSami)' target=main>66</a>
+<a class=menu href=faq_net5.htm#Menu67 target=main>67</a>
+<a class=menu href=faq_net5.htm#Menu68 target=main>68</a>
+<a class=menu href=faq_net5.htm#Menu70 title='Rejestry DSP' target=main>70</a>
+<a class=menu href=faq_net5.htm#Menu71_72 title='AUDIO ENHANCEMENT' target=main>71</a>
+<a class=menu href=faq_net5.htm#Menu71_72 title='AUDIO ENHANCEMENT' target=main>72</a>
+<a class=menu href=faq_net5.htm#Menu73 title='Ogolne informacje o ustawieniach DSP' target=main>73</a>
+<a class=menu href=faq_net5.htm#Menu74 title='Informacje o glosnosci podczas rozmowy' target=main>74</a>
+<a class=menu href=faq_net5.htm#Menu75 title='Informacje o trybie pracy podlaczonych akcesoriow' target=main>75</a>
+<a class=menu href=faq_net5.htm#Menu76 title='Informacje o dzwieku, ktory Ty slyszysz w swoim telefonie' target=main>76</a>
+<a class=menu href=faq_net5.htm#Menu77 title='Informacje o dzwieku, ktory slyszy Twoj rozmowca' target=main>77</a>
+<a class=menu href=faq_net5.htm#Menu78 title='Kolejne parametry DSP' target=main>78</a>
+<a class=menu href=faq_net5.htm#Menu79 title='Kolejne parametry DSP' target=main>79</a>
+<a class=menu href=faq_net5.htm#Menu80 title='Zerowanie licznikow z testu 82' target=main>80</a>
+<a class=menu href=faq_net5.htm#Menu81 title='Wlaczanie/wylaczanie licznikow z testu 82' target=main>81</a>
+<a class=menu href=faq_net5.htm#Menu82 title='Liczniki czasu (ile czasu telefon jest wlaczony, itp.)' target=main>82</a>
+<a class=menu href=faq_net5.htm#Menu83 title='Zmienia wartosci wyswietlane w testach 84-87' target=main>83</a>
+<a class=menu href=faq_net5.htm#Menu84_86 target=main>84</a>
+<a class=menu href=faq_net5.htm#Menu85_86 target=main>85</a>
+<a class=menu href=faq_net5.htm#Menu86_86 target=main>86</a>
+<a class=menu href=faq_net5.htm#Menu87 target=main>87</a>
+<a class=menu href=faq_net5.htm#Menu88 title='Informacje o wersjach DSP i oprogramowania, suma kontrolna pamieci' target=main>88</a>
+<a class=menu href=faq_net5.htm#Menu89 title='Wersja sprzetowa telefonu (i nazw operatorow)' target=main>89</a>
+<a class=menu href=faq_net6.htm#Menu90 title='Liczniki otwarc pokrywy i podlaczen zestawow (sluchawkowego i samochodowego)' target=main>90</a>
+<a class=menu href=faq_net6.htm#Menu91 title='Zeruje liczniki z testu 90' target=main>91</a>
+<a class=menu href=faq_net6.htm#Menu92 title="Aktywuje profil 'headset'" target=main>92</a>
+<a class=menu href=faq_net6.htm#Menu93 target=main>93</a>
+<a class=menu href=faq_net6.htm#Menu94 target=main>94</a>
+<a class=menu href=faq_net6.htm#Menu95 target=main>95</a>
+<a class=menu href=faq_net6.htm#Menu96 target=main>96</a>
+<a class=menu href=faq_net6.htm#Menu98 target=main>98</a>
+<a class=menu href=faq_net6.htm#Menu99 target=main>99</a>
+<a class=menu href=faq_net6.htm#Menu100 target=main>100</a>
+<a class=menu href=faq_net6.htm#Menu101 target=main>101</a>
+<a class=menu href=faq_net6.htm#Menu102 target=main>102</a>
+<a class=menu href=faq_net6.htm#Menu103 target=main>103</a>
+<a class=menu href=faq_net6.htm#Menu104 target=main>104</a>
+<a class=menu href=faq_net6.htm#Menu105 target=main>105</a>
+<a class=menu href=faq_net6.htm#Menu106 target=main>106</a>
+<a class=menu href=faq_net6.htm#Menu107 target=main>107</a>
+<a class=menu href=faq_net6.htm#Menu108 target=main>108</a>
+<a class=menu href=faq_net6.htm#Menu109 target=main>109</a>
+<a class=menu href=faq_net6.htm#Menu110_115 target=main>110-115</a>
+<a class=menu href=faq_net6.htm#Menu130 target=main>130</a>
+<a class=menu href=faq_net6.htm#Menu131 target=main>131</a>
+<a class=menu href=faq_net6.htm#Menu132 target=main>132</a>
+<a class=menu href=faq_net6.htm#Menu133 target=main>133</a>
+<a class=menu href=faq_net6.htm#Menu140 target=main>140</a>
+<a class=menu href=faq_net6.htm#Menu240 title='Zeruje liczniki z testow 41-43, 61-62 i 82 (ten ostatni rowniez wlacza)' target=main>240</a>
+<a class=menu href=faq_net6.htm#Menu241 title='Wylacza monitor sieci' target=main>241</a>
+<a class=menu href=faq_net6.htm#Menu242 title='Wlacza okrojony monitor sieci' target=main>242</a>
+<a class=menu href=faq_net6.htm#Menu243 title='Wlacza pelen monitor (ten test mozna uzyc tylko z komputera)' target=main>243</a>
+<a class=menu href=faq_net6.htm#Menu250 title='Czysci informacje z testu 57' target=main>250</a>
+<a class=menu href=faq_net6.htm#Menu497 title='' target=main>497</a>
+
+</center>
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>SMS FAQ</title>
+ <link REL=stylesheet HREF="../../styl.css" TYPE="text/css">
+</head>
+<body>
+
+<a NAME="Top"></a>
+<p align="RIGHT"><a class="autoremail" href="../../index.htm">Main page</a></p>
+<center><font color="#1F409F" size=+2 class="tytul">SMS FAQ</font></center>
+
+<p><hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+<p><font color="#1F409F" size=+2 class="dzial">What is SMS ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>You can send from your phone short text letters. And this is SMS
+(Short Messaging System).
+
+<p><font color="#1F409F" size=+2 class="dzial">What is SMSC ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>This is Short Messaging System Centre.
+
+<p>Idea is simple: when you write
+your SMS, select recipient(s) and send your SMS, it's send to SMSC.
+If you see "Message sent" ot something like that, don't worry. It means,
+that your SMS was delivered to SMSC and SMSC try to delivery it to recipient(s).
+
+<p>Why is it done this way ? Let's say, that recipient's phone is disabled.
+If it will done this way, that your phone will try to delivery it directly,
+it will loose energy during each try and you have to be in network coverage
+during it. GSM network makes it easier - not you, but SMSC try to delivery it.
+And of course, you can decide, how long it should be done (after it SMS will
+deleted).
+
+<p><font color="#1F409F" size=+2 class="dzial">What SMSC should I use ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>The most simple answer is: ask your operator and use its' own SMSC.
+
+<p>But sometimes it's not so simple: it's possible, that SMSC of your operator
+CAN'T send SMS to some other network. You should try to use different SMSC then.
+But remember: if you will try to use SMSC from different country, you have
+to have activated international calls.
+
+<p><font color="#1F409F" size=+2 class="dzial">Can I use my own SMSC in roaming ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Yes.
+
+<p><font color="#1F409F" size=+2 class="dzial">Can SMS contains not only text ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Of course. Each SMS contains some bytes filled with contest. Normally they're
+filled with chars. But of course you can decide, that they have different meaning
+and send +binary data this way too...
+
+<p>In this moment we can classify SMS to:
+
+<p>
+<ul>
+<li>7 bit SMS - you can put each of 127 chars into it</li>
+<li>Unicode SMS - you can each of 65550 chars into it</li>
+<li>binary data SMS - ringtone, picture, etc.</li>
+</ul>
+
+<p><font color="#1F409F" size=+2 class="dzial">What is length of SMS ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Each SMS can contains ONLY 140 8 bit chars. When you code it as 7 bit SMS,
+you can save 160 chars (you have 140*8 bits inside and they're divided into
+7 bits) and when code as Unicode SMS, 70 chars (each char in such SMS contains
+of 2 8 bit chars).
+
+<p>It's also possible to put into each sent SMS
+special flag, which will mean: this
+is first, second, third,... part of SMS. Some phones can display this info
+(for example info "Linked: 1/...") or even display each SMS with such flag
+as one long... Such SMS are called concatenated or linked.
+
+<p><font color="#1F409F" size=+2 class="dzial">What is price for sending SMS ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Ask your operator :-)
+
+<p>Generally you pay for EACH SMS with 140 8 bit chars. It means, that
+after sending Linked SMS consist of 2 such SMS, you will pay for 2. The similiar
+thing is with Picture Images (each of them consist of 3 SMS) and Reminders
+from Nokia 3310 (2 SMS).
+
+<p>Something it's free. When ? When you are in roaming and network, you use,
+write in logs, that sent SMS, when it was send ONLY over SMSC of this network (remember:
+you can you SMSC from your home network). Or when SMSC, you used, gives info
+to network about error during sending, but send it correctly !
+
+<p><font color="#1F409F" size=+2 class="dzial">What is price for receiving SMS ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>In many networks it's free...
+
+<p><font color="#1F409F" size=+2 class="dzial">What is SMS class ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Each SMS have flag with info, what should be done with it after delivering
+to recipients' phone. There are 4 possiblities (classes):
+
+<UL>
+ <LI>Class 0: displayed immedietaly after receiving
+ in display of SMS recipient</li>
+ <LI>Class 1:</li>
+ <LI>Class 2: saved in SIM card of recipient</li>
+ <LI>Class 3:</LI>
+</UL>
+
+<p><font color="#1F409F" size=+2 class="dzial">What is delivery time ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>This is the time, during it SMSC will try to delivery your SMS.
+
+<p><font color="#1F409F" size=+2 class="dzial">What is delivery raport ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>You can know, if your SMS was delivered to recipients' phone
+(don't misguide it with reading !). It's free. There are two ways
+to do it:
+
+<p>
+<ol>
+<li>enable such option in your phone. Of course, it will work
+only, when used SMSC will accept this feature</li>
+<li>write special text on the start of SMS. It can be different for
+each SMSC</li>
+</ol>
+
+<p><font color="#1F409F" size=+2 class="dzial">What it "Reply via own centre" ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Theoretically, when you send SMS with flag to somebody, it should
+be able to send answer over your SMSC. Often it doesn't work (many SMSC
+doesn't accept SMS from forbidden networks even with this flag).
+
+<p><font color="#1F409F" size=+2 class="dzial">I have error, when answer to received SMS</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>
+<ul>
+<li>you don't have correct SMSC in phone</li>
+<li>person, who sent SMS to you, marked "Reply via own center" option.
+Try to send SMS over your own SMSC</li>
+<li>you can't send SMS (don't have it activated in your operator)</li>
+</ul>
+
+</body>
+</html>
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
+ <meta name="Author" content="Marcin Wiacek">
+ <title>GNOKII/XGNOKII HELP</title>
+ <link REL=stylesheet HREF="styl.css" TYPE="text/css">
+</head>
+<body>
+
+ <br>
+<font face="Comic Sans MS" size=+3 class="glowna1">GNOKII/XGNOKII </font><b><font face="Tahoma" color="#FF6666" size=+1 class="glowna2">HELP</font></b>
+
+<p>Welcome in our help system.
+
+<p><b>Gnokii related topics</b>
+<ul>
+<li><a href="gnokii/faq.htm">The most often asked questions about it...</a></li>
+<li><a href="gnokii/config.htm">Installing, configuration and making data calls</a></li>
+<li><a href="gnokii/gnokii-6210-7110-IrDA">Infrared with Nokia 62xx/7110</a></li>
+<li><a href="gnokii/phones.htm">Supported phones</a></li>
+<li><a href="gnokii/gnokii.htm">Readme for command line gnokii</a></li>
+<li><a href="gnokii/todologo">Readme for TODOLOGO script</a></li>
+<li>
+<b>To know more about xgnokii windows...</b>
+<ul>
+<li><a href="gnokii/xgnokii/main/index.htm">Main window</a></li>
+<li><a href="gnokii/xgnokii/calendar/index.htm">Calendar window</a></li>
+<li><a href="gnokii/xgnokii/contacts/index.htm">Contacts window</a></li>
+<li><a href="gnokii/xgnokii/dtmf/index.htm">DTMF window</a></li>
+<li><a href="gnokii/xgnokii/netmon/index.htm">Netmonitor window</a></li>
+<li><a href="gnokii/xgnokii/sms/index.htm">SMS window</a></li>
+<li><a href="gnokii/xgnokii/speeddial/index.htm">Speed Dial window</a></li>
+<li><a href="gnokii/xgnokii/xkeyb/index.htm">Keyboard window</a></li>
+</ul>
+</li>
+</ul>
+
+<p><b>If you want to know something more about Nokia/GSM mobile phones...</b>
+<ul>
+<li><a href="gsm/firmware/firmware.htm">Bugs and changes in firmware of phones</a></li>
+<li><a href="gsm/netmon/faq_net0.htm">Netmonitor manual</a></li>
+<li><a href="gsm/codes/codes.htm">Keypad codes</a></li>
+<li><a href="gsm/compare/compare.htm">Compare your phone (Java Script required !)</a></li>
+<li><a href="gsm/cables/cables.htm">How to make cable</a></li>
+<li><a href="gsm/irda/irda.htm">How to make IrDa port</a></li>
+<li><a href="gsm/logos/logos.htm">Logos FAQ</a></li>
+<li><a href="gsm/sms/sms.htm">SMS FAQ</a></li>
+</ul>
+
+</div>
+</body>
+</html>
--- /dev/null
+<HTML>
+<STYLE TYPE="text/css">
+<!-- styles from www.fkn.pl -->
+<!-- changed to page of Marcin Wiacek (www.marcin-wiacek.topnet.pl) -->
+<!--
+
+@media print {font.drukuj {display:none}}
+@media print {a.autoremail:hover,a.autoremail:active,a.shref:hover,a.shref:active,a.dzial:hover,a.dzial:active,a:hover,a:active {text-decoration:none; color:#525FF5}}
+@media print {a.autoremail:hover,a.autoremail:active,a.dzial:hover,a.dzial:active {font-weight:normal}}
+@media print {a.shref:hover,a.shref:active,a:hover,a:active {font-weight:bold}}
+
+B {font-weight:bold}
+TT {font-family:Courier}
+
+BODY {text-align: justify; margin-left: 10pt; margin-right: 10pt; margin-top: 0pt; margin-bottom: 0pt; background: #ffffff; font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#2B2B69}
+H1, H2, H3 {font-family: Arial, Helvetica; font-weight: bolder; text-decoration: none; color:#2B2B69}
+TABLE, TR, TD, UL, OL, LI, P, BLOCKQUOTE {font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#2B2B69}
+a {font-family: Arial, Helvetica; font-weight: bold; text-decoration: none; color:#525FF5}
+a:hover {font-weight: bolder; text-decoration: underline; color:#1F409F}
+a:active {font-weight: bolder; text-decoration: underline; color:#2FA030}
+
+font.tytul {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#004080}
+
+font.podtytul {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#FF0000}
+a.podtytul {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#FF0000}
+
+font.dzial {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#1F409F}
+a.dzial {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#525FF5}
+a.dzial:hover {font-weight: bolder; text-decoration: underline}
+a.dzial:active {font-weight: bolder; text-decoration: underline}
+
+a.shref {font-family: Arial, Helvetica; font-weight: bold; text-decoration: none; color:#525FF5}
+a.shref:hover {font-weight: bolder; text-decoration: underline}
+a.shref:active {font-weight: bolder; text-decoration: underline}
+
+font.autor {font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#2B2B69}
+a.autoremail {font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#525FF5}
+a.autoremail:hover {font-weight: bolder; text-decoration: underline; color:#1F409F}
+a.autoremail:active {font-weight: bolder; text-decoration: underline; color:#2FA030}
+
+font.glowna1 {font-family: Comic Sans MS; font-weight: normal; text-decoration: none; color:#004080}
+font.glowna2 {font-family: Tahoma; font-weight: bold; text-decoration: none; color:#FF6666}
+
+-->
+</STYLE>
+</HTML>
--- /dev/null
+AxelF:d=4,o=5,b=125:32p,8g,8p,16a#.,8p,16g,16p,16g,8c6,8g,8f,8g,8p,16d.6,8p,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,16p,16f,8d,8a#,2g,p,SS,16f6,8d6,8c6,8a#,g,8a#.,16g,16p,16g,8c6,8g,8f,g,8d.6,16g,16p,16g,8d#6,8d6,8a#,8g,8d6,8g6,16g,16f,16p,16f,8d,8a#,2g
\ No newline at end of file
--- /dev/null
+# This is a sample ~/.gnokiirc file.
+# In Unix/Linux: copy it into your home directory and name it .gnokiirc
+# or into /etc and name it gnokiirc
+# In Win32: copy it into directory with (my)gnokii.exe
+
+[global]
+
+port = /dev/ttyS1
+model = auto
+initlength = 30
+connection = fbus
+bindir = /usr/local/sbin/
+synchronizetime = yes
+;logfile = mygnokiilog
+
+[gnokiid]
+
+port = /dev/ttyS1
+model = auto
+initlength = 30
+connection = fbus
+bindir = /usr/local/sbin/
+synchronizetime = yes
+
+[receivesms]
+path = c:\
+
+# DESCRIPTION OF PARAMETERS
+
+# PORT
+# -----------
+# Set port to the physical serial port used to connect to your phone
+# In Linux /dev/ttyS0, /dev/ttyS1, etc.
+# In Win32 COM1:, COM2:, etc.
+
+# MODEL
+# -----------
+# Set model to the model number of your phone
+# In this moment:
+#
+# for Nokia:
+# 6185
+# 3210|3310|5110|5130|5190|6110|6130|6150|6190|8210|8850
+# 6210|7110
+#
+# for AT phones:
+# at
+#
+# Please notice, that in some phones (like 7110)
+# it will be (now or in the future) provided double support - AT commands
+# or protocol specific for phone model (fbus, mbus, etc.)
+#
+# You can also use model "auto" and gnokii will try to find your
+# phone model on "port" port. This option is during development and
+# can not work excellent...Let'say - with all new supported Nokia phone
+# connected over FBUS/DLR3 cable you will not have any problem.
+# With other can be and it will have to be set manually.
+
+# INITLENGTH
+# -----------
+# Initlength controls the number of characters sent to the
+# phone during initialisation. You can either set it to
+# the word "default" or a positive integer.
+#
+# You can try setting this value if you want to connect
+# to the phone quicker. If you've never noticed the
+# connection to be slow, it is suggested that you
+# leave this alone. Read the initialisation code in fbus-xxxx
+# to understand what this changes if you're curious.
+
+# CONNECTION
+# -----------
+# The type of the connection. Can be:
+#
+# @"mbus". Models:
+# 6210|6250|7110
+# 6185
+# 3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850
+#
+# "infrared" (for direct infrared connection - in 8210/8250 use two players
+# snake menu to enter into it). Models:
+# 6110|6130|6150|8210|8850
+#
+# "tekram210" (for direct infrared connection using Tekram 210
+# - in 8210/8250 use two players snake menu to enter into it). Now in Unix only.
+# Models:
+# 6110|6130|6150|8210|8850
+#
+# "irda" (infrared over Irda sockets - now in Unix only)
+# Models:
+# 6210|6250|7110
+#
+# @"fbus". Models:
+# 6210|6250|7110
+# 3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850
+#
+# @"dlr3". Models:
+# 6210|6250|7110
+#
+# @"at". Models:
+# at
+
+# BINDIR
+# -----------
+# Set bindir to point to the location of the various gnokii binaries.
+# In particular ensure that mgnokiidev is in this location, with
+# permissions 4754, owned by root, group gnokii. Ensure you
+# are in the gnokii group and that the group exists...
+# Setting not important for win32
+
+# SYNCHRONIZETIME
+# -----------
+# set it to "yes", if want to have set time from computer to phone
+# each time, when use gnokii, xgnokii or gnokiid
+# Function works, of course, only then, when setting time is implemented
+# for your phone
+# With some phones (if it's enabled or if you generally changed date/time
+# during session with phone), after soft reset (without asking for PIN)
+# phone can lost date/time settings and ask for them or disable clock
+# on the phone screen. Seen for 6150 and 6210
+
+# LOGFILE
+# -----------
+# When there are problems with mygnokii, you have two ways
+# to help in resolving them:
+# 1.compiling mygnokii with debug and sending dump to marcin-wiacek@topnet.pl
+# 2.using this option. Mygnokii will be slower, because during work will
+# create file with name set here with short
+# info about transmission. Send it to marcin-wiacek@topnet.pl
+# Method 1 is better. When not possible (for example, when have only
+# compiled binary version), use 2.
+
+# EXAMPLES
+
+#1.Nokia 5110, fbus cable on "/dev/ttyS1" port with gnokii/xgnokii
+# Gnokiid uses "default" config
+#[global]
+#port=/dev/ttyS1
+#model=5110
+#connection=fbus
+
+#2.Nokia 5110 working with NCDS (win32) on "com1:" port with gnokii
+# Gnokiid uses "default" config
+#[global]
+#port=com1:
+#model=ATGSM
+
+#3.Nokia 7110 and dlr-3 cable. It's connected to "/dev/ttyS1" port.
+# First we want to run gnokiiid and connect to phone with fbus.
+# Then run gnokii/xgnokii and work over gnokiid (for testing gnokii
+# AT emulator and AT module - in normal work gnokiid is not required, because
+# 7110 with dlr3 has own AT commands interpreter).
+#[global]
+#port=/dev/gnokii
+#model=ATGSM
+#[gnokiid]
+#port=/dev/ttyS1
+#model=7110
+#connection=dlr3
+
+#4.Nokia 7110 and dau9p cable. It's connected to "/dev/ttyS1" port.
+# Gnokii/xgnokii work using fbus protocol (can't use AT commands
+# from 7110, when use dau9p)
+# Gnokiid uses "default" config
+#[global]
+#port=/dev/ttyS1
+#model=7110
+#connection=fbus
+
+#5.Nokia 7110 and dlr-3 cable. We want to connect with it using fbus
+# Gnokiid from gnokii is not required (with dlr3 can use AT commands built in
+# into phone, not our small ;-) AT interpreter)
+#[global]
+#port=/dev/ttyS1
+#model=7110
+#connection=dlr3
--- /dev/null
+/* XPM */
+static char * gnokii_xpm[] = {
+"49 44 256 2",
+" c None",
+". c #020203",
+"+ c #4C5A4C",
+"@ c #C2CAD2",
+"# c #8EA68C",
+"$ c #627661",
+"% c #0D1210",
+"& c #1A2622",
+"* c #6E8A6E",
+"= c #EAEAEB",
+"- c #223A36",
+"; c #A3A68E",
+"> c #9A9A8A",
+", c #A2B2A4",
+"' c #DADEDC",
+") c #524E4E",
+"! c #869E85",
+"~ c #8E7666",
+"{ c #506250",
+"] c #324A46",
+"^ c #8F9080",
+"/ c #6A626A",
+"( c #ADBAAE",
+"_ c #7B7A7B",
+": c #7E967E",
+"< c #667E66",
+"[ c #CED2D0",
+"} c #566653",
+"| c #444244",
+"1 c #293E38",
+"2 c #878A77",
+"3 c #566A56",
+"4 c #424A44",
+"5 c #121A16",
+"6 c #B8C1BA",
+"7 c #122E2A",
+"8 c #0E0E10",
+"9 c #26628E",
+"0 c #D6DADA",
+"a c #5A82A6",
+"b c #768E76",
+"c c #373E3A",
+"d c #566E86",
+"e c #757773",
+"f c #E2E2E2",
+"g c #545C59",
+"h c #6A826A",
+"i c #EEEEEF",
+"j c #5E725E",
+"k c #9EAE9C",
+"l c #252D2B",
+"m c #9AB2C2",
+"n c #A2A692",
+"o c #8F9A8F",
+"p c #425650",
+"q c #7E856D",
+"r c #A6B4A6",
+"s c #7C8A98",
+"t c #BEC6BE",
+"u c #AEAEAE",
+"v c #1A322E",
+"w c #666C68",
+"x c #36423C",
+"y c #6D6E6E",
+"z c #494A49",
+"A c #869EB2",
+"B c #373A38",
+"C c #828676",
+"D c #262223",
+"E c #4E6682",
+"F c #828A72",
+"G c #626A68",
+"H c #0E0909",
+"I c #151E1A",
+"J c #9AA28A",
+"K c #6E786E",
+"L c #666666",
+"M c #8E8E8E",
+"N c #929E8A",
+"O c #92A6B6",
+"P c #828F7D",
+"Q c #29342F",
+"R c #DAD6DA",
+"S c #464F46",
+"T c #8E968A",
+"U c #AEB5B0",
+"V c #827A72",
+"W c #768574",
+"X c #B2BABA",
+"Y c #7A8E77",
+"Z c #3E423E",
+"` c #D2D6D5",
+" . c #5A655E",
+".. c #82967F",
+"+. c #F1F2F2",
+"@. c #6E866E",
+"#. c #9AAA99",
+"$. c #BEBEBF",
+"%. c #466686",
+"&. c #7A927B",
+"*. c #7C7F7B",
+"=. c #767E7A",
+"-. c #C9CECC",
+";. c #1E2626",
+">. c #787068",
+",. c #9EA28E",
+"'. c #0A0507",
+"). c #687671",
+"!. c #8AA288",
+"~. c #829A81",
+"{. c #E2E6E3",
+"]. c #364644",
+"^. c #667A65",
+"/. c #5A6E5A",
+"(. c #263A36",
+"_. c #171615",
+":. c #898A8A",
+"<. c #5B5A5A",
+"[. c #555654",
+"}. c #A6A6A6",
+"|. c #1C1E1C",
+"1. c #7C867E",
+"2. c #B2B2B2",
+"3. c #BEC2C0",
+"4. c #362E32",
+"5. c #2E3631",
+"6. c #889692",
+"7. c #32463E",
+"8. c #364A46",
+"9. c #9EA292",
+"0. c #060708",
+"a. c #313E3C",
+"b. c #667267",
+"c. c #96A795",
+"d. c #4D4E4C",
+"e. c #889284",
+"f. c #9A9A99",
+"g. c #828671",
+"h. c #3E524E",
+"i. c #727E76",
+"j. c #2E3A33",
+"k. c #B6B6B6",
+"l. c #A9AAAA",
+"m. c #5A6A6A",
+"n. c #646C70",
+"o. c #3A4A45",
+"p. c #D2D2D2",
+"q. c #8C827E",
+"r. c #929292",
+"s. c #F5F6F6",
+"t. c #768A86",
+"u. c #7E8E84",
+"v. c #6E826C",
+"w. c #BABABA",
+"x. c #9E9E8E",
+"y. c #A2B2BE",
+"z. c #616262",
+"A. c #728A72",
+"B. c #2E2D2D",
+"C. c #526262",
+"D. c #9AA296",
+"E. c #8A9E87",
+"F. c #828A84",
+"G. c #5B5656",
+"H. c #4C524E",
+"I. c #060204",
+"J. c #7E927B",
+"K. c #3A463E",
+"L. c #4D564D",
+"M. c #4B5A57",
+"N. c #828282",
+"O. c #869A83",
+"P. c #323A34",
+"Q. c #728278",
+"R. c #6A6662",
+"S. c #454645",
+"T. c #32423E",
+"U. c #969697",
+"V. c #625C56",
+"W. c #526652",
+"X. c #6A869A",
+"Y. c #6A726D",
+"Z. c #5E6A5E",
+"`. c #5A5054",
+" + c #CECECE",
+".+ c #8A8E7E",
+"++ c #768A73",
+"@+ c #92AA90",
+"#+ c #6A7E69",
+"$+ c #C2C6C4",
+"%+ c #6A7A68",
+"&+ c #726A6A",
+"*+ c #272627",
+"=+ c #707270",
+"-+ c #728670",
+";+ c #1A221E",
+">+ c #858685",
+",+ c #9EA2A4",
+"'+ c #D6D6D6",
+")+ c #DEDEDE",
+"!+ c #191A19",
+"~+ c #8EA28A",
+"{+ c #9E9E9E",
+"]+ c #4E4E56",
+"^+ c #DEDADE",
+"/+ c #5E5E5E",
+"(+ c #56665E",
+"_+ c #667272",
+":+ c #859686",
+"<+ c #CACACA",
+"[+ c #121616",
+"}+ c #3E3E3E",
+"|+ c #AAB2BE",
+"1+ c #6E7E6F",
+"2+ c #92A690",
+"3+ c #4E4A4B",
+"4+ c #323631",
+"5+ c #5A6A62",
+"6+ c #E6E6E6",
+"7+ c #929A98",
+"8+ c #7C8E7E",
+"9+ c #C2C2C2",
+"0+ c #3E4E4E",
+"a+ c #424E44",
+"b+ c #888E8B",
+"c+ c #8E9296",
+"d+ c #9EAEAA",
+"e+ c #3A423D",
+"f+ c #3E3A3E",
+"g+ c #5F6661",
+"h+ c #3A4643",
+"i+ c #16221F",
+"j+ c #627266",
+"k+ c #5A6A5B",
+"l+ c #E6E2E6",
+"m+ c #969A8A",
+"n+ c #1E221E",
+"o+ c #C6C6C7",
+"p+ c #0A0A0A",
+"q+ c #525252",
+"r+ c #3E4640",
+"s+ c #4A4647",
+"t+ c #121211",
+"u+ c #4E5E4E",
+"v+ c #4A5E56",
+"w+ c #465252",
+"x+ c #2C3A3A",
+"y+ c #6B6A6A",
+"z+ c #323A3A",
+"A+ c #3E4A42",
+"B+ c #A2A2A2",
+"C+ c #93A196",
+"D+ c #7A7276",
+"E+ c #626E65",
+"F+ c #DADADA",
+"G+ c #BEBABE",
+" J V d.q.) x z G.q+S.e+L.Y.1.o l.k.$+ +p.'+p.p.<+$.u {+b+=.G a+x+a.a.a.K.d.h+7 T.- H ",
+" v+,.>.G.~ 4 x 4 e 7+3.f = 6+l+f )+)+)+' F+R F+R '+'+p.'+^+^+' )+` 2.e._+A+S | v x+(.H ",
+" M.; &+S V.K 2.= i i i = = 6+l+0 R '+p.9+9+<+'+9+o+'+9+'+0 ' ' ^+' F+)+' F+3.b+7.x+(.H ",
+" h.; R.e.i F+F+= = = 6+6+6+f {.R.c >+) y q+3+/+:.<.}.B.B+'+F+^+F+^+)+F+)+^+= 6+9+].1 8 ",
+" p ,.z.X i '+F+= 6+= 6+f {.)+)+y f.;.q+/+z q+_ y+<.H./+z +F+F+F+)+)+^+)+F+6+= <+0+a.8 ",
+" v+; <.$+= '+F+6+6+6+6+6+f f )+R ^+p.p.<+<+ +'+-. + +p. +'+'+F+F+F+F+' F+F+f i +h.T.8 ",
+" u+,.G.[ 6+p.'+6+{.{.f l+)+^+'+[ <+o+9+$.w.X G+k.G+G+9+9+$+-.` '+F+F+)+F+F+f i p.M.7.% ",
+" C.,.+ F+f +w.P 1.K b. .u+v++ + u+{ { 3 j j+$ ^.^.< %+^.1+1+Q.%+1+W u.e.T [ +.p.C.T.8 ",
+" (+x.H.)+' <+E+{ W.W.3 3 3 /./.j j+$ $ $ ^.< #+#+#+h v.@.-+-+A.++Y b &.8+J.( s.p. .].t+ ",
+" } x.p {.R $. .{ W.W.W.} 3 3 k+/.j $ $ $ ^.$ < #+#+#+h v.@.A.++A.++Y Y &.J.U +.F+G ].[+D ",
+" .> S {.p.$.{ { { W.3 3 /././.j /.j $ $ ^.^.< #+#+#+h -+-+-+++b ++b J.&.J.r s.0 E+7.[+q+ ",
+" 3 > h.= +2.} { W.} 3 3 3 /././.$ $ $ $ $ ^.^.#+#+v.v.-+A.Y ++J.J...J.J.: , s.F+Y.h+[+3+ ",
+" k+> A+6+<+u W.W.W.W.3 /././.j j j $ ^.^.%+%+#+h h -+v.-+-+++E+:+-+F.: : ..k +.F+Y.].5 s+ ",
+" E+^ 4 {.$+}.W.3 3 3 k+/./.j j j $ $ $ ^.< #+#+#+H.!++ ++++b j+l e.;.1+....#.s.^+=+].!+| ",
+" E+^ a+{.9+{+{ 3 3 } P.A+r+S g+r+r+P.+ v.u+c r+^.a+I.) Z.S Q.j+_.F n+K ....#.s.^+=+x !+| ",
+" j+^ K.l+6 {+W.3 3 P.. D . 8 d.. |.I.'.g+. *+'.p+) . z _.I.e.y I 1.Q *...O.c.s.' y 7.!+| ",
+" j ^ o.f $.f.W.k+k+B . >.8 8 3+. H._.0.q+I.w !+. `.. I . 4+N C.|.).l *...~.C++.F+).].I | ",
+" b..+r+F+6 U.W././.B . R.8 8 z . [.[+0.q+. R._.I.[.. . . _ : T.l /+% :+! O.2++.0 y 7.i+S. ",
+" Q.^ r+p.$.c+W././.B . n.8 8 3+. G.t+'.3+I.y+_.. G.I.. . g+:+n+}+]+8 D.! O.c.i '+n.].i+S. ",
+" t..+K.<+3.M W././.4+. _+8 8 3+. [._.'.3+I.y+!+I.<.I.. . *+E.8 S.c _.c.! ! C+s.` m.8.|.| ",
+" ++2 r+3.$+:.3 j j B . e 8 8 z . [._.'.]+I.y+_.. G.. e+0.. 1.% }+a.t+D.!.! C+s.[ C.8.& s+ ",
+" J.2 4 U <+b+W./.j B I.*+0.8 3+. [._.0./ . D 0.0.V.. H.4+. B I l H.'.o E.!.c.+.<+M.].i+z ",
+" A.F r+#.-.:./.j $ K 4 s+. 8 Q.w F.Y.K T E+s+q+>+1.w F.Q.&+D+*._+O. .#.~+!.#.s.<+h.].i+3+ ",
+" &.>+e+7+p.:./.j j .p+p+I.B P v.v.v.Q.-+++++++Y Y Y J.....~.~.! O.E.!.!.!.d+s.9+o.].i+d. ",
+" : C ].s ` >+b.j $ %+%+Y.K P h h v.@.-+-+++Y Y Y J.&.J.......~.! ! !.!.~+~+r +.w.x 8.i+]+ ",
+" 8+g.Z i.^+N.^.j j ^.^.%+%+#+v.v.@.-+-+A.++b b &.&.: : : O.! O.! E.E.~+# # U +.2.x+h+& ) ",
+" ..g.Z E+)+N.%+/./.$ ^.< #+#+v.v.-+A.++++++Y Y J.J.......~.! E.!.~+~+~+# @+6 i }.a.8.& q+ ",
+" ..g.e++ )+>+%+j $ $ ^.#+#+v.v.-+@.-+++b b Y &.&.J.: ..~.O.E.! E.!.!.# # 2+t = U.a.h+;+q+ ",
+" ..g.T.o.)+:.K j $ ^.^.#+#+v.v.-+-+-+++++b Y Y &.J.: ..~.~.O.! ! !.~+# @+@+ +)+N.T.7.;+[. ",
+" 6.q a.c +r.y j $ $ < #+h #+v.v.-+A.A.Y ++Y &.J.&.: ~...O.! ! E.E.!.# # @+' ' ).T.o.& G. ",
+" e.q a.x 2.}.w j $ $ < #+h v.-+@.-+++A.Y b Y &.J.: : ~.~.O.! !.!.~+~+# 2+# {.[ g 7.].& <. ",
+" ..q P.T.{+$._ i.v.Q.v.v.v.@.@.A.++A.++b &.J.J.: ....O.! ! E.! ~+# 2+c.@+, s.$+h.].h+n+<. ",
+" o g.P.P.1. +w. +{.= {.' ` -.6 ( #.C+T ..J.J.J...E.~+#.U 6 $+-.-.[ p.p.'++.= X ] ].].n+D ",
+" q j.P.G R $.p.f f )+F+[ <+ +<+p.'+' )+f {.6+6+6+6+f ' p.[ <+ +<+<+ +'+F+-.u 1 e+K.n+ ",
+" q 5.4+A+R w.X G+$.3.o+<+-.p.p.p. +p. +p.'+R ^+)+f )+F+'+` + +-.<+o+<+o+o+M j.h+].n+ ",
+" g.j.j.P.G+k.u 2.u u u u l.u l.2.k.$.o+o+ + +<+<+9+$.$.9+9+o+o+o+o+o+9+$.k.g+x K.K.;+ ",
+" F j.P.a.B.| <.z._ {+}.l.}.l.}.}.}.}.l.l.x.{+l.2.w.$.$.$.$.$.$.$.l._ q+S.Q [+x e+e+n+ ",
+" q 5.5.4+l -.)+<+B+e /+>+B+B+B+B+B+}.f.<.e e q+U.2.k.w.$.$.G+r.q+/ r.G+o+{+;.x x o.;+ ",
+" q 5.5.5.P.l.[ |+p.R p.M <.M {+B+{+{+<. + + +9+[.x.k.k.w.}.[.N.$+<+o+u r.e B.x x K.;+ ",
+" q j.j.Q B w '+O a @ F+'+<+R.U.{+B+z.w.9+2.l.G+2.<.u w.k.L o+ + +$+s d ,+| T.].e+e+;+ ",
+" g.5.P.5.5.B $+p.m 9 A 9+3.{+:.f.U._ 2.B+4.;.U.u _ M 2.u B+3.3.k.%.E ,+:.l e+].h+r+;+ ",
+" q 4+Q Q 4+a._ ` -.d+X.l.{+_ f.{+L u }.U.C M :.B+2.z.2.w.r.B+l.l.s }.{+]+a.].h+h+K.|. ",
+" F P.5.5.4+5.c G+o+w.B+b+y {+f.f.y $.2.u l.u 2.u k.y+}.k.G+>+:.f.{+{+>+Q Z h+h+h+h+;+ ",
+" F B Q 4+4+4+j.z.9+2.>+*.{+r.r.M :.$.o+<+ + +<+o+9+r.N.u k.w.c+*.f.U.| x e+e+r+r+A+I "};
--- /dev/null
+# Add these to magic file (located in /etc or /usr/share/misc)
+# to let the file command recognize NOL and NGG files
+#
+# Pawe³ Kot <pkot@linuxnews.pl>
+# Based on the gnokii (http://www.gnokii.org/) sources
+
+# GSM Operator Logos - NOL
+0 string NOL GSM Operator Logo, NOL format
+>10 byte x (size %d x
+>12 byte x %d)
+# GSM Caller Icons - NGG
+0 string NGG GSM Caller Icon, NGG format
+>6 byte x (size %d x
+>8 byte x %d)
--- /dev/null
+# GNOKII NETMONITOR PARAMETERS specifications
+# (pretty on screen large at least 112 columns)
+#
+# data in this file are specific to: NOKIA 6110 NSE-3 v4.33 11-03-98
+#
+# format of definition of SCREEN
+# SCREEN=screen-number:optional-description (separator may be also tab, or spaces)
+#
+# SCREEN entry may be duplicated, order is not important, we use "test nr"
+# screen number must be between 1 and 255
+#
+# format of definition of PARAMETERS
+# VAR=X:Y:LEN:NMman:TYPE:DESCRIPTION
+# (separator may be also tab, or spaces)
+# VAR: is name of parameter, it should be as you can see by pressing '*' key
+# on phone, from inside a netmonitor menu.
+# X,Y: are coordinates x & y, start form 0, 0, upper-left corner.
+# LEN: must be specified, and must not be 0.
+# NMman: name as referrred in NetMonitor manuals from Marcin Wiacek,
+# TYPE : optional, default (predefined), is string,
+# else may be D as Decimal or H as Hexadecimal, '-' as predefined.
+# so, no matter what you get from phone, on command line parameters
+# you can specify if uou want Hex or you want Dec.
+# Example is LAC/CID that may be HEX or DEC depending on firmware version.
+# TYPE refer to how data is displayed by phone, not to program output!
+# DESCRIPTION: description of parameters (optional)
+#
+# Either Type and Description are optional, so, for parsing reason
+# if you want specify Description but not Type, you MUST specify '-' as Type
+# no conversions are made in this case.
+#
+# VAR name implies two problems:
+# 1-some parameters can be in more then one screen (example H value)
+# so we had changed some names.
+#
+# 2-some screen report channel parameters, once for every channel
+# (example C2, screen 1, 3, 4, 5)
+# so we had changed some names also here.
+#
+# We check duplicate names, data len, presence of netmon man name, ...
+# Changed names are described near each interested parameters.
+#
+# Here we have adopted some convention, as described in comments, if you don't like it
+# you can change VAR names in this file and use coherents name on command line.
+#
+# Order of parameters definition is relevant only for human readability.
+# We allow max 512 parameters definition and max 255 screens,
+# (defineds in gnokii.h NM_MAX_FIELDS, NM_MAX_SCREENS)
+#
+# ATTENTION: all names are case sensitive! SCREEN def must be uppercase
+# ATTENTION: some firmware versions has some bugs (check screen 34, 38 here)
+# in this file all at right of '#' are comments, even if " # enquoted "
+#
+# Have a lot of fun!
+#
+# Andrea Scopece, a.scopece@tin.it, 22-08-2000
+
+SCREEN 0 Host Date-Time
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DATE 0 0 10 0 - - Host Date # host date
+TIME 0 1 8 0 - - Host Time # host time
+#PDATE 0 0 0 0 - - Phone Date # phone date (NOT IMPLEMENTED)
+#PTIME 0 0 0 0 - - Phone Time # phone time (NOT IMPLEMENTED)
+
+# USERS SHOULD NOT CHANGE SCREEN 0 DEFINITIONS, IT REFERS A HOST PARAMETER, NOT PHONE !!!!
+
+SCREEN 1 Communication with Cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+H 0 0 1 1 a # H, changed in screen 2, 7
+CH 1 0 3 1 bbb - Channel
+RxL 5 0 3 1 ccc - RxLevel(dB)
+TxPwr 9 0 3 1 ddd - TxPower(dBm)
+TS 1 1 1 1 e - Time Slot
+TA 3 1 2 1 ff - Time advance
+RQ 6 1 1 1 g
+RLT 8 1 4 1 mmmm
+C1 1 2 3 1 nnn
+C2 9 2 3 1 ppp
+CHT 4 3 4 1 oooo
+
+
+SCREEN 2 More info about used Cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PM 1 0 2 2 aa
+RAR 4 0 2 2 b
+Ro 6 0 1 2 c
+BC 9 0 3 2 Bdd
+RelR 1 1 2 2 ee
+QLF 6 1 1 2 f
+
+SCREEN 3 Info about current and neighbor cells (1-2)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+SCH 0 0 3 3 aaa # SCH, changed in screen 11, 66
+0C1 3 0 3 3 bbb # was C1, conflict this and other screen
+0rx 6 0 3 3 ccc # was rx, conflict this and other screen
+0C2 9 0 3 3 ddd # was C2, conflict this and other screen
+
+1CH 0 1 3 3 aaa
+1C1 3 1 3 3 bbb # idem as above ...
+1rx 6 1 3 3 ccc # idem as above ...
+1C2 9 1 3 3 ddd # idem as above ...
+
+2CH 0 2 3 3 aaa
+2C1 3 2 3 3 bbb # idem as above ...
+2rx 6 2 3 3 ccc # idem as above ...
+2C2 9 2 3 3 ddd # idem as above ...
+
+1N 4 3 2 3 ef
+2N 7 3 2 3 gh
+
+
+SCREEN 4 Info about neighbor cells (3-4-5)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+3CH 0 0 3 4 aaa
+3C1 3 0 3 4 bbb
+3rx 6 0 3 4 ccc
+3C2 9 0 3 4 ddd
+
+4CH 0 1 3 4 aaa
+4C1 3 1 3 4 bbb
+4rx 6 1 3 4 ccc
+4C2 9 1 3 4 ddd
+
+5CH 0 2 3 4 aaa
+5C1 3 2 3 4 bbb
+5rx 6 2 3 4 ccc
+5C2 9 2 3 4 ddd
+
+3N 2 3 2 4 ef
+4N 5 3 2 4 gh
+5N 8 3 2 4 ij
+
+
+SCREEN 5 Info about neighbor cells (6-7-8)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+6CH 0 0 3 5 aaa
+6C1 3 0 3 5 bbb
+6rx 6 0 3 5 ccc
+6C2 9 0 3 5 ddd
+
+7CH 0 1 3 5 aaa
+7C1 3 1 3 5 bbb
+7rx 6 1 3 5 ccc
+7C2 9 1 3 5 ddd
+
+8CH 0 2 3 5 aaa
+8C1 3 2 3 5 bbb
+8rx 6 2 3 5 ccc
+8C2 9 2 3 5 ddd
+
+6N 2 3 2 5 ef
+7N 5 3 2 5 gh
+8N 8 3 2 5 ij
+
+
+SCREEN 6 Preferred and forbidden networks
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+LReg 0 0 5 6 aaabb
+1_Pre 0 1 5 6 aaabb
+2_Pre 0 2 5 6 aaabb
+3_Pre 0 3 5 6 aaabb
+
+1_For 7 0 5 6 aaabb
+2_For 7 1 5 6 aaabb
+3_For 7 2 5 6 aaabb
+4_For 7 3 5 6 aaabb
+
+
+SCREEN 7 Info about last monitored cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+E 0 1 1 7 a
+A 2 1 1 7 b
+Ho 4 1 1 7 c # was H, conflict screen 1, 2
+C 6 1 1 7 d
+I 8 1 1 7 e
+BR 10 1 2 7 fg
+
+SCREEN 8 NO TEST
+SCREEN 9 NO TEST
+SCREEN 9 NO TEST
+
+SCREEN 10 "Network information (last monitored cell)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TMSI 4 0 8 10 aaaaaaaa H
+T3212 5 1 7 10 bbb-ccc
+PaRP 4 2 1 10 d
+DSF 7 2 2 10 ee
+AGC 10 2 2 10 ff
+AFC 1 3 5 10 ggggg
+Ch 9 3 3 10 hhh
+
+SCREEN 11 Cell identification
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MCC 3 0 3 11 xxx
+MNC 9 0 2 11 xxx
+LAC 6 1 4 11 xxx H
+sch 7 2 3 11 xxx # was SCH, conflict in screen 3, 66
+CID 6 3 4 11 xxx H
+
+SCREEN 12 Network parameters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+Cipher 8 0 3 12 aaa
+Hopping 8 1 3 12 bbb
+DTX 8 2 3 12 ccc
+IMSI 8 3 3 12 ddd
+
+SCREEN 13 Info DTX / Network
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DTXMode 0 0 10 13 aaaaaaaaaa
+DTX_Def 9 1 3 13 bbb
+DTX_BS 9 2 3 13 ccc
+
+SCREEN 14 NO TEST
+SCREEN 15 NO TEST
+SCREEN 16 NO TEST
+
+SCREEN 17 BTS channel test
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+BTS 4 2 3 17 aaa
+
+SCREEN 18 NO TEST
+
+SCREEN 19 Cell selection
+CBARR 2 2 8 19 aaaaaaaa
+
+SCREEN 20 Battery and phone charger mode
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+BatVol 1 0 3 20 aaa
+ChMod 6 0 5 20 bbbbb
+BTemp 2 1 3 20 ccc
+ChTime 8 1 3 20 ddd
+ChrgVol 2 2 3 20 eee
+Pwm 8 2 3 20 fff
+BTyp 1 3 4 20 gggg
+BFDC 7 3 4 20 hhhh
+
+SCREEN 21 Charger parameters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MTDif 1 0 4 21 aaaa
+MPDif 7 0 4 21 bbbb
+BUpV 2 1 3 21 ccc
+BDownV 8 1 3 21 ddd
+AverV 2 2 3 21 eee
+SumMF 8 2 3 21 fff
+
+SCREEN 22 Charger parameters and indicators
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DeriC 1 0 4 22 aaaa
+ChAm 7 0 4 22 bbbb
+Vdif 1 1 4 22 cccc
+VDrop 7 1 4 22 dddd
+VDTi 1 2 4 22 eeee
+AvDif 7 2 4 22 ffff
+Temp 1 3 4 22 gggg
+Volt 7 3 4 22 hhhh
+
+SCREEN 23 Battery full detection
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TxOn 1 0 4 23 aaaa
+TxOff 7 0 4 23 bbbb
+ChCur 1 1 4 23 cccc
+Stdby 7 1 4 23 dddd
+Age 0 2 3 23 eee
+CAP 4 2 3 23 fff
+Curr 8 2 4 23 gggg
+Tmp 0 3 3 23 hhh
+CmAh 4 3 4 23 iiii
+Targ 8 3 4 23 jjjj
+
+SCREEN 24 NO TEST
+SCREEN 25 NO TEST
+SCREEN 26 NO TEST
+SCREEN 27 NO TEST
+SCREEN 28 NO TEST
+SCREEN 29 NO TEST
+SCREEN 30 NO TEST
+SCREEN 31 NO TEST
+SCREEN 32 NO TEST
+SCREEN 33 NO TEST
+SCREEN 34 NO TEST
+
+SCREEN 35 Last reboot
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ResetReason 1 0 5 35 aaaaa
+TaskName 1 1 8 35 bbbbbbbb
+
+SCREEN 36 Info about rebootings
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+UN 1 0 2 36 aa
+WD 5 0 2 36 bb
+DSP 9 0 2 36 cc
+SIM 1 1 2 36 dd
+IDL 5 1 2 36 ee
+STK 9 1 2 36 ff
+
+SCREEN 37 NO TEST
+SCREEN 38 NO TEST
+
+SCREEN 39 Last connection status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CC 7 0 2 39 aa # CC, changed in screen 85
+MM 7 1 2 39 bb # MM, changed in screen 86
+RR 7 2 2 39 cc # RR, changed in screen 86
+
+SCREEN 40 Reset Handover Counters # only for manual reset
+
+SCREEN 41 Info about handover
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+HandOOK 9 0 3 41 aaa
+PrevCh 9 1 3 41 bbb
+HoNotOK 9 2 3 41 ccc
+HoIntra 9 3 3 41 ddd
+
+SCREEN 42 NO TEST
+
+SCREEN 43 T200 counter expired
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+T200MS 9 0 3 43 aaa
+T200BS 9 1 3 43 bbb
+
+SCREEN 44 NO TEST
+SCREEN 45 NO TEST
+SCREEN 46 NO TEST
+SCREEN 47 NO TEST
+SCREEN 48 NO TEST
+SCREEN 49 NO TEST
+SCREEN 50 NO TEST
+SCREEN 51 NO TEST
+SCREEN 52 NO TEST
+SCREEN 53 NO TEST
+
+SCREEN 54 Info about memory block free
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ResF1 1 0 5 54 aa-bb # split these, if you like ...
+ResF2 7 0 5 54 aa-bb
+ResF3 1 1 5 54 aa-bb
+ResF4 7 1 5 54 aa-bb
+ResF5 1 2 5 54 aa-bb
+ResF6 7 2 5 54 aa-bb
+ResF7 1 3 5 54 aa-bb
+ResF8 7 3 5 54 aa-bb
+
+SCREEN 55 NO TEST
+
+SCREEN 56 Block display
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+Ptr 1 0 6 56 aaaaaa
+Cntr 9 0 3 56 bbb
+Task 1 1 8 56 cccccccc
+
+SCREEN 57 Memory status before reset
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+StatusOfStacks1 0 0 12 57 aaaaaaaaaaaa # You really need this ?
+StatusOfStacks2 0 1 12 57 aaaaaaaaaaaa # This is a composite field 1,2,3
+StatusOfStacks3 0 2 2 57 aa # but if you want ...
+BlockSets 0 3 8 57 bbbbbbbb
+
+SCREEN 58 NO TEST
+SCREEN 59 NO TEST
+
+SCREEN 60 Reset counters
+
+SCREEN 61 Counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+NOPSW 8 0 4 61 aaaa H
+SYNCR 8 1 4 61 bbbb H # SYNCR, changed on screen 62
+RESEL 8 2 4 61 cccc H
+
+SCREEN 62 Counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PSW 7 0 4 62 aaaa H
+SYNCRm 7 1 4 62 bbbb H # was SYNCR, conflict in screen 61
+BCCH 7 2 4 62 cccc H
+BCCHE 7 3 4 62 dddd H
+
+SCREEN 63 Call counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CalRel 3 0 2 63 aa
+RelDi 9 0 2 63 bb
+MOCAtmp 2 1 3 63 ccc
+MOOK 8 1 3 63 ddd # MOOK, changed in screen 65
+AllMT 2 2 3 63 eee
+MTOK 8 2 3 63 fff # MTOK, changed in screen 65
+
+SCREEN 64 NO TEST
+SCREEN 65 NO TEST
+SCREEN 66 NO TEST
+SCREEN 67 NO TEST
+SCREEN 68 NO TEST
+SCREEN 69 NO TEST
+
+SCREEN 70 (unknown)
+
+SCREEN 71 NO TEST
+SCREEN 72 NO TEST
+SCREEN 73 NO TEST
+SCREEN 74 NO TEST
+SCREEN 75 NO TEST
+SCREEN 76 NO TEST
+SCREEN 77 NO TEST
+SCREEN 78 NO TEST
+SCREEN 79 NO TEST
+SCREEN 80 NO TEST
+SCREEN 81 NO TEST
+SCREEN 82 NO TEST
+
+SCREEN 83 Show Task Stacks
+
+SCREEN 84 status ... ??
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+IDLE 1 0 4 84 aaaa
+DEV_IO 6 0 4 84 bbbb
+LOCAL 1 1 4 84 cccc
+MDISND 6 1 4 84 dddd
+MDIRCV 1 2 4 84 eeee
+UI 6 2 4 84 ffff
+TONE 1 3 4 84 gggg
+PN 6 3 4 84 hhhh
+
+SCREEN 85 Connection info ??
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+IRDA 1 0 4 85 aaaa
+FBUS 6 0 4 85 bbbb
+AUD 1 1 4 85 cccc
+L1CTRL 6 1 4 85 dddd
+L1MEA 1 2 4 85 eeee
+L1SYSP 6 2 4 85 ffff
+L2 1 3 4 85 gggg
+CCC 6 3 4 85 hhhh # was CC, conflict screen 39
+
+SCREEN 86 Memories status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MMM 1 0 4 86 aaaa # was MM, conflict screen 39
+RRR 6 0 4 86 bbbb # was RR, conflict screen 39
+RM 1 1 4 86 cccc
+SMS 6 1 4 86 dddd
+EM 1 2 4 86 eeee
+SIMUPL 6 2 4 86 ffff
+SIML2 1 3 4 86 gggg
+DDI 6 3 4 86 hhhh
+
+SCREEN 87 OS system stack
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+FIQ 2 0 3 87 aaa
+IRQ 7 0 3 87 bbb
+
+SCREEN 88 Phone Hw/Firmware info 1
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MCUSW 0 0 5 88 aaaaa
+PPM 6 0 6 88 bbbbbb
+MCUDate 6 1 6 88 cccccc
+ChkSum 7 2 4 88 dddd H
+DSPVer 0 3 12 88 eeeeeeeeeeee
+
+SCREEN 89 NO TEST
--- /dev/null
+# GNOKII NETMONITOR PARAMETERS specifications
+# (pretty on screen large at least 112 columns)
+#
+# data in this file are specific to: NOKIA 6150 NSM-1 v4.13
+#
+# format of definition of SCREEN
+# SCREEN=screen-number:optional-description (separator may be also tab, or spaces)
+#
+# SCREEN entry may be duplicated, order is not important, we use "test nr"
+# screen number must be between 1 and 255
+#
+# format of definition of PARAMETERS
+# VAR=X:Y:LEN:NMman:TYPE:DESCRIPTION
+# (separator may be also tab, or spaces)
+# VAR: is name of parameter, it should be as you can see by pressing '*' key
+# on phone, from inside a netmonitor menu.
+# X,Y: are coordinates x & y, start form 0, 0, upper-left corner.
+# LEN: must be specified, and must not be 0.
+# NMman: name as referrred in NetMonitor manuals from Marcin Wiacek,
+# TYPE : optional, default (predefined), is string,
+# else may be D as Decimal or H as Hexadecimal, '-' as predefined.
+# so, no matter what you get from phone, on command line parameters
+# you can specify if uou want Hex or you want Dec.
+# Example is LAC/CID that may be HEX or DEC depending on firmware version.
+# TYPE refer to how data is displayed by phone, not to program output!
+# DESCRIPTION: description of parameters (optional)
+#
+# Either Type and Description are optional, so, for parsing reason
+# if you want specify Description but not Type, you MUST specify '-' as Type
+# no conversions are made in this case.
+#
+# VAR name implies two problems:
+# 1-some parameters can be in more then one screen (example H value)
+# so we had changed some names.
+#
+# 2-some screen report channel parameters, once for every channel
+# (example C2, screen 1, 3, 4, 5)
+# so we had changed some names also here.
+#
+# We check duplicate names, data len, presence of netmon man name, ...
+# Changed names are described near each interested parameters.
+#
+# Here we have adopted some convention, as described in comments, if you don't like it
+# you can change VAR names in this file and use coherents name on command line.
+#
+# Order of parameters definition is relevant only for human readability.
+# We allow max 512 parameters definition and max 255 screens,
+# (defineds in gnokii.h NM_MAX_FIELDS, NM_MAX_SCREENS)
+#
+# ATTENTION: all names are case sensitive! SCREEN def must be uppercase
+# ATTENTION: some firmware versions has some bugs (check screen 34, 38 here)
+# in this file all at right of '#' are comments, even if " # enquoted "
+#
+# Have a lot of fun!
+#
+# Andrea Scopece, a.scopece@tin.it, 22-08-2000
+
+SCREEN 0 Host Date-Time
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DATE 0 0 10 0 - - Host Date # host date
+TIME 0 1 8 0 - - Host Time # host time
+#PDATE 0 0 0 0 - - Phone Date # phone date (NOT IMPLEMENTED)
+#PTIME 0 0 0 0 - - Phone Time # phone time (NOT IMPLEMENTED)
+
+# USERS SHOULD NOT CHANGE SCREEN 0 DEFINITIONS, IT REFERS A HOST PARAMETER, NOT PHONE !!!!
+
+SCREEN 1 Communication with Cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+H 0 0 1 1 a # H, changed in screen 2, 7
+CH 1 0 3 1 bbb - Channel
+RxL 5 0 3 1 ccc - RxLevel(dB)
+TxPwr 9 0 3 1 ddd - TxPower(dBm)
+TS 1 1 1 1 e - Time Slot
+TA 3 1 2 1 ff - Time advance
+RQ 6 1 1 1 g
+RLT 8 1 4 1 mmmm
+C1 1 2 3 1 nnn
+C2 9 2 3 1 ppp
+CHT 4 3 4 1 oooo
+
+
+SCREEN 2 More info about used Cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PM 1 0 2 2 aa
+RAR 4 0 2 2 b
+Ro 6 0 1 2 c
+BC 9 0 3 2 Bdd
+RelR 1 1 2 2 ee
+QLF 6 1 1 2 f
+CRO 1 2 3 2 ggg
+TO 5 2 2 2 hh
+PenT 8 2 3 2 iii
+H2 1 3 3 2 j # was H, conflict screen 1
+MAIO 5 3 2 2 mm
+HSN 8 3 2 2 nn
+
+
+SCREEN 3 Info about current and neighbor cells (1-2)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+SCH 0 0 3 3 aaa # SCH, changed in screen 11, 66
+0C1 3 0 3 3 bbb # was C1, conflict this and other screen
+0rx 6 0 3 3 ccc # was rx, conflict this and other screen
+0C2 9 0 3 3 ddd # was C2, conflict this and other screen
+
+1CH 0 1 3 3 aaa
+1C1 3 1 3 3 bbb # idem as above ...
+1rx 6 1 3 3 ccc # idem as above ...
+1C2 9 1 3 3 ddd # idem as above ...
+
+2CH 0 2 3 3 aaa
+2C1 3 2 3 3 bbb # idem as above ...
+2rx 6 2 3 3 ccc # idem as above ...
+2C2 9 2 3 3 ddd # idem as above ...
+
+1N 4 3 2 3 ef
+2N 7 3 2 3 gh
+
+
+SCREEN 4 Info about neighbor cells (3-4-5)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+3CH 0 0 3 4 aaa
+3C1 3 0 3 4 bbb
+3rx 6 0 3 4 ccc
+3C2 9 0 3 4 ddd
+
+4CH 0 1 3 4 aaa
+4C1 3 1 3 4 bbb
+4rx 6 1 3 4 ccc
+4C2 9 1 3 4 ddd
+
+5CH 0 2 3 4 aaa
+5C1 3 2 3 4 bbb
+5rx 6 2 3 4 ccc
+5C2 9 2 3 4 ddd
+
+3N 2 3 2 4 ef
+4N 5 3 2 4 gh
+5N 8 3 2 4 iJ
+
+
+SCREEN 5 Info about neighbor cells (6-7-8)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+6CH 0 0 3 5 aaa
+6C1 3 0 3 5 bbb
+6rx 6 0 3 5 ccc
+6C2 9 0 3 5 ddd
+
+7CH 0 1 3 5 aaa
+7C1 3 1 3 5 bbb
+7rx 6 1 3 5 ccc
+7C2 9 1 3 5 ddd
+
+8CH 0 2 3 5 aaa
+8C1 3 2 3 5 bbb
+8rx 6 2 3 5 ccc
+8C2 9 2 3 5 ddd
+
+6N 2 3 2 5 ef
+7N 5 3 2 5 gh
+8N 8 3 2 5 iJ
+
+
+SCREEN 6 Preferred and forbidden networks
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+LReg 0 0 5 6 aaabb
+1_Pre 0 1 5 6 aaabb
+2_Pre 0 2 5 6 aaabb
+3_Pre 0 3 5 6 aaabb
+
+1_For 7 0 5 6 aaabb
+2_For 7 1 5 6 aaabb
+3_For 7 2 5 6 aaabb
+4_For 7 3 5 6 aaabb
+
+
+SCREEN 7 Info about last monitored cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+E 0 1 1 7 a
+A 2 1 1 7 b
+Ho 4 1 1 7 c # was H, conflict screen 1, 2
+C 6 1 1 7 d
+I 8 1 1 7 e
+BR 10 1 2 7 fg
+
+ECSC 2 3 1 7 h
+2Ter 7 3 1 7 i
+MB 11 3 1 7 j
+
+SCREEN 8 NO TEST
+SCREEN 9 NO TEST
+SCREEN 9 NO TEST
+
+SCREEN 10 "Network information (last monitored cell)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TMSI 4 0 8 10 aaaaaaaa H
+T3212 5 1 7 10 bbb-ccc
+PaRP 4 2 1 10 d
+DSF 7 2 2 10 ee
+AGC 10 2 2 10 ff
+AFC 1 3 5 10 ggggg
+Ch 9 3 3 10 hhh
+
+SCREEN 11 Cell identification
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MCC 3 0 3 11 xxx
+MNC 9 0 2 11 xxx
+LAC 5 1 5 11 xxx D
+sch 7 2 3 11 xxx # was SCH, conflict in screen 3, 66
+CID 5 3 5 11 xxx D
+
+SCREEN 12 Network parameters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+Cipher 8 0 3 12 aaa
+Hopping 8 1 3 12 bbb
+DTX 8 2 3 12 ccc
+IMSI 8 3 3 12 ddd
+
+SCREEN 13 Info DTX / Network
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DTXMode 0 0 10 13 aaaaaaaaaa
+DTX_Def 9 1 3 13 bbb
+DTX_BS 9 2 3 13 ccc
+
+SCREEN 14 NO TEST
+SCREEN 15 NO TEST
+SCREEN 16 NO TEST
+
+SCREEN 17 BTS channel test
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+BTS 4 2 3 17 aaa
+
+SCREEN 18 Lights status
+LIGHTS 4 2 3 18 aaa
+
+SCREEN 19 Cell selection
+CBARR 2 2 8 19 aaaaaaaa
+
+SCREEN 20 Battery and phone charger mode
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+BatVol 1 0 3 20 aaa
+ChMod 6 0 5 20 bbbbb
+BTemp 2 1 3 20 ccc
+ChTime 8 1 3 20 ddd
+ChrgVol 2 2 3 20 eee
+Pwm 8 2 3 20 fff
+BTyp 1 3 4 20 gggg
+BFDC 7 3 4 20 hhhh
+
+SCREEN 21 Charger parameters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MTDif 1 0 4 21 aaaa
+MPDif 7 0 4 21 bbbb
+BUpV 2 1 3 21 ccc
+BDownV 8 1 3 21 ddd
+AverV 2 2 3 21 eee
+SumMF 8 2 3 21 fff
+
+SCREEN 22 Charger parameters and indicators
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DeriC 1 0 4 22 aaaa
+ChAm 7 0 4 22 bbbb
+Vdif 1 1 4 22 cccc
+VDrop 7 1 4 22 dddd
+VDTi 1 2 4 22 eeee
+AvDif 7 2 4 22 ffff
+Temp 1 3 4 22 gggg
+Volt 7 3 4 22 hhhh
+
+SCREEN 23 Battery full detection
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TxOn 1 0 4 23 aaaa
+TxOff 7 0 4 23 bbbb
+ChCur 1 1 4 23 cccc
+Stdby 7 1 4 23 dddd
+Age 0 2 3 23 eee
+CAP 4 2 3 23 fff
+Curr 8 2 4 23 gggg
+Tmp 0 3 3 23 hhh
+CmAh 4 3 4 23 iiii
+Targ 8 3 4 23 jjjj
+
+SCREEN 24 NO TEST
+SCREEN 25 NO TEST
+SCREEN 26 NO TEST
+SCREEN 27 NO TEST
+SCREEN 28 NO TEST
+SCREEN 29 NO TEST
+
+SCREEN 30 Audio API registers
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+A1Cnf 1 0 4 30 aaaa
+A2Cnf 6 0 4 30 bbbb
+ST 1 1 4 30 cccc
+AU3 6 1 4 30 dddd
+1Tone 1 2 4 30 eeee
+2Tone 6 2 4 30 ffff
+Conf 1 3 4 30 gggg
+HFVol 6 3 4 30 hhhh
+
+
+SCREEN 31 NO TEST
+SCREEN 32 NO TEST
+SCREEN 33 NO TEST
+
+SCREEN 34 Info about connection type
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CM 0 0 2 34 aa
+LD 2 0 2 34 bb
+LM 4 0 2 34 cc
+NM 6 0 2 34 dd
+
+PEC 0 1 2 34 ee # Hmmf, hard to make this screen well defined ...
+FEC 2 1 2 34 ff
+OEC 4 1 2 34 gg
+ACC 6 1 2 34 hh
+RXS 8 1 2 34 iii
+
+inf 10 1 2 34 xxx # NEW PARAM, [P] when active infrared,
+# # else [-]
+ # you can verify it only by phone
+
+TXS 12 1 2 34 jjj # ATT:this seems on line 2 but really
+ # is on x=12, y=1
+
+Mod 0 2 3 34 k-m # ATT:this seems on line 3 but really
+ # is on x=0, y=2
+ # Mod, changed in screen 75
+
+SCREEN 35 Last reboot
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ResetReason 1 0 5 35 aaaaa
+TaskName 1 1 8 35 bbbbbbbb
+
+SCREEN 36 Info about rebootings
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+UN 1 0 2 36 aa
+WD 5 0 2 36 bb
+DSP 9 0 2 36 cc
+SIM 1 1 2 36 dd
+IDL 5 1 2 36 ee
+STK 9 1 2 36 ff
+
+SCREEN 37 NO TEST
+
+SCREEN 38 Memory dump (firmware bug ?)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+LINE1 0 0 53 38 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
+ # may be a bug, it return only line 0, len=53
+ # this exceed --netmonitor Screen[50], so crash!
+
+SCREEN 39 Last connection status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CC 7 0 2 39 aa # CC, changed in screen 85
+MM 7 1 2 39 bb # MM, changed in screen 86
+RR 7 2 2 39 cc # RR, changed in screen 86
+
+SCREEN 40 Reset Handover Counters # only for manual reset
+
+SCREEN 41 Info about handover
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+GGok 1 0 4 41 aaaa
+DDok 7 0 4 41 bbbb
+GDok 1 1 4 41 cccc
+DGok 7 1 4 41 dddd
+
+GGf 0 2 3 41 aaa
+DDf 3 2 3 41 bbb
+GDf 6 2 3 41 ccc
+DGf 9 2 3 41 ddd
+
+GGb 0 3 3 41 aaa
+DDb 3 3 3 41 bbb
+GDb 6 3 3 41 ccc
+DGb 9 3 3 41 ddd
+
+
+SCREEN 42 Info about intracell handover (broken ? all zeroes)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+
+IGGok 1 0 4 42 aaaa
+IDDok 7 0 4 42 bbbb
+IGDok 1 1 4 42 cccc
+IDGok 7 1 4 42 dddd
+
+IGGf 0 2 3 42 aaa
+IDDf 3 2 3 42 bbb
+IGDf 6 2 3 42 ccc
+IDGf 9 2 3 42 ddd
+
+IGGb 0 3 3 42 aaa
+IDDb 3 3 3 42 bbb
+IGDb 6 3 3 42 ccc
+IDGb 9 3 3 42 ddd
+
+
+SCREEN 43 T200 counter expired
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+T200MS 8 0 4 43 aaaa
+T200BS 8 1 4 43 bbbb
+
+SCREEN 44 NO TEST
+
+SCREEN 45 Trasmitter status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TRASM 2 2 8 45 aaaaaaaa
+
+SCREEN 46 NO TEST
+SCREEN 47 NO TEST
+SCREEN 48 NO TEST
+SCREEN 49 NO TEST
+SCREEN 50 NO TEST
+
+SCREEN 51 Info about SIM card
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+VSel 0 0 3 51 aaa
+Bau 4 0 3 51 bbb
+SAl 8 0 3 51 ccc
+
+SCond 1 1 8 51 dddddddd
+# CStop 1 0 0 51 # firmware bug ?
+
+PIN1 1 2 1 51 e
+PIN2 3 2 1 51 f
+PUK1 6 2 2 51 gg
+PUK2 9 2 2 51 hh
+
+ATR 2 3 1 51 i
+FE_PE 6 3 4 51 jjjj
+
+SCREEN 52 NO TEST
+SCREEN 53 NO TEST
+
+SCREEN 54 Info about memory block free
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ResF1 1 0 5 54 aa-bb # split these, if you like ...
+ResF2 7 0 5 54 aa-bb
+ResF3 1 1 5 54 aa-bb
+ResF4 7 1 5 54 aa-bb
+ResF5 1 2 5 54 aa-bb
+ResF6 7 2 5 54 aa-bb
+ResF7 1 3 5 54 aa-bb
+ResF8 7 3 5 54 aa-bb
+
+SCREEN 55 NO TEST
+
+SCREEN 56 Block display
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+Ptr 1 0 6 56 aaaaaa
+Cntr 9 0 3 56 bbb
+Task 1 1 8 56 cccccccc
+
+SCREEN 57 Memory status before reset
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+StatusOfStacks1 0 0 12 57 aaaaaaaaaaaa # You really need this ?
+StatusOfStacks2 0 1 12 57 aaaaaaaaaaaa # This is a composite field 1,2,3
+StatusOfStacks3 0 2 2 57 aa # but if you want ...
+BlockSets 0 3 8 57 bbbbbbbb
+
+SCREEN 58 NO TEST
+SCREEN 59 NO TEST
+
+SCREEN 60 Reset counters
+
+SCREEN 61 Counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+NOPSW 8 0 4 61 aaaa H
+SYNCR 8 1 4 61 bbbb H # SYNCR, changed on screen 62
+RESEL 8 2 4 61 cccc H
+
+SCREEN 62 Counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PSW 7 0 4 62 aaaa H
+SYNCRm 7 1 4 62 bbbb H # was SYNCR, conflict in screen 61
+BCCH 7 2 4 62 cccc H
+BCCHE 7 3 4 62 dddd H
+
+SCREEN 63 Call counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CalRel 3 0 2 63 aa
+RelDi 9 0 2 63 bb
+MOCAtmp 2 1 3 63 ccc
+MOOK 8 1 3 63 ddd # MOOK, changed in screen 65
+AllMT 2 2 3 63 eee
+MTOK 8 2 3 63 fff # MTOK, changed in screen 65
+
+SCREEN 64 Location update counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+NFai 2 0 2 64 aa
+NL 5 0 3 64 bbb
+NLOK 9 0 3 64 ccc
+Pfai 2 1 2 64 dd
+PL 5 1 3 64 eee
+PLOK 9 1 3 64 fff
+
+SCREEN 65 SMS counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+SFai 2 0 2 65 aa
+MO 5 0 3 65 bbb
+MOOKs 9 0 3 65 ccc # was MOOK conflict screen 63
+RFai 2 1 2 65 dd
+MT 5 1 3 65 eee
+MTOKs 9 1 3 65 fff # was MTOK, conflict screen 63
+Sched 0 2 4 65 gggg
+
+SCREEN 66 SMS timeout counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TR1 0 0 3 66 aaa
+TR2 0 0 3 66 bbb
+TRA 0 0 2 66 cc
+TC1 0 0 3 66 ddd
+TC2 0 0 3 66 eee
+SCHED 0 0 2 66 ff # was SCH, conflict screen 3, 11
+
+SCREEN 67 NO TEST
+SCREEN 68 NO TEST
+SCREEN 69 NO TEST
+SCREEN 70 NO TEST
+SCREEN 71 NO TEST
+SCREEN 72 NO TEST
+SCREEN 73 NO TEST
+SCREEN 74 NO TEST
+
+SCREEN 75 Audio option status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ExAuSt 4 0 8 75 aaaaaaaa # was mod, conflict screen 34
+AudReq 8 1 4 75 bbbb H
+AccMod 8 2 2 75 cc H # len diff from netmon manuals
+H2Path 8 3 2 75 dd H
+
+SCREEN 76 NO TEST
+SCREEN 77 NO TEST
+SCREEN 78 NO TEST
+SCREEN 79 NO TEST
+
+SCREEN 80 Reset Timers
+
+SCREEN 81 Timers status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TIMSTS 2 2 8 81 aaaaaaaa
+
+SCREEN 82 Timers values
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PwrOn 0 0 5 82 aaaaa
+InServ 6 0 5 82 bbbbb
+NSPS 0 1 5 82 ccccc
+TxON 6 1 5 82 ddddd
+TSt 8 2 3 82 eee
+
+SCREEN 83 Show Task Stacks
+
+SCREEN 84 status ... ??
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+IDLE 1 0 4 84 aaaa
+DEV_IO 6 0 4 84 bbbb
+LOCAL 1 1 4 84 cccc
+MDISND 6 1 4 84 dddd
+MDIRCV 1 2 4 84 eeee
+UI 6 2 4 84 ffff
+TONE 1 3 4 84 gggg
+PN 6 3 4 84 hhhh
+
+SCREEN 85 Connection info ??
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+IRDA 1 0 4 85 aaaa
+FBUS 6 0 4 85 bbbb
+AUD 1 1 4 85 cccc
+L1CTRL 6 1 4 85 dddd
+L1MEA 1 2 4 85 eeee
+L1SYSP 6 2 4 85 ffff
+L2 1 3 4 85 gggg
+CCC 6 3 4 85 hhhh # was CC, conflict screen 39
+
+SCREEN 86 Memories status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MMM 1 0 4 86 aaaa # was MM, conflict screen 39
+RRR 6 0 4 86 bbbb # was RR, conflict screen 39
+RM 1 1 4 86 cccc
+SMS 6 1 4 86 dddd
+EM 1 2 4 86 eeee
+SIMUPL 6 2 4 86 ffff
+SIML2 1 3 4 86 gggg
+DDI 6 3 4 86 hhhh
+
+SCREEN 87 OS system stack
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+FIQ 2 0 3 87 aaa
+IRQ 7 0 3 87 bbb
+
+SCREEN 88 Phone Hw/Firmware info 1
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MCUSW 0 0 5 88 aaaaa
+PPM 6 0 6 88 bbbbbb
+MCUDate 6 1 6 88 cccccc
+ChkSum 7 2 4 88 dddd H
+DSPVer 0 3 12 88 eeeeeeeeeeee
+
+SCREEN 89 Phone Hw/Firmware info 2A
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+HW 4 0 4 89 aaaa
+TXT 4 1 7 89 Ubbbbbb
--- /dev/null
+# GNOKII NETMONITOR PARAMETERS specifications
+# (pretty on screen large at least 112 columns)
+#
+# data in this file are specific to: NOKIA 6150 NSM-1 v5.22
+#
+# format of definition of SCREEN
+# SCREEN=screen-number:optional-description (separator may be also tab, or spaces)
+#
+# SCREEN entry may be duplicated, order is not important, we use "test nr"
+# screen number must be between 1 and 255
+#
+# format of definition of PARAMETERS
+# VAR=X:Y:LEN:NMman:TYPE:DESCRIPTION
+# (separator may be also tab, or spaces)
+# VAR: is name of parameter, it should be as you can see by pressing '*' key
+# on phone, from inside a netmonitor menu.
+# X,Y: are coordinates x & y, start form 0, 0, upper-left corner.
+# LEN: must be specified, and must not be 0.
+# NMman: name as referrred in NetMonitor manuals from Marcin Wiacek,
+# TYPE : optional, default (predefined), is string,
+# else may be D as Decimal or H as Hexadecimal, '-' as predefined.
+# so, no matter what you get from phone, on command line parameters
+# you can specify if uou want Hex or you want Dec.
+# Example is LAC/CID that may be HEX or DEC depending on firmware version.
+# TYPE refer to how data is displayed by phone, not to program output!
+# DESCRIPTION: description of parameters (optional)
+#
+# Either Type and Description are optional, so, for parsing reason
+# if you want specify Description but not Type, you MUST specify '-' as Type
+# no conversions are made in this case.
+#
+# VAR name implies two problems:
+# 1-some parameters can be in more then one screen (example H value)
+# so we had changed some names.
+#
+# 2-some screen report channel parameters, once for every channel
+# (example C2, screen 1, 3, 4, 5)
+# so we had changed some names also here.
+#
+# We check duplicate names, data len, presence of netmon man name, ...
+# Changed names are described near each interested parameters.
+#
+# Here we have adopted some convention, as described in comments, if you don't like it
+# you can change VAR names in this file and use coherents name on command line.
+#
+# Order of parameters definition is relevant only for human readability.
+# We allow max 512 parameters definition and max 255 screens,
+# (defineds in gnokii.h NM_MAX_FIELDS, NM_MAX_SCREENS)
+#
+# ATTENTION: all names are case sensitive! SCREEN def must be uppercase
+# ATTENTION: some firmware versions has some bugs (check screen 34 here)
+# in this file all at right of '#' are comments, even if " # enquoted "
+#
+# Have a lot of fun!
+#
+# Andrea Scopece, a.scopece@tin.it, 22-08-2000
+
+SCREEN 0 Host Date-Time
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DATE 0 0 10 0 - - Host Date # host date
+TIME 0 1 8 0 - - Host Time # host time
+#PDATE 0 0 0 0 - - Phone Date # phone date (NOT IMPLEMENTED)
+#PTIME 0 0 0 0 - - Phone Time # phone time (NOT IMPLEMENTED)
+
+# USERS SHOULD NOT CHANGE SCREEN 0 DEFINITIONS, IT REFERS A HOST PARAMETER, NOT PHONE !!!!
+
+SCREEN 1 Communication with Cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+H 0 0 1 1 a # H, changed in screen 2, 7
+CH 1 0 3 1 bbb - Channel
+RxL 5 0 3 1 ccc - RxLevel(dB)
+TxPwr 9 0 3 1 ddd - TxPower(dBm)
+TS 1 1 1 1 e - Time Slot
+TA 3 1 2 1 ff - Time advance
+RQ 6 1 1 1 g
+RLT 8 1 4 1 mmmm
+C1 1 2 3 1 nnn
+C2 9 2 3 1 ppp
+CHT 4 3 4 1 oooo
+
+
+SCREEN 2 More info about used Cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PM 1 0 2 2 aa
+RAR 4 0 2 2 b
+Ro 6 0 1 2 c
+BC 9 0 3 2 Bdd
+RelR 1 1 2 2 ee
+QLF 6 1 1 2 f
+CRO 1 2 3 2 ggg
+TO 5 2 2 2 hh
+PenT 8 2 3 2 iii
+H2 1 3 3 2 j # was H, conflict screen 1
+MAIO 5 3 2 2 mm
+HSN 8 3 2 2 nn
+
+
+SCREEN 3 Info about current and neighbor cells (1-2)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+SCH 0 0 3 3 aaa # SCH, changed in screen 11, 66
+0C1 3 0 3 3 bbb # was C1, conflict this and other screen
+0rx 6 0 3 3 ccc # was rx, conflict this and other screen
+0C2 9 0 3 3 ddd # was C2, conflict this and other screen
+
+1CH 0 1 3 3 aaa
+1C1 3 1 3 3 bbb # idem as above ...
+1rx 6 1 3 3 ccc # idem as above ...
+1C2 9 1 3 3 ddd # idem as above ...
+
+2CH 0 2 3 3 aaa
+2C1 3 2 3 3 bbb # idem as above ...
+2rx 6 2 3 3 ccc # idem as above ...
+2C2 9 2 3 3 ddd # idem as above ...
+
+1N 4 3 2 3 ef
+2N 7 3 2 3 gh
+
+
+SCREEN 4 Info about neighbor cells (3-4-5)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+3CH 0 0 3 4 aaa
+3C1 3 0 3 4 bbb
+3rx 6 0 3 4 ccc
+3C2 9 0 3 4 ddd
+
+4CH 0 1 3 4 aaa
+4C1 3 1 3 4 bbb
+4rx 6 1 3 4 ccc
+4C2 9 1 3 4 ddd
+
+5CH 0 2 3 4 aaa
+5C1 3 2 3 4 bbb
+5rx 6 2 3 4 ccc
+5C2 9 2 3 4 ddd
+
+3N 2 3 2 4 ef
+4N 5 3 2 4 gh
+5N 8 3 2 4 iJ
+
+
+SCREEN 5 Info about neighbor cells (6-7-8)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+6CH 0 0 3 5 aaa
+6C1 3 0 3 5 bbb
+6rx 6 0 3 5 ccc
+6C2 9 0 3 5 ddd
+
+7CH 0 1 3 5 aaa
+7C1 3 1 3 5 bbb
+7rx 6 1 3 5 ccc
+7C2 9 1 3 5 ddd
+
+8CH 0 2 3 5 aaa
+8C1 3 2 3 5 bbb
+8rx 6 2 3 5 ccc
+8C2 9 2 3 5 ddd
+
+6N 2 3 2 5 ef
+7N 5 3 2 5 gh
+8N 8 3 2 5 iJ
+
+
+SCREEN 6 Preferred and forbidden networks
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+LReg 0 0 5 6 aaabb
+1_Pre 0 1 5 6 aaabb
+2_Pre 0 2 5 6 aaabb
+3_Pre 0 3 5 6 aaabb
+
+1_For 7 0 5 6 aaabb
+2_For 7 1 5 6 aaabb
+3_For 7 2 5 6 aaabb
+4_For 7 3 5 6 aaabb
+
+
+SCREEN 7 Info about last monitored cell
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+E 0 1 1 7 a
+A 2 1 1 7 b
+Ho 4 1 1 7 c # was H, conflict screen 1, 2
+C 6 1 1 7 d
+I 8 1 1 7 e
+BR 10 1 2 7 fg
+
+ECSC 2 3 1 7 h
+2Ter 7 3 1 7 i
+MB 11 3 1 7 j
+
+SCREEN 8 NO TEST
+SCREEN 9 NO TEST
+SCREEN 9 NO TEST
+
+SCREEN 10 "Network information (last monitored cell)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TMSI 4 0 8 10 aaaaaaaa H
+T3212 5 1 7 10 bbb-ccc
+PaRP 4 2 1 10 d
+DSF 7 2 2 10 ee
+AGC 10 2 2 10 ff
+AFC 1 3 5 10 ggggg
+Ch 9 3 3 10 hhh
+
+SCREEN 11 Cell identification
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MCC 3 0 3 11 xxx
+MNC 9 0 2 11 xxx
+LAC 5 1 5 11 xxx D
+sch 7 2 3 11 xxx # was SCH, conflict in screen 3, 66
+CID 5 3 5 11 xxx D
+
+SCREEN 12 Network parameters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+Cipher 8 0 3 12 aaa
+Hopping 8 1 3 12 bbb
+DTX 8 2 3 12 ccc
+IMSI 8 3 3 12 ddd
+
+SCREEN 13 Info DTX / Network
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DTXMode 0 0 10 13 aaaaaaaaaa
+DTX_Def 9 1 3 13 bbb
+DTX_BS 9 2 3 13 ccc
+
+SCREEN 14 NO TEST
+SCREEN 15 NO TEST
+SCREEN 16 NO TEST
+
+SCREEN 17 BTS channel test
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+BTS 4 2 3 17 aaa
+
+SCREEN 18 Lights status
+LIGHTS 4 2 3 18 aaa
+
+SCREEN 19 Cell selection
+CBARR 2 2 8 19 aaaaaaaa
+
+SCREEN 20 Battery and phone charger mode
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+BatVol 1 0 3 20 aaa
+ChMod 6 0 5 20 bbbbb
+BTemp 2 1 3 20 ccc
+ChTime 8 1 3 20 ddd
+ChrgVol 2 2 3 20 eee
+Pwm 8 2 3 20 fff
+BTyp 1 3 4 20 gggg
+BFDC 7 3 4 20 hhhh
+
+SCREEN 21 Charger parameters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MTDif 1 0 4 21 aaaa
+MPDif 7 0 4 21 bbbb
+BUpV 2 1 3 21 ccc
+BDownV 8 1 3 21 ddd
+AverV 2 2 3 21 eee
+SumMF 8 2 3 21 fff
+
+SCREEN 22 Charger parameters and indicators
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+DeriC 1 0 4 22 aaaa
+ChAm 7 0 4 22 bbbb
+Vdif 1 1 4 22 cccc
+VDrop 7 1 4 22 dddd
+VDTi 1 2 4 22 eeee
+AvDif 7 2 4 22 ffff
+Temp 1 3 4 22 gggg
+Volt 7 3 4 22 hhhh
+
+SCREEN 23 Battery full detection
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TxOn 1 0 4 23 aaaa
+TxOff 7 0 4 23 bbbb
+ChCur 1 1 4 23 cccc
+Stdby 7 1 4 23 dddd
+Age 0 2 3 23 eee
+CAP 4 2 3 23 fff
+Curr 8 2 4 23 gggg
+Tmp 0 3 3 23 hhh
+CmAh 4 3 4 23 iiii
+Targ 8 3 4 23 jjjj
+
+SCREEN 24 NO TEST
+SCREEN 25 NO TEST
+SCREEN 26 NO TEST
+SCREEN 27 NO TEST
+SCREEN 28 NO TEST
+SCREEN 29 NO TEST
+
+SCREEN 30 Audio API registers
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+A1Cnf 1 0 4 30 aaaa
+A2Cnf 6 0 4 30 bbbb
+ST 1 1 4 30 cccc
+AU3 6 1 4 30 dddd
+1Tone 1 2 4 30 eeee
+2Tone 6 2 4 30 ffff
+Conf 1 3 4 30 gggg
+HFVol 6 3 4 30 hhhh
+
+
+SCREEN 31 NO TEST
+SCREEN 32 NO TEST
+SCREEN 33 NO TEST
+
+SCREEN 34 Info about connection type
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CM 0 0 2 34 aa
+LD 2 0 2 34 bb
+LM 4 0 2 34 cc
+NM 6 0 2 34 dd
+
+PEC 0 1 2 34 ee # Hmmf, hard to make this screen well defined ...
+FEC 2 1 2 34 ff
+OEC 4 1 2 34 gg
+ACC 6 1 2 34 hh
+RXS 8 1 2 34 iii
+
+inf 10 1 2 34 xxx # NEW PARAM, [P] when active infrared,
+# # else [-]
+ # you can verify it only by phone
+
+TXS 12 1 2 34 jjj # ATT:this seems on line 2 but really
+ # is on x=12, y=1
+
+Mod 0 2 3 34 k-m # ATT:this seems on line 3 but really
+ # is on x=0, y=2
+ # Mod, changed in screen 75
+
+SCREEN 35 Last reboot
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ResetReason 1 0 5 35 aaaaa
+TaskName 1 1 8 35 bbbbbbbb
+
+SCREEN 36 Info about rebootings
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+UN 1 0 2 36 aa
+WD 5 0 2 36 bb
+DSP 9 0 2 36 cc
+SIM 1 1 2 36 dd
+IDL 5 1 2 36 ee
+STK 9 1 2 36 ff
+
+SCREEN 37 NO TEST
+
+SCREEN 38 NO TEST
+
+SCREEN 39 Last connection status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CC 7 0 2 39 aa # CC, changed in screen 85
+MM 7 1 2 39 bb # MM, changed in screen 86
+RR 7 2 2 39 cc # RR, changed in screen 86
+
+SCREEN 40 Reset Handover Counters # only for manual reset
+
+SCREEN 41 Info about handover
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+GGok 1 0 4 41 aaaa
+DDok 7 0 4 41 bbbb
+GDok 1 1 4 41 cccc
+DGok 7 1 4 41 dddd
+
+GGf 0 2 3 41 aaa
+DDf 3 2 3 41 bbb
+GDf 6 2 3 41 ccc
+DGf 9 2 3 41 ddd
+
+GGb 0 3 3 41 aaa
+DDb 3 3 3 41 bbb
+GDb 6 3 3 41 ccc
+DGb 9 3 3 41 ddd
+
+
+SCREEN 42 Info about intracell handover (broken ? all zeroes)
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+
+IGGok 1 0 4 42 aaaa
+IDDok 7 0 4 42 bbbb
+IGDok 1 1 4 42 cccc
+IDGok 7 1 4 42 dddd
+
+IGGf 0 2 3 42 aaa
+IDDf 3 2 3 42 bbb
+IGDf 6 2 3 42 ccc
+IDGf 9 2 3 42 ddd
+
+IGGb 0 3 3 42 aaa
+IDDb 3 3 3 42 bbb
+IGDb 6 3 3 42 ccc
+IDGb 9 3 3 42 ddd
+
+
+SCREEN 43 T200 counter expired
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+T200MS 8 0 4 43 aaaa
+T200BS 8 1 4 43 bbbb
+
+SCREEN 44 NO TEST
+
+SCREEN 45 Trasmitter status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TRASM 2 2 8 45 aaaaaaaa
+
+SCREEN 46 NO TEST
+SCREEN 47 NO TEST
+SCREEN 48 NO TEST
+SCREEN 49 NO TEST
+SCREEN 50 NO TEST
+
+SCREEN 51 Info about SIM card
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+VSel 0 0 3 51 aaa
+Bau 4 0 3 51 bbb
+SAl 8 0 3 51 ccc
+
+SCond 1 1 8 51 dddddddd
+# CStop 1 0 0 51 # firmware bug ?
+
+PIN1 1 2 1 51 e
+PIN2 3 2 1 51 f
+PUK1 6 2 2 51 gg
+PUK2 9 2 2 51 hh
+
+ATR 2 3 1 51 i
+FE_PE 6 3 4 51 jjjj
+
+SCREEN 52 NO TEST
+SCREEN 53 NO TEST
+
+SCREEN 54 Info about memory block free
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ResF1 1 0 5 54 aa-bb # split these, if you like ...
+ResF2 7 0 5 54 aa-bb
+ResF3 1 1 5 54 aa-bb
+ResF4 7 1 5 54 aa-bb
+ResF5 1 2 5 54 aa-bb
+ResF6 7 2 5 54 aa-bb
+ResF7 1 3 5 54 aa-bb
+ResF8 7 3 5 54 aa-bb
+
+SCREEN 55 NO TEST
+
+SCREEN 56 Block display
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+Ptr 1 0 6 56 aaaaaa
+Cntr 9 0 3 56 bbb
+Task 1 1 8 56 cccccccc
+
+SCREEN 57 Memory status before reset
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+StatusOfStacks1 0 0 12 57 aaaaaaaaaaaa # You really need this ?
+StatusOfStacks2 0 1 12 57 aaaaaaaaaaaa # This is a composite field 1,2,3
+StatusOfStacks3 0 2 2 57 aa # but if you want ...
+BlockSets 0 3 8 57 bbbbbbbb
+
+SCREEN 58 NO TEST
+SCREEN 59 NO TEST
+
+SCREEN 60 Reset counters
+
+SCREEN 61 Counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+NOPSW 8 0 4 61 aaaa H
+SYNCR 8 1 4 61 bbbb H # SYNCR, changed on screen 62
+RESEL 8 2 4 61 cccc H
+
+SCREEN 62 Counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PSW 7 0 4 62 aaaa H
+SYNCRm 7 1 4 62 bbbb H # was SYNCR, conflict in screen 61
+BCCH 7 2 4 62 cccc H
+BCCHE 7 3 4 62 dddd H
+
+SCREEN 63 Call counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+CalRel 3 0 2 63 aa
+RelDi 9 0 2 63 bb
+MOCAtmp 2 1 3 63 ccc
+MOOK 8 1 3 63 ddd # MOOK, changed in screen 65
+AllMT 2 2 3 63 eee
+MTOK 8 2 3 63 fff # MTOK, changed in screen 65
+
+SCREEN 64 Location update counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+NFai 2 0 2 64 aa
+NL 5 0 3 64 bbb
+NLOK 9 0 3 64 ccc
+Pfai 2 1 2 64 dd
+PL 5 1 3 64 eee
+PLOK 9 1 3 64 fff
+
+SCREEN 65 SMS counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+SFai 2 0 2 65 aa
+MO 5 0 3 65 bbb
+MOOKs 9 0 3 65 ccc # was MOOK conflict screen 63
+RFai 2 1 2 65 dd
+MT 5 1 3 65 eee
+MTOKs 9 1 3 65 fff # was MTOK, conflict screen 63
+Sched 0 2 4 65 gggg
+
+SCREEN 66 SMS timeout counters
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TR1 0 0 3 66 aaa
+TR2 0 0 3 66 bbb
+TRA 0 0 2 66 cc
+TC1 0 0 3 66 ddd
+TC2 0 0 3 66 eee
+SCHED 0 0 2 66 ff # was SCH, conflict screen 3, 11
+
+SCREEN 67 NO TEST
+SCREEN 68 NO TEST
+SCREEN 69 NO TEST
+SCREEN 70 NO TEST
+SCREEN 71 NO TEST
+SCREEN 72 NO TEST
+SCREEN 73 NO TEST
+SCREEN 74 NO TEST
+
+SCREEN 75 Audio option status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+ExAuSt 4 0 8 75 aaaaaaaa # was mod, conflict screen 34
+AudReq 8 1 4 75 bbbb H
+AccMod 8 2 2 75 cc H # len diff from netmon manuals
+H2Path 8 3 2 75 dd H
+
+SCREEN 76 NO TEST
+SCREEN 77 NO TEST
+SCREEN 78 NO TEST
+SCREEN 79 NO TEST
+
+SCREEN 80 Reset Timers
+
+SCREEN 81 Timers status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+TIMSTS 2 2 8 81 aaaaaaaa
+
+SCREEN 82 Timers values
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+PwrOn 0 0 5 82 aaaaa
+InServ 6 0 5 82 bbbbb
+NSPS 0 1 5 82 ccccc
+TxON 6 1 5 82 ddddd
+TSt 8 2 3 82 eee
+
+SCREEN 83 Show Task Stacks
+
+SCREEN 84 status ... ??
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+IDLE 1 0 4 84 aaaa
+DEV_IO 6 0 4 84 bbbb
+LOCAL 1 1 4 84 cccc
+MDISND 6 1 4 84 dddd
+MDIRCV 1 2 4 84 eeee
+UI 6 2 4 84 ffff
+TONE 1 3 4 84 gggg
+PN 6 3 4 84 hhhh
+
+SCREEN 85 Connection info ??
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+IRDA 1 0 4 85 aaaa
+FBUS 6 0 4 85 bbbb
+AUD 1 1 4 85 cccc
+L1CTRL 6 1 4 85 dddd
+L1MEA 1 2 4 85 eeee
+L1SYSP 6 2 4 85 ffff
+L2 1 3 4 85 gggg
+CCC 6 3 4 85 hhhh # was CC, conflict screen 39
+
+SCREEN 86 Memories status
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MMM 1 0 4 86 aaaa # was MM, conflict screen 39
+RRR 6 0 4 86 bbbb # was RR, conflict screen 39
+RM 1 1 4 86 cccc
+SMS 6 1 4 86 dddd
+EM 1 2 4 86 eeee
+SIMUPL 6 2 4 86 ffff
+SIML2 1 3 4 86 gggg
+DDI 6 3 4 86 hhhh
+
+SCREEN 87 OS system stack
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+FIQ 2 0 3 87 aaa
+IRQ 7 0 3 87 bbb
+
+SCREEN 88 Phone Hw/Firmware info 1
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+MCUSW 0 0 5 88 aaaaa
+PPM 6 0 6 88 bbbbbb
+MCUDate 6 1 6 88 cccccc
+ChkSum 7 2 4 88 dddd H
+DSPVer 0 3 12 88 eeeeeeeeeeee
+
+SCREEN 89 Phone Hw/Firmware info 2A
+#-Name--X-------Y-------LEN-----Screen--NMman---Type----Descr.----------#Comment
+HW 4 0 4 89 aaaa
+TXT 4 1 7 89 Ubbbbbb
--- /dev/null
+-n 4 DATE TIME H CH Ch SCH AGC AFC RxL TxPwr TS TA RQ RLT C1 C2 CHT
+ -n 4 DATE TIME SCH 0rx 1CH 1rx 2CH 2rx 3CH 3rx 4CH 4rx 5CH 5rx 6CH 6rx 7CH 7rx 8CH 8rx
+ -n 4 TIME LINE1
+ -n 4 DATE CM LD LM NM PEC FEC OEC ACC RXS inf TXS Mod
+ -n 4 LINE1 DATE TIME
--- /dev/null
+modem
+crtscts
+defaultroute
+asyncmap 0
+mtu 1500
+mru 1500
+user ppp
--- /dev/null
+#!/bin/sh
+/usr/sbin/chat -v \
+ TIMEOUT 30 \
+ ABORT '\nBUSY\r' \
+ ABORT '\nNO ANSWER\r' \
+ ABORT '\nRINGING\r\n\r\nRINGING\r' \
+ ABORT '\nNO CARRIER\r' \
+ '' '\r\dATZ' \
+ TIMEOUT 60 \
+ OK ATDT$TELEPHONE \
+ CONNECT ''
--- /dev/null
+ppp-6210-modem Basic chat script to use with AT modem (eg. Nokia 6210)
+ppp-gnokii Basic chat script to make a connection with gnokiid and at-emulator (eg. Nokia 6110)
+ppp-hscsd Sample chat script to make a hscsd connection
+ppp-on Sample ppp script to estabilish a dialup connection
+options Sample ppp options file
+pap-secrets Sample pap-secrets file
--- /dev/null
+#!/bin/sh
+/usr/sbin/chat -v \
+ TIMEOUT 30 \
+ ABORT '\nBUSY\r' \
+ ABORT '\nNO ANSWER\r' \
+ ABORT '\nRINGING\r\n\r\nRINGING\r' \
+ ABORT '\nNO CARRIER\r' \
+ '' ATDT$TELEPHONE \
+ CONNECT ''
--- /dev/null
+#!/bin/sh
+chat -v \
+ TIMEOUT 60 \
+ ABORT '\nBUSY\r' \
+ ABORT '\nNO ANSWER\r' \
+ ABORT '\nRINGING\r\n\r\nRINGING\r' \
+ ABORT '\nNO CARRIER\r' \
+ '' "\r\dATZ" \
+ OK "AT+CBST=51,0,1" \
+ OK "AT+CHSN=6,0,0,0" \
+ TIMEOUT 60 \
+ OK ATD$TELEPHONE \
+ CONNECT ''
--- /dev/null
+#!/bin/sh
+TELEPHONE=501808080
+LOCAL_IP=0.0.0.0
+REMOTE_IP=0.0.0.0
+NETMASK=255.255.255.0
+DIALER_SCRIPT=/etc/ppp/ppp-gnokii
+export $TELEPHONE
+exec /usr/sbin/pppd debug /dev/gnokii 115200 $LOCAL_IP:$REMOTE_IP connect $DIALER_SCRIPT
+
--- /dev/null
+BEGIN:VCALENDAR
+VERSION:1.0
+
+BEGIN:VEVENT
+CATEGORIES:PHONE CALL
+SUMMARY:0123456789
+DESCRIPTION:Call to John
+DTSTART:20000623T194400
+DALARM:20000623T194300
+END:VEVENT
+
+BEGIN:VEVENT
+CATEGORIES:MISCELLANEOUS
+SUMMARY:Gnokii Reminder
+DTSTART:20000623T204400
+DALARM:20000623T204300
+END:VEVENT
+
+BEGIN:VEVENT
+CATEGORIES:MEETING
+SUMMARY:Gnokii Meeting
+DTSTART:20000623T204400
+DALARM:20000623T204300
+END:VEVENT
+
+BEGIN:VEVENT
+CATEGORIES:SPECIAL OCCASION
+SUMMARY:Marcels Birthday
+DTSTART:19790806T031000
+DALARM:20000806T100000
+END:VEVENT
+
+BEGIN:VEVENT
+CATEGORIES:MISCELLANEOUS
+SUMMARY;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:Wi=C4=85cek Marcin
+DTSTART:19991111T235959
+DALARM:20010510T222200
+END:VEVENT
+
+END:VCALENDAR
--- /dev/null
+GNOKII Hackers Guide
+--------------------
+
+
+Purpose
+-------
+
+Now that we know in some detail the workings of the protocols it makes
+sense to organise the gnokii code to fit them better. This should mean
+that when new models come out, it is easier to get the code in place to
+support them. It is hoped that the new structure will also work for other
+makes of phone.
+
+
+Overview:
+
+Application (gnokii/xgnoki)
+ | DoSomething()
+(Middle-layer)
+ | GSM->Function()
+Gsm-api
+ | P*_Functions()
+Phone specific code (eg nk7110.c)
+ | SM_SendMessage(), SM_Wait(), SM_Loop()
+StateMachine
+ | SendMessage(), Loop()
+Link specific code (eg fbus.c)
+ |
+Hardware code
+
+
+
+Detailed operation
+------------------
+
+
+Initialisation:
+
+The gnokii application (eg gnokii, xgnokii) decides on the phone type and
+required connection method from the config file. It then calls the
+gsm-api init code which in turn calls the init code for the correct phone.
+This code is located in a series of files phone/*.c. This code creates a
+GSM_State structure (which contains a GSM_Link structure) and passes this
+to the common code for the specific link (eg FBUS_Initialise, contained in
+fbus.c). The link code fills in the GSM_Link part of state (and
+also stores state to use later). The phone code chooses the appropriate
+link and is free to perform any phone specific init. It then initialises
+the StateMachine by passing it the state struct and a GSM_Phone struct.
+
+
+The Link:
+
+The link serves to deal with bits of the phone protocol which are common to
+every exchange for that particular phone.
+
+The GSM_Link structure is used to contain any information about the link
+which is required by the StateMachine. Two vital functions in the link
+are SendMessage and Loop:
+
+SendMessage(u16 messagesize, u8 messagetype, void *message)
+ is the function called by the statemachine code to send a message 'down
+ the pipe'. The parameters are intended to be generic (though with
+ obvious origins :-) For example 'at' commands could be enumerated and
+ passed as messagetype.
+
+Loop(struct timeval *timeout)
+ is a function which must be called regularly by the statemachine code
+ to enable to link code to process date from the phone. This is due to
+ the code now being single threaded and using select/poll. The timeout
+ passed can therefore be used to make this function block for a while
+ (or not).
+
+In the loop function, the link code checks for any incoming messages from
+the phone. Any received correctly are passed up to the statemachine code.
+
+
+The Middle Layer
+
+All common/*.c files contain the code that is general and is used by all
+of the phones. The functions within should convert the gnokii internal
+structures into the frames (without the header) that can be sent to the
+phone and understood by it. It's obvious that this layer should be phone
+independent. All the phone specific stuff should be done in the phone layer.
+In the case when phone frames are similiar but not the same, the phone layer
+can export some help structures to let be the code shared in the middle
+layer. Using the middle layer is optional. Currently almost no code does use
+it. Although it is recommended to use it to avoid the code duplication and
+to keep clean the phone drivers.
+
+
+The Phone:
+
+The phone/*.c code therefore basically contains code to package up and
+unpack information from the phone specific format to generic gnokii
+structures (eg GSM_Bitmap). However, it is also at the top of the tree
+and contains functions called by the application. Generally there are
+three types of exchanges that can occur. Firstly the computer can send
+the phone a command and expect no answer (not including acks etc which
+are dealt with by the phone code). Secondly the computer may send a command
+and expect a response within a certain time - often containing useful
+information. Lastly the phone may send the computer unrequested
+information (ring!). Therefore the functions in the phone code need to
+process one of these three things:
+
+1) Just sending out is easy - we simply call SM_SendMessage - which in
+turn calls the link sendmessage.
+
+2) Command and response. There are two ways to do this. In both cases we
+start out by sending a message via the statemachine. Next we either a)
+wait for the reply or b) wait for some other code to process the reply.
+My (*new improved*!!!) suggestion is that the statemachine calls phone
+functions (like parts of DispatchMessage) which process the received data
+into a generic structure tagged with the data type (one function for each
+data type). This is returned to the statemachine. The statemachine then
+returns this 'baggage' to the other part of the phone code which is
+waiting for it.
+
+3) Notification. Here, as for 2) the statemachine calls some phone code,
+but the phone code merely remembers it and does not return any data.
+
+
+So, the phone file contains two types of functions. Some are called by
+the application (via GSM_Functions) - and some by the statemachine
+(IncomingFunctions[]). The application ones assemble a request and pass
+it on down to the statemachine. They then block to the statemachine until
+the answer is ready. The statemachine recieves data from the link and
+passes it up to the appropriate IncomingFunction in phone, which returns
+the answer which is finally passed back to the blocked phone function.
+
+
+The StateMachine:
+
+This therefore has the following states:
+
+Startup
+Initialised
+MessageSent
+Waiting
+AnswerReady
+
+When SM_SendMessage is called by the phone (application code), we go to
+state MessageSent. The message is passed on to the link, but stored
+internally as well in-case it needs to be resent.
+
+If at any point an message from the link is received this is passed onto
+the phone (incoming) code.
+
+If the phone code calls SM_WaitFor, we go to state Waiting. Now if an
+answer comes back from the phone code (eg a received logo) we store it
+internally in the statemachine and go to state AnswerReady.
+
+When the phone code calls SM_GetAnswer, we pass up the stored answer and
+go back to Initialised.
+
+Note that all of this can, or can not be done as a seperate thread. For
+now, we will have a SM_Loop function (which blocks for a required time and
+returns the current state) so that we can work within one thread.
+
+
+PhoneGeneric:
+
+This now contains one handy helper function which serves only to call
+SM_WaitFor, then SM_Loop repeatedly until the state goes to AnswerReady,
+and then SM_GetAnswer. This is just to save repeating code.
+
+
+-----------------------
+
+Note that this leaves the phone code very similar to the basic layout of
+eg fbus-6110.c but removes all the:
+
+static GSM_DateTime *CurrentAlarm;
+static GSM_Error CurrentAlarmError;
+
+,makes everything well orderd and splits up DispatchMessage into byte
+sized chunks!
+
+-----------------------
+
+
+
+Other Notes
+-----------
+
+Within a phone/*.c or link file the functions should be made static. It
+is therefore not necessary to use prefixes such as FB61_ but this may help
+code legibility to distiguish the major functions.
+
+
+--
+$Id$
+Chris Kemp
+Pawel Kot
--- /dev/null
+<html>
+<head>
+ <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-2">
+<META NAME="konwerter" CONTENT="Ogonki97 1.3">
+ <meta name="Author" content="Marcin Wi±cek">
+ <meta name="Description" content="Opis dotycz±cy mygnokii i gnokii">
+ <meta name="language" content="pl">
+ <meta name="revisit-after" content="15 days">
+ <meta name="Robots" content="all">
+ <meta name="KeyWords" content="NCDS, Nokia, 3210, 5110, 5130, 6110, 6130, 6150, 8810, 9110, FAQ, GSM, DCS, SMS, Smart Messaging, logo, Marcin, Wi±cek, Wiacek, Marcin Wi±cek, Marcin Wiacek, mygnokii, gnokii">
+ <title>Nadzieja dla Kontestatorów</title>
+ <link rel="stylesheet" href="styl.css" type="text/css">
+</head>
+<body bgcolor="#FFFFFF" text="#2B2B69" link="#525FF5" vlink="#525FF5" alink="#2FA030">
+
+<a NAME="Top"></a>
+<center><font color="#1F409F" size=+2 class="tytul">Nadzieja dla Kontestatorów</font>
+
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+<div align="center"><font size="1">Poni¿szy tekst jest rozwiniêciem artyku³u
+opublikowanego na ³amach czasopisma <a href="http://www.chip.pl" class="autoremail">Chip Special </a> zima 2001.</font></div>
+<hr size="2" noshade width="60%" align="center" style="color: #004080">
+
+</center>
+
+<p><b>Producenci telefonów komórkowych czêsto do³±czaj± do swoich produktów
+oprogramowanie umo¿liwiaj±ce obs³ugê wiêkszo¶ci funkcji aparatu z klawiatury
+komputera. K³opoty zaczyn± siê wówczas, je¿eli nasz komputer nie korzysta
+z "jedynie s³usznych" systemów operacyjnych: MS Windows lub Mac OS ...</b>
+<p><b>U¿ytkownicy systemów BSD i Linux s± w znacznie gorszej sytuacji. Jak
+dotychczas ¿aden producent "komórek" nie zdoby³ siê na upublicznienie programów
+dla tych systemów. ¯ycie jednak nie znosi pró¿ni. Ponad 3 lata temu pojawi³
+siê Gnokii - projekt umo¿liwiaj±cy obs³ugê telefonów komórkowych Nokia
+w systemach uniksowych.</b>
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="1"></a><font color="#1F409F" size=+2 class="dzial">1. Nieco historii</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Gnokii wywodzi siê z dwóch projektów: pierwszego, zapocz±tkowanego m.in.
+przez Francois Dessarta i Hugh Blemingsa w pa¼dzierniku 1998, przeznaczonego
+dla modeli 3110 i 8110 oraz innego, rozpoczêtego m.in. Staffana Ulfberga
+obs³uguj±cego model 6110. Projekty te po³±czone zosta³y w lutym 1999 roku.
+Za³o¿eniem twórców Gnokii by³o opracowanie interfejsu programistycznego
+oraz graficznego do obs³ugi najpopularniejszych wówczas modeli telefonów
+komórkowych. Tworzona aplikacja mia³ równie¿ umo¿liwiaæ wykonywanie transmisji
+danych, nie przewidziano jednak transmisji faksów.
+<p>Projekt rozwija³ siê bez przeszkód do drugiej po³owy zesz³ego roku (wersja
+0.3.3_pre8), Na skutek sporów dotycz±cych przysz³o¶ci pakietu, jego rózwój
+zosta³ na pewien czas wstrzymany. Odesz³o wtedy kilka osób, które wnosi³y
+wiele zmian.
+<p>W tym roku prace nad pakietem zosta³y znów rozpoczête. Programi¶ci skupili
+siê nad wersj± rozwojow±. Zdecydowano siê przepisaæ tê czê¶æ kodu ¼ród³owego,
+która jest odpowiedzialna za komunikacjê programu z telefonem. Zmiany te
+maj± pomóc w usuwaniu b³êdów, s± tak¿e potrzebne aby wspó³dzieliæ czê¶ci
+kodu u¿ywane przez ró¿ne modele telefonów. Pojawi³y siê równie¿ pierwsze
+funkcje do Dancalla 2711 oraz Nokii 2110, 7110 i 62xx. Praca ta nie jest
+ci±gle dokoñczona - wersja rozwojowa 0.4.0_pre2 z listopada mo¿e nie zapewniaæ
+jeszcze takiego wsparcia do niektórych modeli (np. serii 61xx) jak stabilna
+0.3.3 opublikowana we wrze¶niu (do której nie do³±czono wielu partii nowego
+kodu).
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="2"></a><font color="#1F409F" size=+2 class="dzial">2. Mygnokii</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>MyGnokii jest obecnie jedyn± konkurencyjn± dystrybucj± dla oryginalnego
+Gnokii, Zosta³a stworzona w okresie sporów po opublikowaniu wersji 0.3.3_pre8
+Gnokii. Twórc± tego projektu jest Marcin Wi±cek.
+<p>Nowa dystrybucja pocz±tkowo zosta³a oparta na Gnokii 0.3.3_pre8 i zawiera³a
+wy³±cznie poprawki do oryginalnego kodu. Jednak w ci±gu ostatnich miesiêcy
+wprowadzono znaczne zmiany w stosunku zarówno do wersji rozwojowej jak
+i stabilnej Gnokii. Ró¿nice te mo¿na scharakteryzowaæ nastêpuj±co:
+<ol>
+<li>
+Obs³ugiwane s± praktycznie wszystkie nowe modele Nokii, a liczba dostêpnych
+funkcji jest szersza ni¿ w Gnokii. MyGnokii wspó³pracuje z telefonami Nokia
+3210, 3310, 8210/8850, 61xx/51xx, 62xx, 7110 oraz 3330. Niestety, trzy
+ostatnie modele nie mog± jeszcze wykorzystaæ wszystkich dostêpnych opcji
+pakietu. MyGnokii nie zapewnia te¿ du¿ego wsparcia modelom serii 3110/8110
+(tzn. liczba obs³ugiwanych funkcji programu dla tych modeli jest ma³a),
+w ogóle nie wspó³pracuje z Noki± 2110.</li>
+
+<li>
+W pakiecie wprowadzono pe³n± obs³ugê technologii Smart Messaging. Dziêki
+temu MyGnokii nie ma ¿adnych problemów z przesy³aniem czy odbieraniem dzwonków,
+obrazków albo wpisów w kalendarzu.</li>
+
+<li>
+Dokumentacje obydwu projektów ró¿ni± siê nie tylko form± ale tak¿e tre¶ci±.
+Po¶wiêcono jej osobny rozdzia³ w artykule.</li>
+
+<li>
+Udostêpniono zestaw standardowych dzwonków i obrazków (m.in. logo startowych)
+ró¿nych modeli telefonów Nokia.</li>
+
+<li>
+Zmiany kodu ¼ród³owego umo¿liwi³y szybsze dzia³anie programów.</li>
+
+<li>
+Dostêpne jest znacznie wiêcej funkcji i opcji w wersji dzia³aj±cej w konsoli
+ni¿ w analogicznej aplikacji z <i>gnokii</i>.</li>
+
+<li>
+MyGnokii przesta³o byæ oprogramowaniem wy³±cznie dla systemów uniksowych.
+Kod ¼ród³owy zawiera od razu w sobie wszystkie poprawki i pliki niezbêdne
+do skompilowania w Windows (kompilator Visual C++ 6). Dostêpna jest biblioteka
+DLL, któr± mo¿na wykorzystaæ w praktycznie ka¿dym jêzyku programowania
+- w pakiecie znajduje siê zreszt± przyk³adowy, wykorzystuj±cy j± interfejs
+u¿ytkownika napisany w Delphi. Interfejs mo¿na skompilowaæ u¿ywaj±c bezp³atnego
+Delphi 6PE dostêpnego na Chip CD 10/2001 oraz stronie WWW Borlanda. Skompilowana
+wersja pakietu i biblioteka DLL dostêpna jest tak¿e na stronie domowej
+autora.</li>
+
+<li>
+Inna jest struktura kodu odpowiedzialnego za wysy³anie komend do telefonu
+i ich odbieranie. Jest ona podobna do tej, która obecna jest w wersji stabilnej
+0.3.3 Gnokii.</li>
+
+<li>
+Programistów zainteresuj± procedury wspomagaj±ce "podgl±danie" transmisji
+prowadzonej z innych programów pomiêdzy komputerem a telefonem (zamiast
+prowadziæ reverse engineering programów, których kody ¼ród³owe nie s± dostêpne,
+mo¿na pos³u¿yæ siê t± funkcj± programu by uzyskaæ informacje w jaki sposób
+inne aplikacje komunikuja siê ze sprzêtem). Oprócz tych funkcji w pakiecie
+jest zreszt± zawarta bogata dokumentacja opisuj±ca protoko³y u¿yte w ró¿nych
+modelach telefonów.</li>
+</ol>
+W momencie dodawania nowych funkcji do Gnokii, czê¶æ z nich jest bie¿±co
+adaptowana na potrzeby MyGnokii. Tak by³o np. z poprawkami dotycz±cymi
+transmisji danych czy kodowania znaków na potrzeby SMS.
+<p>Niestety, ró¿nice pomiêdzy dystrybucjami powoduj±, ¿e czê¶æ oprogramowania
+pisanego dla Gnokii mo¿e nie dzia³aæ z MyGnokii. Jest tak przyk³adowo z
+modu³em pozwalaj±cym korzystaæ z funkcji pakietu z programów napisanych
+w Perlu.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="3"></a><font color="#1F409F" size=+2 class="dzial">3. Jak telefon z komputerem ...</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Istniej± 3 sposoby po³±czenia komputera z telefonem komórkowym: kabel,
+podczerwieñ i modu³ Bluetooth. Dwa pierwsze postaramy siê nieco przybli¿yæ.
+<ol>
+<li>
+<b>Kabel.</b></li>
+
+<br>Mo¿e dzia³aæ w co najmniej jednym z trzech trybów: FBUS, MBUS (s± to
+wewnêtrzne protoko³y Nokii) albo w trybie komend AT. Ró¿ni± siê one fizycznie
+m.in. prêdko¶ci± transmisji oraz u¿ywanymi sygna³ami z³±cza szeregowego.
+Kable przeznaczone dla nowszych modeli telefonów wyprowadzaj± ni¿sze napiêcia.
+Oznacza to, i¿ do obs³ugi modeli serii 21xx/31xx/81xx mo¿emy potrzebowaæ
+innego kabla ni¿ dla modeli serii 3210, 33xx, 62xx czy 7110.
+<p>Kable mo¿emy zrobiæ korzystaj±c ze schematów ogólnie dostêpnych w Internecie
+(np. w Telekomunikacyjnym Serwisie Informacyjnym fkn.pl) ewentualnie skorzystaæ
+z tych dodawanych do oryginalnych pakietów Nokii - np. Nokia Cellular Data
+Suite. Nie znajdziemy oczywi¶cie w ¿adnym salonie kabla do modeli serii
+3210/33xx/8210/8850 dlatego, i¿ oficjalnie modele te nie maj± takich mo¿liwo¶ci
+- dlatego równie¿ wtyczek do nich nale¿y szukaæ wy³±cznie np. na gie³dach
+elektronicznych albo w sprzeda¿y wysy³kowej.
+<p>Odpowiedni kabel mo¿emy tak¿e kupiæ - na stronie domowej Marcina Wi±cka
+znajdziemy adresy wytwórców. Polecamy kable FBUS/MBUS (mog± byæ opisane
+jako DAU9P), bêd± one dzia³aæ praktycznie z ka¿dym nowszym modelem telefonu.
+<p>Czê¶æ telefonów (jak np.: 62xx, 7110 czy 8210/8850) posiadaj± wbudowany
+modem, z którym mo¿na kontaktowaæ siê poprzez zestaw komend AT (zgodny
+z standardem Hayes i normami ETSI). Niestety, aby korzystaæ z niego musimy
+nabyæ kabel DLR-3P (ewentualnie starsz± wersjê DLR-3). Obs³uguje on tryb
+komend AT oraz FBUS. Mo¿na go wykorzystaæ jedynie z Noki± 62xx/7110 - ze
+starszymi modelami nie bêdzie dzia³a³ w ogóle, nawet w trybie FBUS ! Kabel
+taki trudno jest wykonaæ samodzielnie - posiada bowiem uk³ad scalony zawieraj±cy
+unikalne oprogramowanie Nokii. Z tego te¿ powodu mo¿emy co najwy¿ej poleciæ
+odwiedzenie strony "Cable Connecting Data" - oprócz schematu elektrycznego
+zawiera tak¿e dane dotycz±ce zaprogramowania wspomnianego uk³adu scalonego.
+<br>
+<li>
+<b>Podczerwieñ.</b></li>
+
+<br>Czê¶æ telefonów pozwoli skorzystaæ z podczerwieni. Komunikacja taka
+mo¿e byæ realizowana przez dwa rodzaje urz±dzeñ. Pierwsze z nich to specjalny
+odbiornik, który pod³±czamy do z³±cza podczerwieni dostêpnego w wiêkszo¶ci
+wspó³czesnych p³yt g³ównych (przyk³adowy schemat takiego urz±dzenia oraz
+wiêcej informacji na ten temat podano w Chipie 12/2000). Musimy tak¿e uaktywniæ
+odpowiedni± opcjê w BIOSie. Sposób ten jest najczê¶ciej realizowany w komputerach
+przeno¶nych.Drugi rodzaj urz±dzeñ to tzw. dongle. Jest to pude³eczko pod³±czane
+zewnêtrznie do portu szeregowego, zawieraj±ce port podczerwieni oraz ca³±
+niezbêdn± elektronikê.
+<p>Równie¿ komunikacja w podczerwieni mo¿e byæ realizowana na dwa sposoby.
+Pierwszy z nich jest u¿ywany we wszystkich nowych modelach: serii 8210/8850
+oraz w modelach 62xx i 7110. Jest to tzw. podczerwieñ socketowa - realizowana
+przez system operacyjny komputera. Telefon u¿ywa tutaj pewnego znormalizowanego
+(dziêki temu wykorzystywanego w wielu ró¿nych urz±dzeniach) formatu danych.
+Czê¶æ funkcji potrzebnych programi¶cie jest wbudowywana w system operacyjny.
+W systemie znajduj± siê tak¿e sterowniki do ró¿nych modu³ów podczerwieni.
+Programy u¿ywaj±ce tego interfejsu mog± zaj±æ siê wy³±cznie interpretacj±
+otrzymywanych komend i ich wysy³aniem (poprzez wykorzystywanie odpowiednich
+funkcji systemowych). U¿ycie takiej podczerwieni wymaga w³±czenia jej obs³ugi
+w j±drze systemu.
+<p>Realizacja po³±czenia komputera z telefonem opisanym sposobem wymaga
+(oprócz portu podczerwieni oczywi¶cie) aby j±dro Linuksa umo¿liwia³o taki
+rodzaj komunikacji, czyli musi byæ skompilowane z odpowiedni± opcj±. Po
+aktywacji portu podczerwieni w Nokii, Linux powinien znale¼æ modem bêd±cy
+modemem telefonu, z którym komputer po³aczony jest podczerwieni±.
+<p>Drugi sposób dotyczy wszystkich modeli 61xx oraz 8210/8850 (w tych dwóch
+ostatnich podczerwieñ uruchamiamy opcj± w³±czaj±c± dwóch graczy w wê¿a,
+a nie z menu g³ównego !). Telefon wykorzystuje tu wewnêtrzny format Nokii.
+Poniewa¿ ¿aden system operacyjny nie zapewnia jego obs³ugi, w komputerze
+musi byæ uruchomiony odpowiedni program (np. MyGnokii lub Gnokii), który
+bezpo¶rednio odczyta i zinterpretuje ka¿dy wys³any z telefonu znak, jak
+równie¿ prze¶le ka¿d± komendê z komputera po przekszta³ceniu jej do formatu
+Nokii. Taki rodzaj komunikacji podczerwonej to tzw. podczerwieñ bezpo¶rednia.
+Aby z niej korzystaæ, j±dro Linuksa nie mo¿e byæ skompilowane z opcj± wspomagania
+podczerwnieni (poniewa¿ opcja dotyczy tylko podczerwieni socketowej). Warto
+zauwa¿yæ, ¿e MyGnokii nie jest w stanie komunikowaæ siê w ten sposób z
+Windows NT/2000/XP - w systemach tych oprogramowanie nie mo¿e bowiem bezpo¶rednio
+odwo³ywaæ siê do ¿adnego urz±dzenia.
+<p>Ograniczeniem metody bezpo¶redniej jest tak¿e to, i¿ MyGnokii i Gnokii
+nie obs³uguje wszystkich typów dongle. W chwili obecnej mo¿liwa jest tylko
+obs³uga urz±dzeñ zgodnych ze standardem Tekram 210.
+<br>
+<li>
+<b>Bluetooth.</b></li>
+
+<br>Modu³y Bluetooth, dostêpne obecnie tylko dla Nokii 6210, s± stosunkowo
+s³abo rozpowszechnione i autorzy MyGnokii i Gnokii nie maj± ¿adnych informacji
+o mo¿liwo¶ci wykorzystania tej metody komunikacji telefonu z komputerem.
+Wydaje siê natomiast, i¿ modu³y te s± ci±gle dopracowywane i lepsz± stabilno¶æ
+po³±czeñ uzyskamy u¿ywaj±c podczerwieni lub kabla (wskazuj± na to testy
+publikowane w popularnych serwisach telekomunikacyjnych).</ol>
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="4"></a><font color="#1F409F" size=+2 class="dzial">4. Instalacja</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Kiedy po³±czylismy ju¿ telefon z komputerem, mo¿emy przyst±piæ do instalowania
+i konfigurowania MyGnokii. Powinni¶my pobraæ plik zawieraj±cy kod ¼ród³owy
+pakiety mygnokii.tar.gz (pakiet nie jest dostepny w formatach rpm czy deb)
+wraz z plikiem zawieraj±cym "skóry" telefonów mygnokii_skins.tar.gz . "Skóry"
+to nic innego jak piktogramy telefonów wykorzystywane w X-Window. Przystêpujemy
+do instalacji. Najpierw rozpakowujemy pakiet zawieraj±cy kod ¼ród³owy
+<p><b>tar zxvf mygnokii.tar.gz</b>
+
+<p>Wchodzimy od utworzonego
+katalogu <i>mygnokii</i> i konfigurujemy MyGnokii.
+<p><b>./configure --enable-security</b>
+<p>W podanym przyk³adzie, utworzony pakiet bêdzie móg³ odczytaæ informacje
+zwi±zane z zabezpieczeniami telefonu (np.: kod zabezpieczaj±cy).
+<p>Je¿eli nie zamierzamy korzystaæ z xgnokii ("okienkowej" wersji gnokii)
+powinni¶my do polecenia
+<i>./configure
+</i>do³±czyæ tak¿e parametr <i>--without-x</i>.
+Kompilacja xgnokii jest mo¿liwa o ile posiadamy w systemie pliki nag³ówkowe
+do tworzenia programów w gtk (<i>pakiety gtk+-devel-1.2.x, glib-devel-1.2.x</i>)
+oraz bibliotekê libXpm. Informacje o innych parametrach, które mog± zostaæ
+u¿yte przy konfiguracji znajdziemy w pliku <i>mygnokii/Docs/en_US/gnokii/config.htm</i>.
+<p>W kolejnym kroku kompilujemy pakiet:
+<p><b>make</b>
+<p>Po kompilacji instalujemy pakiet w systemie wykonuj±c (tutaj s± wymagane
+uprawnienia roota):
+<p><b>make install</b>
+<p><b>make install-docs</b>
+<p>Od tego momentu w systemie powinny istnieæ polecenia
+<i>gnokii</i> (wersja
+konsolowa), <i>xgnokii </i>(wersja pod X-windows) oraz <i>gnokiid</i> (transmisja
+danych w podczerwieni bezpo¶redniej/przez kabel).
+<p>Pliki ze skórami telefonów do <i>xgnokii</i> rozpakowujemy i kopiujemy
+do katalogu <i>xpm</i> utworzonego podczas instalacji <i>xgnokii</i> -
+<i>/usr/local/lib/xgnokii/xpm/
+</i>lub
+<i>/usr/local/share/xgnokii/xpm/
+</i>zale¿nie
+od posiadanej dystrybucji Linuksa. Prawa dostêpu do tych plików ma jedynie
+root. Oznacza to, ¿e pozostali u¿ytkownicy systemu nie bêd± mogli w pe³ni
+wykorzystaæ mo¿liwo¶ci pakietu. Mo¿emy to jednak zmieniæ, poniewa¿ prawa
+dostêpu tych plików nie maj± wp³ywu na bezpieczeñstwo systemu (<i>chmod
+a+rw *</i>).
+<p>W odró¿nieniu od MyGnokii, Gnokii jest udostêpniana tak¿e jako plik
+rpm, deb albo w formie CVS. Instalacja z posiadanego kodu ¼ród³owego przebiega
+podobnie (nie trzeba jednak instalowaæ "skór" z oddzielnego pliku - s±
+w³±czone w pakiecie). Natomiast instalacja pliku w formacie rpm lub deb
+przebiega tak samo jak innych pakietów w tych formatach.
+<p>Objêtnie czy korzystamy z pakietu Gnokii czy MyGnokii polecenia uruchamiaj±ce
+aplikacjê (<i>gnokii</i> w trybie tekstowym i <i>xgnokii</i> w trybach
+graficznych) s± takie same.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="5"></a><font color="#1F409F" size=+2 class="dzial">5. Konfiguracja.</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p><b></b>
+<p>Przyk³adowy zbiór konfiguracyjny znajdziemy w katalogu <i>mygnokii/Docs/examples
+</i>(w
+Gnokii bêdzie to katalog <i>gnokii/Docs/sample</i>) pod nazw± <i>gnokiirc</i>.
+Kopiujemy go do katalogu domowego pod nazw±<i>..gnokiirc
+</i>lub katalogu
+<i>/etc</i>
+jako <i>gnokiirc</i>. W sekcji
+<i>global</i> ustawiamy nastêpuj±ce parametry:
+<ul>
+<li>
+<i>Port</i> - podajemy port, do którego do³±czony jest telefon. Mo¿e to
+byæ<i>/dev/ircommx</i> w przypadku podczerwieni socketowej lub <i>/dev/ttySx</i>
+w pozosta³ych (zamiast <i>x</i> wstawiamy numer portu). Nale¿y oczywi¶cie
+mieæ prawa dostêpu do wybranego portu (mo¿na je ustawiæ np. przez <i>chmod
+u+rwx nazwa_portu</i>)</li>
+
+<li>
+<i>Model</i> - podajemy model telefonu, np. <i>6210.
+</i>Podanie nazwy
+konkretnego modelu wymagane jest je¶li u¿ywamy Gnokii. Korzystaj±c z MyGnokii,
+mo¿emy te¿ u¿yæ parametru
+<i>auto</i> i pakiet przy ka¿dym po³±czeniu bêdzie
+próbowa³ automatycznie wykryæ model.</li>
+
+<li>
+<i>Initlength</i> - w przypadku trybu komunikacji FBUS przez kabel albo
+przy u¿yciu bezpo¶redniej podczerwieni mo¿na skróciæ czasu synchronizacji
+pomiêdzy urz±dzeniami. Nale¿y pamiêtaæ, i¿ zbytnie zmniejszenie tego parametru
+mo¿e uniemo¿liwiæ komunikacjê. W wiêkszo¶ci przypadków warto¶æ 30 jest
+tutaj w zupe³no¶ci wystarczaj±ca, w razie potrzeby nale¿y j± zwiêkszyæ.</li>
+
+<li>
+<i>Connection</i> - typ po³±czenia. Podawanym parametrem mo¿e byæ <i>irda</i>
+(podczerwieñ przez sockety),
+<i>infrared</i> (podczerwieñ bezpo¶rednia),
+<i>tekram210</i>
+(podczerwieñ bezpo¶rednia przez dongle zgodne ze standardem Tekram 210),
+<i>mbus</i>
+(tylko w MyGnokii: standard MBUS), <i>serial</i> (w Gnokii) albo <i>fbus</i>
+(w MyGnokii) - standard FBUS.</li>
+
+<li>
+<i>Synchronizetime</i> - parametr wystêpuje wy³±cznie w MyGnokii. Przenosi
+datê i czas komputera do telefonu przy ka¿dym po³±czeniu (opcja przydatna,
+gdy synchronizujemy czas w komputerze z serwerów internetowych). Uwaga:
+ustawienie czasu w telefonie mo¿e powodowaæ pewne drobne problemy - je¿eli
+w trakcie tej samej sesji (w której ustawili¶my czas) zresetujemy telefon,
+czas bêdzie trzeba ustawiæ ponownie.</li>
+</ul>
+Je¶li chcemy korzystaæ z programu
+<i>gnokiid</i>, ustawienia z sekcji
+<i>global</i>
+nale¿y powtórzyæ w sekcji
+<i>gnokiid</i>.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="6"></a><font color="#1F409F" size=+2 class="dzial">6. Na konsoli i w X Window</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Zarówno Gnokii jak i MyGnokii umo¿liwiaj± pracê w trybie tekstowym (w
+x-terminalu i na konsoli) jak i w trybach graficznych. Praca w trybie tekstowym
+nie jest zbyt wygodna (przyk³ady podane zosta³y w ramce na koñcu tekstu),
+pozwala jednak wykorzystaæ w pe³ni wszystkie mo¿liwo¶ci programu. O ile
+skompilowali¶my pakiet wraz z <i>xgnokii</i> czyli interfejsem graficznym,
+wygodniej jest korzystaæ z MyGnokii w X Window. Mo¿liwo¶ci pakietu s± naprawdê
+du¿e. MyGnokii umo¿liwia m. in. obs³ugê smsów, kalendarza (tworzenie i
+edycja notatek), ksi±¿ki telefonicznej, tworzenie i przesy³anie logo oraz
+melodyjek. Oprogramowanie pozwala tak¿e uruchomiæ monitor sieci - funkcjê
+umo¿liwiaj±c± poznanie parametrów pracy sieci GSM i telefonu.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="7"></a><font color="#1F409F" size=+2 class="dzial">7. Konkurencja</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>MyGnokii oraz Gnokii nie maj± konkurentów w ¶rodowisku uniksowym. Jednak
+w systemie MS Windows, konkurencja dla MyGnokii jest silna. Najpopularniejszymi
+programami do obs³ugi telefonów komórkowych s± z ca³± pewno¶ci± LogoManager
+i Oxygen. LogoManager pozwala u¿ytkownikowi na tworzenie i przesy³anie
+logo oraz melodyjek. Umo¿liwia tak¿e edycjê ksi±¿ki telefonicznej oraz
+wysy³aæ standardowe smsy, jednak tutaj oferowane mo¿liwo¶ci s± bardzo ograniczone.
+Natomiast Oxygen jest ¶wietnym programem do modyfikowania ksi±¿ki telefonicznej,
+edycji notatek w kalendarzu, potrafi tak¿e wymieniaæ dane pomiêdzy telefonem
+a MS Outlook i Lotus Notes. Podobnie jak LogoManager potrafi tworzyæ loga
+nie mniej ustêpuje temu ostatniemu pod wzglêdem wygody obs³ugi. Wielu u¿ytkowników
+korzysta z obydwu programów wykorzystuj±c Oxygen do zarz±dzania informacj±
+w telefonie, a LogoManager do tworzenia i wysy³ania grafik i d¼wiêków.
+Nie jest to zbyt wygodne rozwi±zanie. Najwiêksz± wad± tych programów jest
+jednak to, ¿e s± p³atne. Mo¿na oczywi¶cie za darmo pobraæ wersje shareware,
+jednak posiadaj± one istotne ograniczenia wp³ywaj±ce na ich funkcjonalno¶æ.
+<p>MyGnokii ³±czy w sobie zalety wymienionych wy¿ej programów. - wszystkie
+mo¿liwo¶ci oferowane przez LogoManager czy Oxygen s± dostêpne tak¿e w MyGnokii.
+Jedynym wyj±tkiem jest tu wymiana informacji pomiêdzy MyGnokii a MS Outlook
+czy Lotus Notes. Jak ka¿de oprogramowanie dostêpne na licencji GNU, nie
+posiada ograniczeñ czasowych czy funkcjonalnych. Co wiêcej, jest udostêpniane
+z pe³nym kodem ¼ród³owym i pozwala na wykorzystanie funkcji telefonów we
+w³asnych aplikacjach.
+<p>Nie znaczy to oczywi¶cie, ¿e MyGnokii jest pakietem idealnym. Pracuj±ca
+w trybie tekstowym <i>gnokii</i> zosta³a dobrze dopracowana. Jedynie okienkowa
+wersja pakietu, <i>xgnokii</i>, mimo ¿e bardzo prosta i intuicyjna w obs³udze,
+mo¿e sprawiæ ma³y zawód. Wersja <i>xgnokii</i> zawarta w pakiecie pochodzi
+sprzed prawie pó³tora roku i niestety nie jest niestety dokoñczona. Podczas
+testów przeprowadzonych przy u¿yciu dwóch telefonów Nokia 6210, stwierdzili¶my
+problemy z obs³ug± kalendarza i ksi±¿ki telefonicznej. W przypadku kalendarza
+- czê¶æ typów alarmów nie mo¿na by³o ustawiæ. Z kolei ksi±¿ka telefoniczna
+nie umo¿liwia³a zapisywania zmian na karcie SIM telefonu, ponadto nie mo¿na
+by³o wprowadziæ nowego numeru telefonu. Oczywi¶cie problemy te znika³y,
+kiedy korzystano z <i>gnokii</i> w trybie tekstowym, trzeba jednak przyznaæ,
+¿e praca w trybie graficznym jest znacznie prostsza i przyjemniejsza ni¿
+w trybie tekstowym.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="8"></a><font color="#1F409F" size=+2 class="dzial">8. Transmisja danych</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Transmisja danych realizowana jest przez ró¿ne modele telefonów Nokia
+ró¿nymi sposobami. W dodatku, nie w ka¿dym modelu jest ona mo¿liwa.
+<p>MyGnokii (równie¿ Gnokii) daje u¿ytkownikowi narzêdzie, jakim jest <i>gnokiid,</i>
+s³u¿±ce przesy³aniu danych w starszych modelach telefonów.
+<p>Transmisja danych z u¿yciem
+<i>gnokiid</i> jest prowadzona w specyficzny
+sposób. Po po³±czeniu siê z telefonem poprzez kabel/podczerwieñ w wersji
+bezpo¶redniej <i>gnokiid</i> przetwarza dane z telefonu do postaci komend
+AT, które s± przekazywane do innych programów w komputerze. Podobnie w
+przypadku otrzymania komendy AT, jest ona przetwarzana do postaci wewnêtrznych
+poleceñ Nokii i przesy³ana do telefonu.
+
+<p><i>Gnokiid</i> mo¿na wykorzystywaæ tylko z telefonami serii 31xx/51xx/61xx/81xx.
+Je¿eli chodzi o modele 21xx, brak jest odpowiednich funkcji. Nie zosta³y
+one bowiem przeniesione z oryginalnego oprogramowania Nokii (pakietu Nokia
+CellWare) z tej prostej przyczyny, i¿ po prostu nie ma chêtnych do wykonania
+tego zadania.
+<p>A co maj± zrobiæ u¿ytkownicy nowszych telefonów ? W przypadku modeli
+3210/33xx transmisja danych jest oficjalnie niedostêpna i projektanci MyGnokii
+i Gnokii nie posiadaj± ¿adnych informacji, czy funkcja ta faktycznie zosta³a
+usuniêta z oprogramowania telefonów, czy te¿ zosta³ zmieniony sposób jej
+wywo³ania.
+<p>Z kolei w telefonach serii 62xx/7110/8210/8850 ¿adne dodatkowe oprogramowanie
+nie jest konieczne. Telefony te maj± wbudowane modemy, wystarczy wiêc zakupiæ
+kabel (DLR-3P) lub wykorzystaæ porty podczerwieni by transmisja by³a mo¿liwa.
+Korzystaj±c z narzêdzi dostepnych w systemie (np.: modemtool w dystrybucji
+Red Hat) Linux powinien rozpoznaæ przy³±czony telefon jako modem i zainstalowaæ
+go w systemie. Dalsza komunikacja ze sprzêtem odbywa siê tak, jak z tradycyjnym
+modemem.
+<p>Konfiguruj±c dostêp do Internetu musimy tylko pamiêtaæ, ¿e powinni¶my
+korzystaæ ze specjalnych numerów dostêpowych naszego operatora sieci GSM
+a nie np.: z numeru dostêpowego TPSA. Ten drugi mo¿e byæ bowiem niedostêpny.
+Je¿eli natomiast uda siê z nim nawet po³±czyæ, jego u¿ycie bêdzie na pewno
+znacznie dro¿sze.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="9"></a><font color="#1F409F" size=+2 class="dzial">9. Dokumentacja</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>W pakiecie u¿ytkownik znajdzie wyczerpuj±c± dokumentacjê, napisan± w
+formacie HTML. W procesie instalacji jest kopiowana z lokalnego katalogu
+z plikami ¼ród³owymi do folderu
+<i>/usr/local/doc/gnokii</i>. W podkatalogach
+znajdziemy tak¿e loga do aparatów 3210, 3310, 6150 oraz 6210 oraz d¼wiêki
+(melodyjki), które mo¿emy przes³aæ do telefonu. Znajdziemy tak¿e przyk³adowy
+zbiór konfiguracyjny oraz przyk³adowe pliki z danymi do wykorzystania z
+ró¿nymi opcjami.
+<p>Zawarta dokumentacja jest bardzo obszerna. W detalach opisuje procesy
+instalacji i konfiguracji (ze szczegó³ami wyja¶nia znaczenie poszczególnych
+komend), opisuje w jaki sposób po³aczyæ telefony 6210 i 7110 z komputerem
+przez podczerwieñ, wyja¶nia dostêpne polecenia <i>gnokii</i>. Dociekliwi
+znajd± bardzo szczegó³owe informacje o uruchomieniu i korzystaniu z monitora
+sieci, poradnik jak wykonaæ kabel ³±cz±cy telefon z komputerem, informacje
+o zmianach w oprogramowaniu telefonów, kodach i dokumentacjê protoko³ów
+transmisji.
+<p>Niestety, prawie wszystkie informacje podane zosta³y w jêzyku angielskim.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="10"></a><font color="#1F409F" size=+2 class="dzial">10. Przysz³o¶æ</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Niestety, nie rysuje siê ona najlepiej. Gnokii i MyGnokii s± rozwijane
+oddzielnie przez niewielkie grupy programistów, którzy nie maj± dostêpu
+do wszystkich sprzedawanych telefonów. A sami u¿ytkownicy tego oprogramowania
+najczê¶ciej nie s± niestety zainteresowani jak±kolwiek pomoc± w ulepszaniu
+pakietów czy zg³aszaniu lub usuwaniu b³êdów.
+<p>Natomiast ci±gle jest wiele do zrobienia: dokoñczenie graficznych interfejsów
+u¿ytkownika, stworzenie bardziej wyspecjalizowanych struktur do obs³ugi
+niektórych funkcji (przyk³adowo: ulepszenie czê¶ci zwi±zanej z sms), upraszczanie
+kodu ¼ród³owego tak, aby implementacja obs³ugi nowych modeli by³a ³atwiejsza,
+dodanie funkcji obecnych w innych pakietach "komórkowych", rozszerzenie
+obs³ugi komend AT. Na pewno tak¿e sporo bêdzie do zrobienia z nowymi modelami
+(np. Noki± 5510, która bêdzie siê ³±czyæ z komputerem przez USB).
+<p>Bez tego oba pakiety z czasem stan± siê wy³±cznie ciekawostk±. Miejmy
+jednak nadziejê, i¿ tak siê nie stanie i znajd± siê programi¶ci oraz u¿ytkownicy,
+którzy pomog± w rozszerzaniu opisywanego oprogramowania. Naprawdê nie trzeba
+tutaj du¿o: wystarczy znajomo¶æ programowania w Delphi (w celu dokoñczenia
+instniej±cego interfejsu graficznego), Visual Basic (mo¿e kto¶ zdecyduje
+siê na rozpoczêcie napisania w³asnej wersji okienkowej Logo Managera ?),
+C (rozszerzanie ca³o¶ci pakietu lub jego czê¶ci o nowe funkcje oraz usuwanie
+b³êdów), C++, pisania programów w GTK (dokoñczenie Xgnokii) albo chocia¿by
+znajomo¶æ HTML (opieka nad dokumentacj±). Mile widziana by³aby tak¿e pomoc
+zaawansowanych programistów - wszak odkrywanie funkcji nowych modeli jest
+fascynuj±c± przygod±, podobnie interesuj±cym wyzwaniem mo¿e byæ kwestia
+stworzenia w³asnego sterownika modemu do starszych modeli telefonów do
+systemu Windows. Przeszkod± nie powinna byæ tutaj bariera jêzykowa (nie
+trzeba znaæ jêzyka angielskiego) - wszak zarówno MyGnokii i Gnokii s± aktywnie
+tworzone przez Polaków - m.in. Marcina Wi±cka i Paw³a Kota. Mo¿na siê z
+nimi skontaktowaæ pod adresami email podanymi w ramce "Sieæ".
+
+<div align=right>Marcin Wi±cek
+<br>Ryszard Gabryszewski</div>
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="11"></a><font color="#1F409F" size=+2 class="dzial">11. Czy tylko Nokia ?</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Telefony Nokii s± najbardziej rozpowszechnionymi aparatami komórkowymi
+nie tylko w Polsce, tak¿e na ¶wiecie. Wiêcej, nazwa firmy sta³a siê wrêcz
+synonimem "komórki". Tak wiêc powstanie pakietów, które umo¿liwiaj± komunikacje
+Linuksa z tym typem aparatów nie powinno wydawaæ siê dziwne.
+<p>Na szczê¶cie posiadacze Ericssonów, Alcateli, Siemensów i innych nie
+powinni traciæ nadziei :-) Istnieje tak¿e inny, ciekawy projekt Open Source:
+gsmlib. Ma on na celu tworzenie biblioteki i programów w wersji na konsolê
+pozwalaj±cych wykonywaæ podstawowe czynno¶ci typu edycja ksi±¿ki telefonicznej
+czy smsów w telefonach u¿ywaj±cych komend AT. Podobnie jak MyGnokii mo¿na
+go bez problemu kompilowaæ i u¿ywaæ tak¿e w Windows. Gsmlib obecnie rozwija
+siê znacznie szybciej ni¿ MyGnokii czy Gnokii. Dzieje siê tak dlatego,
+poniewa¿ coraz wiêcej telefonów jest wyposa¿anych w komendy AT. A to oznacza,
+¿e popularno¶æ projektu z czasem bêdzie coraz bardziej rosn±æ.
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="12"></a><font color="#1F409F" size=+2 class="dzial">12. MyGnokii w trybie tekstowym</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Poni¿ej zosta³y podane przyk³ady u¿ycia poleceñ i funkcji MyGnokii w
+trybie tekstowym.
+<h1>
+Ksi±¿ka telefoniczna</h1>
+gnokii --getmemory SM 1 10 -short > ks-tel.txt
+<p>Pobiera pierwszych 10 numerów z ksi±¿ki telefonicznej na karcie SIM
+i zapisuje w pliku <i>ks-tel.txt</i>. Je¿eli nie podamy parametru -short,
+zostanie u¿yty format bardziej czytelny dla u¿ytkownika, ale nie bêdzie
+mo¿na u¿yæ opcji <i>--writephonebook</i> z utworzonym plikiem.
+<p>gnokii --writephonebook < ks-tel.txt
+<p>Odtwarza ksi±¿kê telefoniczn± z pliku <i>ks-tel.txt</i>.
+<h1>
+SMS</h1>
+gnokii --getsms SM 1
+<p>Pobiera SMS z karty SIM, pozycja 1.
+<p>gnokii --sendsms +48601234567 -d --long 200 < file
+<p>Czyta 200 znaków z pliku file, tworzy z nich tre¶ci SMSów (tutaj bêd±
+2 SMSy - pierwszy o d³ugo¶ci 160 znaków) i wysy³a pod numer +48601234567.
+W telefonie zostanie zapisany raport dorêczenia. Je¿eli zast±pimy <i>--sendsms</i>
+przez<i> --savesms</i>, SMSy zostan± zapisane na karcie SIM. Dodanie parametru
+<i>--unicode</i>
+spowoduje ich zakodowanie w Unicodzie (wtedy w jednym mo¿e zmie¶ciæ siê
+tylko 70 znaków, ale bêd± mog³y to byæ wszystkie znaki ze strony kodowej
+w komputerze).
+<p>gnokii --getsmsc 1
+<p>Pobiera pierwszy numer centrum SMS zapisany na karcie SIM.
+<p>gnokii --renamesmsc 1 "Era GSM"
+<p>Zmienia nazwê pierwszego centrum SMS na karcie SIM
+<h1>
+Czas i data</h1>
+gnokii --setdatetime
+<p>Ustawia w telefonie czas z komputera. Ustawianie czasu mo¿e byæ wymuszone
+tak¿e opcj± <i>synchronizetime</i> w zbiorze<i>gnokiirc.</i>
+<p>gnokii --setalarm 22 10
+<p>Ustawia w telefonie alarm na godzinê 22:10.
+<h1>
+Kalendarz</h1>
+gnokii --getcalendarnote 1 3 -v30
+<p>Pobiera pierwsz±, drug± i trzeci± notatkê z kalendarza telefonu (w Nokii
+33xx jest on okrojony do 10 przypomnieñ - pod tak± nazw± kalendarz dostêpny
+jest w menu telefonu). Je¿eli nie podamy parametru <i>-v30</i>, zostanie
+u¿yty format bardziej czytelny dla u¿ytkownika, ale nie bêdzie mo¿na u¿yæ
+opcji <i>--writecalendarnote</i> i<i> --sendcalendarnote </i>z utworzonym
+plikiem.
+<p>gnokii --sendcalendarnote +48601234567 vcardfile 1 -d
+<p>Odczytuje 1 pozycjê z pliku
+<i>vcardfile</i> i wysy³a pod numer +48601234567
+z raportem dorêczenia (opcja
+<i>--getcalendarnote</i> wypisze tre¶æ takiej
+notki, je¿eli dodamy prze³±cznik <i>-v30</i>).
+<p>gnokii --writecalendarnote vcardfile 1
+<p>Odczytuje 1 pozycjê z pliku
+<i>vcardfile</i> i wpisuje do telefonu (opcja
+<i>--getcalendarnote</i>
+wypisze tre¶æ takiej notki, je¿eli dodamy prze³±cznik <i>-v30</i>).
+<h1>
+Dzwonki</h1>
+
+<p><br>gnokii --playringtone ringtonefile
+<p>Odtwarza plik z dzwonkiem (format mid albo rttl) z pliku <i>ringtonefile</i>
+prze g³o¶nik telefonu.
+<p>gnokii --composer ringtonefile
+<p>Pokazuje, co i jak nale¿y wpisaæ w kompozytorze dostêpnym w menu np.
+Nokii 3210/33xx, aby uzyskaæ dzwonek z pliku <i>ringtonefile</i> (nie wymaga
+po³±czenia z telefonem).
+<p>gnokii --setringtone plik 1
+<p>Ustawia dzwonek ze zbioru<i> plik </i>na pozycji 1.
+<p>gnokii --sendringtone +48602123456 plik -d --scale --profilestyle
+<p>Wysy³a dzwonek pod numer +48602123456 z raportem dorêczenia. Opcja <i>--scale</i>
+jest konieczna do u¿ycia w przypadku b³êdnej interpretacji dzwonków przez
+niektóre modele (np. starsze Nokie 3310). Opcja
+<i>--profilestyle</i> pozwala
+zapisaæ d³ugie dzwonki w 2 SMSach. Bêd± one poprawnie interpretowane wy³±cznie
+przez nowsze telefony - np. Nokie 3330.
+<p>gnokii --setbinringtone plik 1
+<p>Je¿eli mamy plik z dzwonkiem w specjalnym formacie binarnym (w MyGnokii
+tak s± zapisane wszystkie standardowe dzwonki umieszczone w katalogu
+<i>mygnokii/Docs/default/sounds</i>),
+przy pomocy tej opcji mo¿na je w niektórych modelach - np. serii 61xx/6210
+- ustawiæ jako dzwonki wgrywane przez u¿ytkownika).
+<p>gnokii --getringtone plik 1
+<p>Pobiera dzwonek z pozycji 1 i zapisuje w zbiorze<i> plik</i>. Dzwonek
+zostanie zapisany w formacie binarnym (Nokie 6xxx/3210) albo standardowym
+(Nokie 33xx).
+<h1>
+WAP</h1>
+gnokii --getwapbookmark 1
+<p>Pobiera zak³adkê WAP z pozycji 1.
+<p>gnokii --sendwapbookmark 1 +48602123456 -d
+<p>Pobiera zak³adkê WAP z pozycji 1 i wysy³a pod numer +48602123456 (z
+raportem dorêczenia).
+<p>gnokii --getwapsettings 1
+<p>Pobiera ustawienia WAP z pozycji 1.
+<h1>
+Loga i obrazki</h1>
+gnokii --showbitmap logofile
+<p>Pokazuje logo z pliku <i>logofile</i>. Dostêpne formaty: bmp (2 kolorowe),
+ngg, nol, nlm, nsm.
+<p>gnokii --getlogo picture plik.nlm 1
+<p>Pobiera grafikê (tzw. Picture Image) z pozycji 1 i zapisuje w zbiorze
+<i>plik.nlm</i>.
+<p>gnokii --setlogo picture plik.nlm 1 "tekst" +48602123456
+<p>Odczytuje grafikê ze zbioru plik.nlm i zapisuje na pozycji 1 z dodatkowym
+tekstem "tekst" i numerem +48602123456.
+<p>gnokii --sendlogo picture +48602123456 plik.nlm "tekst" -d
+<p>Wysy³a grafikê pod podany numer z raportem dorêczenia i dodatkowym tekstem
+(Uwaga: 1 grafika to 3 SMSy).
+<p>gnokii --getlogo startup|7110startup|6210startup plik.nlm
+<p>Pobiera logo startowe (parametry
+<i>7110startup</i> lub <i>6210startup</i>
+pozwalaj± pobraæ loga o rozmiarach wy¶wietlaczy Nokii 7110 i 6210) i zapisuje
+w pliku <i>plik.nlm</i>. Opcja
+<i>--setlogo</i> z takimi samymi parametrami
+ustawia logo w telefonie. W nowszych Nokiach 3210 oraz z serii 33xx przed
+wgraniem loga, trzeba u¿yæ opcji
+<i>--resetphonesettings</i>, która wykasuje
+logo animowane (Uwaga: nie bêdzie mo¿na potem do niego powróciæ !).
+<p>gnokii --getlogo op|7110op plik.nlm
+<p>Pobiera logo operatora (parametr
+<i>7110op</i> pozwala pobraæ logo o
+rozmiarach dostêpnych w Nokii 62xx/7110) i zapisuje w pliku <i>plik.nlm</i>.
+<p>gnokii --setlogo op|7110op plik.nlm
+<p>Ustawia logo operatora (je¿eli nie podamy nazwy pliku, logo zostanie
+wykasowane w telefonie).
+<p>gnokii --sendlogo op +48602123456 logo.nlm kod_operatora -d
+<p>Wysy³a logo operatora (uwaga, du¿ych logo znanych z Nokii 62xx/7110
+nie mo¿na przesy³aæ) pod numer +48602123456 z raportem dorêczenia. Logo
+bêdzie pokazywane w sieci o kodzie <i>kod_operatora</i> ("260 01" dla Plusa,
+"260 02" dla Ery i "260 03" dla Idei). Je¿eli nie podamy numeru odbiorcy,
+parametru -d i zamienimy <i>--sendlogo</i> przez
+<i>--savelogo</i>, logo
+zostanie zapisane na karcie SIM.
+<p>gnokii --getlogo caller logo.nlm 1
+<p>Pobiera logo grupy o numerze 1 i zapisuje w pliku
+<i>logo.nlm</i>. Je¿eli
+zast±pimy <i>--getlogo</i> przez <i>--setlogo</i>, logo zostanie ustawione
+w telefonie.
+<p><i>gnokii --setlogo dealer "tekst</i>"
+<p>Ustawia w telefonie tzw. powitanie dealera - tekst z powitaniem widoczny
+po w³±czeniu telefonu, którego nie mo¿na ustawiæ z jego menu.
+<h1>
+Inne</h1>
+
+<p><br>gnokii --reset soft
+<p>Resetuje telefon.
+<p>gnokii --dialvoice +48601123456
+<p>Inicjuje po³±czenie g³osowe pod numer +48601123456.
+<p>gnokii --netmonitor devel
+<p>W³±cza pe³ne menu monitora sieci w telefonie (opcja ta pozwala dok³adnie
+sprawdzaæ stan sieci komórkowej "widzianej" przez telefon oraz pokazuje
+dok³adne informacje o samym telefonie, karcie SIM oraz baterii). Szerzej
+o tej funkcji mo¿na przeczytaæ na stronie autora artyku³u lub w dokumentacji
+MyGnokii. W przypadku niektórych wersji oprogramowania telefonu, niezbêdne
+bêdzie wy³±czenie i ponowne w³±czenie aparatu by pojawi³a siê w nim nowa
+pozycja w menu.
+<p>gnokii --identify
+<p>Pokazuje podstawowe informacje o telefonie - m.in. model i wersjê oprogramowania.
+<p>gnokii --presskeysequence sequence
+<p>W telefonie "wciska" kombinacjê klawiszy <i>sequence.</i>
+<p>gnokii --getsecuritycode SecurityCode
+<p>Pobiera z telefonu kod zabezpieczaj±cy (SecurityCode). Opcja dostêpna
+wy³±cznie, gdy przy wywo³aniu skryptu <i>configure</i> dodano prze³±cznik<i>--enable-security</i>.
+<p>gnokii --simlock
+<p>Informacje o simlocku - zabezpieczeniu uniemo¿liwiaj±cym korzystanie
+z kart SIM innych ni¿ macierzystego operatora GSM. Blokada taka pojawia
+siê najczê¶ciej w telefonach sprzedawanych w promocjach.
+<p>gnokii --phonetests
+<p>Wykonuje test telefonu. Krótkie wyja¶nienie do testów REAL TIME CLOCK
+BATTERY oraz MCU EEPROM COMPONENT: pierwszy testuje dzia³anie baterii podtrzymuj±cej
+datê/czas w telefonie po od³±czeniu baterii g³ównej. Baterii tej nie ma
+m.in w Nokiach 3210 i 33xx i wtedy bêdzie on mia³ b³êdny wynik. Nie jest
+to jednak uszkodzenie telefonu ! Podobnie we wszystkich nowych modelach
+(33xx, 62xx, 7110, 8210/8850 i nowszych) pamiêæ z ustawieniami telefonu
+(EEPROM) nie jest w formie oddzielnego uk³adu scalonego i program równie¿
+poka¿e tutaj b³±d.
+<p>gnokii --displayoutput
+<p>Pokazuje na ekranie komputera teksty wy¶wietlane przez telefon (dotyczy
+serii 51xx/61xx).
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="13"></a><font color="#1F409F" size=+2 class="dzial">13. Porównanie</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>Poni¿sza tabela zbiera informacje dotycz±ce sposobów komunikacji pomiêdzy
+telefonem a komputerem. Znak zapytania w komórce oznacza, ¿e dana konfiguracja
+nie by³a jeszcze sprawdzana. Natomiast znak x oznacza brak mo¿liwo¶ci wspó³pracy.
+<br>
+<table BORDER CELLSPACING=0 BORDERCOLOR="#000000" >
+<tr VALIGN=TOP>
+<td ALIGN=CENTER VALIGN=TOP> </td>
+
+<td>
+<center>Mbus</center>
+</td>
+
+<td>
+<center>Fbus</center>
+</td>
+
+<td>
+<center>Podczerwieñ bezpo¶rednia</center>
+</td>
+
+<td>
+<center>Podczerwieñ socketowa</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td>
+<center>Nokia 21xx/9000</center>
+</td>
+
+<td>
+<center>Gnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td>
+<center>31xx/81xx</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+</tr>
+
+<tr>
+<td>
+<center>3210/33xx</center>
+</td>
+
+<td VALIGN=TOP>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td>
+<center>51xx</center>
+</td>
+
+<td>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+</tr>
+
+<tr>
+<td>
+<center>61xx</center>
+</td>
+
+<td VALIGN=TOP>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td WIDTH="95">
+<center>62xx/7110</center>
+</td>
+
+<td>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td>
+<center>8210/8850</center>
+</td>
+
+<td>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>Gnokii</center>
+</td>
+
+<td>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>MyGnokii</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td>
+<center>9110/9210</center>
+</td>
+
+<td>
+<center>MyGnokii</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>?</center>
+</td>
+
+<td>
+<center>?</center>
+</td>
+</tr>
+
+<tr VALIGN=TOP>
+<td>
+<center>Nokia Card Phone 2.0</center>
+</td>
+
+<td>
+<center>MyGnokii
+<p>(czê¶ciowo)</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+
+<td>
+<center>X</center>
+</td>
+</tr>
+</table>
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a><p>
+
+<a NAME="14"></a><font color="#1F409F" size=+2 class="dzial">14. Sieæ</font><br>
+<hr align="LEFT" size="3" width="300" color="#60c0a0" noshade>
+
+<p>MyGnokii
+<br><a href="http://marcin-wiacek.topnet.pl">http://marcin-wiacek.topnet.pl</a>
+<br><a href="mailto:marcin-wiacek@topnet.pl">marcin-wiacek@topnet.pl</a>
+<p>Gnokii
+<br><a href="http://www.gnokii.org/">http://www.gnokii.org</a>
+<br><a href="ftp://urtica.linuxnews.pl/pub/people/pkot/gnokii/">ftp://urtica.linuxnews.pl/pub/people/pkot/gnokii/</a>
+<br><a href="mailto:pkot@linuxnews.pl">pkot@linuxnews.pl</a>
+<p>GSMLib
+<br><a href="http://www.pxh.de/fs/gsmlib/">http://www.pxh.de/fs/gsmlib/</a>
+<p>Kable
+<br><a href="http://www.fkn.pl/varia/kable.html">http://www.fkn.pl/varia/kable.html</a>
+<br><a href="http://www.atrox.at/datacable/">http://www.atrox.at/datacable/</a>
+<p>Specyfikacje GSM
+<br><a href="http://www.etsi.org/">http://www.etsi.org</a>
+<p>Windows & Nokia
+<p>Oxygen Phone Manager: <u><a href="http://www.oxygensoftware.com/">http://www.oxygensoftware.com</a></u>
+<br>ActiveX dla Nokii: <u><a href="http://www.gertjaap.com/">http://www.gertjaap.com/</a></u>
+<br>Logo Manager: <u><a href="http://www.logomanager.co.uk/">http://www.logomanager.co.uk</a></u>
+
+<p><a class="shref" href="#Top"><small><em>Na pocz±tek</em></small></a>
+
+</body>
+</html>
--- /dev/null
+<HTML>
+<STYLE TYPE="text/css">
+<!-- styles from www.fkn.pl -->
+<!-- changed to page of Marcin Wiacek (www.marcin-wiacek.topnet.pl) -->
+<!--
+
+@media print {font.drukuj {display:none}}
+@media print {a.autoremail:hover,a.autoremail:active,a.shref:hover,a.shref:active,a.dzial:hover,a.dzial:active,a:hover,a:active {text-decoration:none; color:#525FF5}}
+@media print {a.autoremail:hover,a.autoremail:active,a.dzial:hover,a.dzial:active {font-weight:normal}}
+@media print {a.shref:hover,a.shref:active,a:hover,a:active {font-weight:bold}}
+
+B {font-weight:bold}
+TT {font-family:Courier}
+
+BODY {text-align: justify; margin-left: 10pt; margin-right: 10pt; margin-top: 0pt; margin-bottom: 0pt; background: #ffffff; font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#2B2B69}
+H1, H2, H3 {font-family: Arial, Helvetica; font-weight: bolder; text-decoration: none; color:#2B2B69}
+TABLE, TR, TD, UL, OL, LI, P, BLOCKQUOTE {font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#2B2B69}
+a {font-family: Arial, Helvetica; font-weight: bold; text-decoration: none; color:#525FF5}
+a:hover {font-weight: bolder; text-decoration: underline; color:#1F409F}
+a:active {font-weight: bolder; text-decoration: underline; color:#2FA030}
+
+font.tytul {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#004080}
+
+font.podtytul {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#FF0000}
+a.podtytul {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#FF0000}
+
+font.dzial {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#1F409F}
+a.dzial {font-family: Verdana, Tahoma, Arial, Helvetica; font-weight: bold; text-decoration: none; color:#525FF5}
+a.dzial:hover {font-weight: bolder; text-decoration: underline}
+a.dzial:active {font-weight: bolder; text-decoration: underline}
+
+a.shref {font-family: Arial, Helvetica; font-weight: bold; text-decoration: none; color:#525FF5}
+a.shref:hover {font-weight: bolder; text-decoration: underline}
+a.shref:active {font-weight: bolder; text-decoration: underline}
+
+font.autor {font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#2B2B69}
+a.autoremail {font-family: Arial, Helvetica; font-weight: normal; text-decoration: none; color:#525FF5}
+a.autoremail:hover {font-weight: bolder; text-decoration: underline; color:#1F409F}
+a.autoremail:active {font-weight: bolder; text-decoration: underline; color:#2FA030}
+
+font.glowna1 {font-family: Comic Sans MS; font-weight: normal; text-decoration: none; color:#004080}
+font.glowna2 {font-family: Tahoma; font-weight: bold; text-decoration: none; color:#FF6666}
+
+-->
+</STYLE>
+</HTML>
--- /dev/null
+# Add these to magic file (located in /etc or /usr/share/misc)
+# to let the file command recognize NOL and NGG files
+#
+# Pawe³ Kot <pkot@linuxnews.pl>
+# Based on the gnokii (http://www.gnokii.org/) sources
+
+# GSM Operator Logos - NOL
+0 string NOL GSM Operator Logo, NOL format
+>10 byte x (size %d x
+>12 byte x %d)
+# GSM Caller Icons - NGG
+0 string NGG GSM Caller Icon, NGG format
+>6 byte x (size %d x
+>8 byte x %d)
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#ifndef WIN32
+ #include "devices/unixserial.h"
+ #include "devices/unixirda.h"
+ #include "devices/tekram.h"
+ #include <sys/ioctl.h>
+ #include <pthread.h>
+ #include <termios.h>
+ #include <signal.h>
+ #include <errno.h>
+#else
+ #include <windows.h>
+ #include "devices/winserial.h"
+#endif
+
+#include "gsm-api.h"
+#include "devices/device.h"
+
+#include <string.h>
+
+#ifdef VC6
+ /* for VC6 make scripts save VERSION constant in mversion.h file */
+ #include "mversion.h"
+#endif
+
+char PortDevice[GSM_MAX_DEVICE_NAME_LENGTH]={0x00};
+
+bool duringwrite;
+
+#ifndef WIN32
+
+//pthread_t Thread;
+#if defined(__svr4__) || defined(__FreeBSD__)
+ pthread_t selThread;
+#endif
+
+int device_portfd = -1;
+
+/*
+ * Structure to store the filedescriptor we use.
+ *
+ */
+int device_getfd(void)
+{
+ return device_portfd;
+}
+
+int device_open(__const char *__file, int __with_odd_parity) {
+
+ switch (CurrentConnectionType) {
+ case GCT_Tekram:
+ device_portfd = tekram_open(__file);
+ break;
+ case GCT_Irda:
+ device_portfd = irda_open();
+ break;
+ default:
+ device_portfd = serial_opendevice(__file, __with_odd_parity, true, false);
+ break;
+ }
+
+ return (device_portfd >= 0);
+}
+
+void device_close(void)
+{
+ AppendLogText("CLOSE\n",false);
+
+ /* Now wait for thread to terminate. */
+ //pthread_join(Thread, NULL);
+
+ switch (CurrentConnectionType) {
+ case GCT_Tekram: tekram_close(device_portfd); break;
+ case GCT_Irda : irda_close(device_portfd); break;
+ default : serial_close(device_portfd); break;
+ }
+
+ PortDevice[0]=0x00;
+}
+
+void device_reset(void) {
+}
+
+void device_setdtrrts(int __dtr, int __rts)
+{
+ switch (CurrentConnectionType) {
+ case GCT_Tekram:
+ case GCT_Irda:
+ break;
+ default:
+ serial_setdtrrts(device_portfd, __dtr, __rts);
+#ifdef DEBUG
+ device_dumpserial();
+#endif
+ break;
+ }
+}
+
+void device_changespeed(int __speed)
+{
+ switch (CurrentConnectionType) {
+ case GCT_Irda:
+ break;
+ case GCT_Tekram:
+ tekram_changespeed(device_portfd, __speed);
+ break;
+ default:
+ serial_changespeed(device_portfd, __speed);
+#ifdef DEBUG
+ fprintf(stdout,_("Serial device: changing speed to %i\n"),__speed);
+#endif
+ break;
+ }
+}
+
+size_t device_read(__ptr_t __buf, size_t __nbytes)
+{
+ switch (CurrentConnectionType) {
+ case GCT_Tekram: return (tekram_read(device_portfd, __buf, __nbytes)); break;
+ case GCT_Irda : return ( irda_read(device_portfd, __buf, __nbytes)); break;
+ default : return (serial_read(device_portfd, __buf, __nbytes)); break;
+ }
+}
+
+size_t device_write(__const __ptr_t __buf, size_t __n) {
+ u8 buffer[300];
+ size_t mysize;
+
+ while (duringwrite) {}
+
+ memcpy(buffer,__buf,__n);
+ AppendLog(buffer,__n,true);
+
+ duringwrite=true;
+ switch (CurrentConnectionType) {
+ case GCT_Irda : mysize = irda_write(device_portfd, __buf, __n); break;
+ case GCT_Tekram: mysize = tekram_write(device_portfd, __buf, __n); break;
+ default : mysize = serial_write(device_portfd, __buf, __n); break;
+ }
+ duringwrite=false;
+ return mysize;
+}
+
+#ifdef DEBUG
+void device_dumpserial(void)
+{
+ int PortFD;
+ unsigned int Flags=0;
+
+ PortFD = device_getfd();
+
+ ioctl(PortFD, TIOCMGET, &Flags);
+
+ fprintf(stdout, _("Serial device:"));
+ fprintf(stdout, _(" DTR is %s"), Flags&TIOCM_DTR?_("up"):_("down"));
+ fprintf(stdout, _(", RTS is %s"), Flags&TIOCM_RTS?_("up"):_("down"));
+ fprintf(stdout, _(", CAR is %s"), Flags&TIOCM_CAR?_("up"):_("down"));
+ fprintf(stdout, _(", CTS is %s\n"), Flags&TIOCM_CTS?_("up"):_("down"));
+}
+#endif /* DEBUG */
+
+void SigHandler(int status)
+{
+
+ unsigned char buffer[2048];
+
+ int count, res;
+
+ res = device_read(buffer, 255);
+
+ for (count = 0; count < res ; count ++) {
+ Protocol->StateMachine(buffer[count]);
+ }
+}
+
+
+#if defined(__svr4__) || defined(__FreeBSD__)
+/* thread for handling incoming data */
+void SelectLoop() {
+ int err;
+ fd_set readfds;
+ struct timeval timeout;
+
+ FD_ZERO(&readfds);
+ FD_SET(device_portfd,&readfds);
+ /* set timeout to 15 seconds */
+ timeout.tv_sec=15;
+ timeout.tv_usec=0;
+ while (!CurrentRequestTerminate) {
+ err=select(device_portfd+1,&readfds,NULL,NULL,&timeout);
+ if ( err > 0 ) {
+ /* call singal handler to process incoming data */
+ SigHandler(0);
+ /* refresh timeout, just for linux :-( */
+ /* required for irda */
+ timeout.tv_sec=15;
+ } else {
+ if (err == -1)
+ perror("Error in SelectLoop");
+ }
+ }
+}
+#endif
+
+bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionType con)
+{
+ int result;
+
+ char text[100];
+
+#if defined(__svr4__) || defined(__FreeBSD__)
+ int rtn;
+#else
+ struct sigaction sig_io;
+#endif
+
+#ifdef DEBUG
+ if ((strstr(GSM_Info->IrdaModels,"decode")!=NULL) && (CurrentConnectionType == GCT_Irda))
+ {
+ printf("DEBUG and Irda decode Model -> not realy open ;-)\n");
+ return true;
+ }
+#endif
+
+ if (PortDevice[0]!=0x00) return true;
+
+ duringwrite=false;
+
+ strncpy(PortDevice, port_device, GSM_MAX_DEVICE_NAME_LENGTH);
+
+#ifdef DEBUG
+ fprintf(stdout,_("Opening \"%s\" device...\n"),PortDevice);
+#endif
+
+ strcpy(text,"\n\n\nMygnokii ");
+ sprintf(text+strlen(text), "%s",VERSION);
+ strcpy(text+strlen(text),"\n");
+ AppendLogText(text,false);
+
+ strcpy(text,"Port ");
+ strcpy(text+strlen(text),PortDevice);
+ strcpy(text+strlen(text),"\n");
+ AppendLogText(text,false);
+
+ strcpy(text,"Connection ");
+ switch (con) {
+ case GCT_FBUS :strcpy(text+strlen(text),"FBUS");break;
+ case GCT_Infrared:strcpy(text+strlen(text),"infrared");break;
+ case GCT_Irda :strcpy(text+strlen(text),"irda sockets");break;
+ case GCT_MBUS :strcpy(text+strlen(text),"MBUS");break;
+ case GCT_DLR3 :strcpy(text+strlen(text),"DLR3");break;
+ case GCT_Tekram :strcpy(text+strlen(text),"Tekram");break;
+ case GCT_AT :strcpy(text+strlen(text),"AT");break;
+ default :strcpy(text+strlen(text),"unknown");break;
+ }
+ strcpy(text+strlen(text),"\n");
+ AppendLogText(text,false);
+
+ /* Ralf Thelen: In this moment there is NO method of communication,
+ which require keepalive packets and GSM->KeepAlive is
+ always NULL_KeepAlive, I comment this thread, */
+
+ /* Create and start main thread. */
+// rtn = pthread_create(&Thread, NULL,(void*)GSM->KeepAlive, (void *)NULL);
+//
+// if (rtn != 0) {
+// fprintf(stdout,_("Error\n"));
+// return false;
+// }
+
+#if defined(__svr4__) || defined(__FreeBSD__)
+#else
+ /* Set up and install handler before enabling async IO on port. */
+ sig_io.sa_handler = SigHandler;
+ sig_io.sa_flags = 0;
+ sigaction (SIGIO, &sig_io, NULL);
+#endif
+
+ /* Open device. */
+ result = device_open(PortDevice, with_odd_parity);
+
+ if (!result) {
+ fprintf(stdout,_("Error\n"));
+ return false;
+ }
+
+#if defined(__svr4__) || defined(__FreeBSD__)
+ /* create a thread to handle incoming data from mobile phone */
+ rtn=pthread_create(&selThread,NULL,(void*)SelectLoop,(void*)NULL);
+ if (rtn != 0) {
+ fprintf(stdout,_("Error\n"));
+ return false;
+ }
+#endif
+
+ return true;
+}
+
+/* ---------------- RTH: #ifdef WIN32 ------------------ */
+
+#else
+
+ extern HANDLE hPhone;
+
+void device_close(void)
+{
+ AppendLogText("CLOSE\n",false);
+
+ CloseConnection();
+
+ PortDevice[0]=0x00;
+}
+
+#ifdef DEBUG
+void device_dumpserial(void)
+{
+ DCB dcb;
+
+ dcb.DCBlength = sizeof(DCB);
+ GetCommState(hPhone, &dcb);
+
+ fprintf(stdout, _("Serial device:"));
+ fprintf(stdout, _(" DTR is "));
+ switch (dcb.fDtrControl) {
+ case DTR_CONTROL_ENABLE : fprintf(stdout, _("up")); break;
+ case DTR_CONTROL_DISABLE : fprintf(stdout, _("down")); break;
+ case DTR_CONTROL_HANDSHAKE: fprintf(stdout, _("handshake"));break;
+ }
+ fprintf(stdout, _(", RTS is "));
+ switch (dcb.fRtsControl) {
+ case RTS_CONTROL_ENABLE : fprintf(stdout, _("up\n")); break;
+ case RTS_CONTROL_DISABLE : fprintf(stdout, _("down\n")); break;
+ case RTS_CONTROL_HANDSHAKE: fprintf(stdout, _("handshake\n"));break;
+ case RTS_CONTROL_TOGGLE : fprintf(stdout, _("toggle\n")); break;
+ }
+}
+#endif /* DEBUG */
+
+void device_setdtrrts(int __dtr, int __rts)
+{
+ DCB dcb;
+
+ dcb.DCBlength = sizeof(DCB);
+ GetCommState(hPhone, &dcb);
+
+ if (__dtr==1) dcb.fDtrControl = DTR_CONTROL_ENABLE;
+ else dcb.fDtrControl = DTR_CONTROL_DISABLE;
+
+ if (__rts==1) dcb.fRtsControl = RTS_CONTROL_ENABLE;
+ else dcb.fRtsControl = RTS_CONTROL_DISABLE;
+
+ SetCommState(hPhone, &dcb);
+
+#ifdef DEBUG
+ device_dumpserial();
+#endif
+}
+
+void device_changespeed(int __speed)
+{
+
+ DCB dcb;
+
+ dcb.DCBlength = sizeof(DCB);
+ GetCommState(hPhone, &dcb);
+
+ switch (__speed) {
+ case 115200: dcb.BaudRate=CBR_115200; break;
+ case 19200 : dcb.BaudRate=CBR_19200; break;
+ case 9600 : dcb.BaudRate=CBR_9600; break;
+ }
+
+ SetCommState(hPhone, &dcb);
+
+#ifdef DEBUG
+ fprintf(stdout,_("Serial device: changing speed to %i\n"),__speed);
+#endif
+}
+
+bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionType con)
+{
+ DCB dcb;
+ char text[100];
+
+ int rtn;
+
+ if (PortDevice[0]!=0x00) return true;
+
+ duringwrite=false;
+ strncpy(PortDevice, port_device, GSM_MAX_DEVICE_NAME_LENGTH);
+
+#ifdef DEBUG
+ fprintf(stdout,_("Opening \"%s\" device...\n"),PortDevice);
+#endif
+
+ strcpy(text,"\n\n\nMygnokii ");
+ sprintf(text+strlen(text), "%s",VERSION);
+ strcpy(text+strlen(text),"\n");
+ AppendLogText(text,false);
+
+ strcpy(text,"Port ");
+ strcpy(text+strlen(text),PortDevice);
+ strcpy(text+strlen(text),"\n");
+ AppendLogText(text,false);
+
+ strcpy(text,"Connection ");
+ switch (con) {
+ case GCT_FBUS :strcpy(text+strlen(text),"FBUS");break;
+ case GCT_Infrared:strcpy(text+strlen(text),"infrared");break;
+ case GCT_Irda :strcpy(text+strlen(text),"irda sockets");break;
+ case GCT_MBUS :strcpy(text+strlen(text),"MBUS");break;
+ case GCT_DLR3 :strcpy(text+strlen(text),"DLR3");break;
+ case GCT_Tekram :strcpy(text+strlen(text),"Tekram");break;
+ case GCT_AT :strcpy(text+strlen(text),"AT");break;
+ default :strcpy(text+strlen(text),"unknown");break;
+ }
+ strcpy(text+strlen(text),"\n");
+ AppendLogText(text,false);
+
+ CurrentDisableKeepAlive = true;
+
+ /* Create and start main thread. */
+ rtn = ! OpenConnection(PortDevice, Protocol->StateMachine, GSM->KeepAlive);
+
+ if (rtn != 0) {
+
+ fprintf(stdout,_("Error\n"));
+ return false;
+ } else {
+ CurrentDisableKeepAlive = false;
+ }
+
+ if (with_odd_parity) {
+ dcb.DCBlength = sizeof(DCB);
+ GetCommState(hPhone, &dcb);
+
+ dcb.Parity=ODDPARITY;
+
+ SetCommState(hPhone, &dcb);
+ }
+
+ return true;
+}
+
+size_t device_write(const __ptr_t __buf, size_t __n) {
+ int i;
+ while (duringwrite) {}
+ duringwrite=true;
+ AppendLog(__buf,__n,true);
+ i=WriteCommBlock(__buf,__n);
+ duringwrite=false;
+ if (i) return __n; else return 0;
+}
+
+#endif /*WIN32*/
--- /dev/null
+/*
+ * serial interface threads for gnokii on win32
+ * Based on the MS sample program 'tty.c'
+ *
+ * Roger Willcocks 16 Sept 99
+ *
+ * compile with:
+ * cl -Zi -DWIN32 -DVERSION=\"win32\" -DMODEL=\"6110\" -DPORT=\"COM1\" \
+ * gnokii.c winserial.c fbus-6110.c getopt.c gsm-api.c fbus-6110-auth.c \
+ * fbus-6110-ringtones.c gsm-networks.c cfgreader.c
+ */
+
+#ifdef WIN32
+
+#define USECOMM // yes, we need the COMM API
+
+#include <windows.h>
+#include <string.h>
+#include <stdio.h>
+#include <io.h>
+#include <memory.h>
+
+#include "devices/winserial.h"
+
+#define sleep(x) Sleep((x) * 1000)
+#define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
+
+#define BAUDRATE CBR_115200
+
+DWORD FAR PASCAL CommWatchProc(LPSTR lpData);
+DWORD FAR PASCAL KeepAliveProc(LPSTR lpData);
+BOOL SetupConnection();
+#define MAXBLOCK 1024
+
+//---------------------------------------------------------------------------
+// BOOL OpenConnection(char *szPort)
+//
+// Description:
+// Opens communication port.
+// It also sets the CommState and notifies the window via
+// the fConnected flag.
+//
+// Parameters:
+// - szPort - name of com port eg "com1"
+//
+//---------------------------------------------------------------------------
+
+OVERLAPPED osWrite, osRead;
+HANDLE hPhone, hThread, hKAThread;
+BOOL isConnected;
+DWORD ThreadID, KAThreadID;
+
+BOOL OpenConnection(char *szPort, sigcallback fn, keepalive ka)
+{
+ BOOL fRetVal;
+ HANDLE hCommWatchThread;
+ DWORD dwThreadID;
+ COMMTIMEOUTS CommTimeOuts;
+
+ if ((hPhone =
+ CreateFile(szPort, GENERIC_READ | GENERIC_WRITE,
+ 0, // exclusive access
+ NULL, // no security attrs
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL |
+ FILE_FLAG_OVERLAPPED, // overlapped I/O
+ NULL)) == (HANDLE) -1)
+ return (FALSE);
+ else {
+ // get any early notifications
+
+ SetCommMask(hPhone, EV_RXCHAR);
+
+ // setup device buffers
+
+ SetupComm(hPhone, 4096, 4096);
+
+ // purge any information in the buffer
+
+ PurgeComm(hPhone, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+
+ // set up for overlapped I/O
+
+ CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF;
+ CommTimeOuts.ReadTotalTimeoutMultiplier = 0;
+ CommTimeOuts.ReadTotalTimeoutConstant = 1000;
+#if 0
+ // CBR_9600 is approximately 1byte/ms. For our purposes, allow
+ // double the expected time per character for a fudge factor.
+ CommTimeOuts.WriteTotalTimeoutMultiplier = 2*CBR_9600/BAUDRATE;
+#else
+ CommTimeOuts.WriteTotalTimeoutMultiplier = 10;
+#endif
+ CommTimeOuts.WriteTotalTimeoutConstant = 0;
+ SetCommTimeouts(hPhone, &CommTimeOuts);
+ }
+
+ fRetVal = SetupConnection();
+
+ if (fRetVal) {
+ isConnected = TRUE;
+
+ // Create a secondary thread to issue keepAlive packets
+
+/* Marcin Wiacek. In this moment there is NO method of communication,
+ which require keepalive packets. I comment this thread, because it
+ makes only CPU time (100%) and makes it more hot */
+// hKAThread = CreateThread((LPSECURITY_ATTRIBUTES) NULL,
+// 0,
+// (LPTHREAD_START_ROUTINE) KeepAliveProc,
+// (LPVOID) ka,
+// 0, &KAThreadID );
+// if (!hKAThread)
+// {
+// isConnected = FALSE;
+// CloseHandle(hPhone);
+// return FALSE;
+// }
+
+ // Create a secondary thread
+ // to watch for an event.
+
+ hCommWatchThread = CreateThread((LPSECURITY_ATTRIBUTES) NULL,
+ 0,
+ (LPTHREAD_START_ROUTINE) CommWatchProc,
+ (LPVOID) fn,
+ 0, &dwThreadID);
+ if (!hCommWatchThread)
+ {
+ isConnected = FALSE;
+ CloseHandle(hPhone);
+ fRetVal = FALSE;
+ }
+ else {
+ ThreadID = dwThreadID;
+ hThread = hCommWatchThread;
+
+ // assert DTR
+
+ EscapeCommFunction(hPhone, SETDTR);
+ }
+ }
+ else {
+ isConnected = FALSE;
+ CloseHandle(hPhone);
+ }
+
+ return (fRetVal);
+
+} // end of OpenConnection()
+
+//---------------------------------------------------------------------------
+// BOOL SetupConnection()
+//
+// Description:
+// This routines sets up the DCB based on settings in the
+// TTY info structure and performs a SetCommState().
+//
+// Parameters:
+//
+//---------------------------------------------------------------------------
+
+BOOL SetupConnection()
+{
+ BOOL fRetVal;
+ DCB dcb;
+
+ dcb.DCBlength = sizeof(DCB);
+
+ GetCommState(hPhone, &dcb);
+
+ dcb.BaudRate = BAUDRATE;
+ dcb.ByteSize = 8;
+ dcb.Parity = NOPARITY;
+ dcb.StopBits = ONESTOPBIT;
+
+ // set DTS
+
+ dcb.fOutxDsrFlow = 0;
+ dcb.fDtrControl = DTR_CONTROL_ENABLE;
+
+ // clear RTS
+
+ dcb.fOutxCtsFlow = 0;
+ dcb.fRtsControl = RTS_CONTROL_DISABLE;
+
+ // no software flow control
+
+ dcb.fInX = dcb.fOutX = 0;
+
+ fRetVal = SetCommState(hPhone, &dcb);
+
+ if (fRetVal == 0)
+ fRetVal = GetLastError();
+
+ return (fRetVal);
+
+} // end of SetupConnection()
+
+//---------------------------------------------------------------------------
+// BOOL CloseConnection()
+//
+// Description:
+// Closes the connection to the port. Resets the connect flag
+//
+// Parameters:
+//
+//---------------------------------------------------------------------------
+
+BOOL CloseConnection()
+{
+ isConnected = FALSE;
+
+ // block until keepalive thread terminates (should wake it really)
+
+/* Marcin Wiacek. In this moment there is NO method of communication,
+ which require keepalive packets. I comment this thread, because it
+ makes only CPU time (100%) and makes it more hot */
+// WaitForSingleObject( hKAThread, INFINITE );
+#ifdef _NEVER_SAY_NEVER_AGAIN_
+// while (KAThreadID != 0)
+// Sleep(250);
+#endif
+
+ // disable event notification and wait for thread
+ // to halt
+
+ SetCommMask(hPhone, 0);
+
+ // block until thread has been halted
+
+ WaitForSingleObject( hThread, INFINITE );
+#ifdef _NEVER_SAY_NEVER_AGAIN_
+ while(ThreadID != 0)
+ Sleep(250);
+#endif
+
+ // drop DTR
+
+ EscapeCommFunction(hPhone, CLRDTR);
+
+ // purge any outstanding reads/writes and close device handle
+
+ PurgeComm(hPhone, PURGE_TXABORT | PURGE_RXABORT |
+ PURGE_TXCLEAR | PURGE_RXCLEAR);
+
+ CloseHandle(hPhone);
+ return (TRUE);
+
+} // end of CloseConnection()
+
+//---------------------------------------------------------------------------
+// int ReadCommBlock(LPSTR lpszBlock, int nMaxLength)
+//
+// Description:
+// Reads a block from the COM port and stuffs it into
+// the provided buffer.
+//
+// Parameters:
+//
+// LPSTR lpszBlock
+// block used for storage
+//
+// int nMaxLength
+// max length of block to read
+//
+//---------------------------------------------------------------------------
+
+int ReadCommBlock(LPSTR lpszBlock, int nMaxLength)
+{
+ BOOL fReadStat;
+ COMSTAT ComStat;
+ DWORD dwErrorFlags;
+ DWORD dwLength;
+ DWORD dwError;
+
+ // only try to read number of bytes in queue
+ ClearCommError(hPhone, &dwErrorFlags, &ComStat);
+ dwLength = min((DWORD) nMaxLength, ComStat.cbInQue);
+
+ if (dwLength > 0) {
+ fReadStat = ReadFile(hPhone, lpszBlock,
+ dwLength, &dwLength, &osRead);
+ if (!fReadStat) {
+ if (GetLastError() == ERROR_IO_PENDING) {
+ fprintf(stderr, "\n\rIO Pending");
+ // We have to wait for read to complete.
+ // This function will timeout according to the
+ // CommTimeOuts.ReadTotalTimeoutConstant variable
+ // Every time it times out, check for port errors
+ while(!GetOverlappedResult(hPhone,
+ &osRead, &dwLength, TRUE)) {
+ dwError = GetLastError();
+ if(dwError == ERROR_IO_INCOMPLETE)
+ // normal result if not finished
+ continue;
+ else {
+ // an error occurred, try to recover
+ fprintf(stderr, "<CE-%u>", dwError);
+ ClearCommError(hPhone, &dwErrorFlags, &ComStat);
+ if (dwErrorFlags > 0)
+ fprintf(stderr, "<CE-%u>", dwErrorFlags);
+ break;
+ }
+
+ }
+
+ }
+ else {
+ // some other error occurred
+ dwLength = 0;
+ ClearCommError(hPhone, &dwErrorFlags, &ComStat);
+ if (dwErrorFlags > 0)
+ fprintf(stderr, "<CE-%u>", dwErrorFlags);
+ }
+ }
+ }
+
+ return (dwLength);
+
+} // end of ReadCommBlock()
+
+//---------------------------------------------------------------------------
+// BOOL WriteCommBlock(BYTE *pByte, DWORD dwBytesToWrite)
+//
+// Description:
+// Writes a block of data to the COM port specified in the associated
+// TTY info structure.
+//
+// Parameters:
+//
+// BYTE *pByte
+// pointer to data to write to port
+//
+//---------------------------------------------------------------------------
+
+BOOL WriteCommBlock(LPSTR lpByte , DWORD dwBytesToWrite)
+{
+
+ BOOL fWriteStat;
+ DWORD dwBytesWritten;
+ DWORD dwErrorFlags;
+ DWORD dwError;
+ DWORD dwBytesSent=0;
+ COMSTAT ComStat;
+
+ fWriteStat = WriteFile(hPhone, lpByte, dwBytesToWrite,
+ &dwBytesWritten, &osWrite);
+
+ // Note that normally the code will not execute the following
+ // because the driver caches write operations. Small I/O requests
+ // (up to several thousand bytes) will normally be accepted
+ // immediately and WriteFile will return true even though an
+ // overlapped operation was specified
+
+ if (!fWriteStat) {
+ if(GetLastError() == ERROR_IO_PENDING) {
+ // We should wait for the completion of the write operation
+ // so we know if it worked or not
+
+ // This is only one way to do this. It might be beneficial to
+ // place the write operation in a separate thread
+ // so that blocking on completion will not negatively
+ // affect the responsiveness of the UI
+
+ // If the write takes too long to complete, this
+ // function will timeout according to the
+ // CommTimeOuts.WriteTotalTimeoutMultiplier variable.
+ // This code logs the timeout but does not retry
+ // the write.
+
+ while(!GetOverlappedResult(hPhone,
+ &osWrite, &dwBytesWritten, TRUE)) {
+ dwError = GetLastError();
+ if(dwError == ERROR_IO_INCOMPLETE)
+ {
+ // normal result if not finished
+ dwBytesSent += dwBytesWritten;
+ continue;
+ }
+ else {
+ // an error occurred, try to recover
+ fprintf(stderr, "<CE-%u>", dwError);
+ ClearCommError(hPhone, &dwErrorFlags, &ComStat);
+ if (dwErrorFlags > 0)
+ fprintf(stderr, "<CE-%u>", dwErrorFlags);
+ break;
+ }
+ }
+
+ dwBytesSent += dwBytesWritten;
+#if 0
+ if(dwBytesSent != dwBytesToWrite)
+ fprintf(stderr, "\nProbable Write Timeout: Total of %ld bytes sent (%ld)", dwBytesSent, dwBytesToWrite);
+ else
+ fprintf(stderr, "\n%ld bytes written", dwBytesSent);
+#endif
+ }
+ else {
+ // some other error occurred
+ ClearCommError(hPhone, &dwErrorFlags, &ComStat);
+ if (dwErrorFlags > 0)
+ fprintf(stderr, "<CE-%u>", dwErrorFlags);
+ return (FALSE);
+ }
+ }
+ return (TRUE);
+
+} // end of WriteCommBlock()
+
+
+//************************************************************************
+// DWORD FAR PASCAL CommWatchProc(LPSTR lpData)
+//
+// Description:
+// A secondary thread that will watch for COMM events.
+//
+// Parameters:
+// LPSTR lpData
+// 32-bit pointer argument
+//
+//************************************************************************
+
+DWORD FAR PASCAL CommWatchProc(LPSTR lpData)
+{
+ DWORD dwEvtMask;
+ OVERLAPPED os;
+ int nLength;
+ BYTE abIn[ MAXBLOCK + 1];
+
+ sigcallback fn = (sigcallback)lpData;
+
+ memset(&os, 0, sizeof(OVERLAPPED));
+
+ // create I/O event used for overlapped read
+
+ os.hEvent = CreateEvent(NULL, // no security
+ TRUE, // explicit reset req
+ FALSE, // initial event reset
+ NULL); // no name
+ if (os.hEvent == NULL)
+ return (FALSE);
+
+ if (!SetCommMask(hPhone, EV_RXCHAR))
+ return (FALSE);
+
+ while (isConnected) {
+ dwEvtMask = 0;
+
+ WaitCommEvent(hPhone, &dwEvtMask, NULL);
+
+ if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR) {
+ do {
+ if ((nLength = ReadCommBlock((LPSTR) abIn, MAXBLOCK))) {
+ int i;
+
+ for (i = 0; i < nLength; i++)
+ (*fn)(abIn[i]);
+ }
+ }
+ while (nLength > 0);
+ }
+ }
+
+ // get rid of event handle
+
+ CloseHandle(os.hEvent);
+
+ // clear information in structure (kind of a "we're done flag")
+
+ ThreadID = 0;
+ hThread = NULL;
+
+ return(TRUE);
+
+} // end of CommWatchProc()
+
+
+DWORD FAR PASCAL KeepAliveProc(LPSTR lpData)
+{
+/* Marcin Wiacek. In this moment there is NO method of communication,
+ which require keepalive packets. I comment this thread, because it
+ makes only CPU time (100%) and makes it more hot */
+// keepalive ka = (keepalive)lpData;
+// while (isConnected)
+// (*ka)();
+// KAThreadID = 0;
+ return 0;
+}
+
+#endif
+/* end */
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Config file (/etc/gnokiirc and ~/.gnokiirc) reader.
+
+ Modified from code by Tim Potter.
+
+*/
+
+#include "misc.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#if __unices__
+# include <strings.h>
+#endif
+#include <ctype.h>
+#include <errno.h>
+
+#include "files/cfgreader.h"
+
+/* Read configuration information from a ".INI" style file */
+struct CFG_Header *CFG_ReadFile(char *filename)
+{
+ FILE *handle;
+ char *line;
+ char *buf;
+ struct CFG_Header *cfg_info = NULL, *cfg_head = NULL;
+
+ /* Error check */
+ if (filename == NULL) {
+ return NULL;
+ }
+
+ /* Initialisation */
+ if ((buf = (char *)malloc(255)) == NULL) {
+ return NULL;
+ }
+
+ /* Open file */
+ if ((handle = fopen(filename, "r")) == NULL) {
+#ifdef DEBUG
+ fprintf( stderr, "CFG_ReadFile - open %s: %s\n", filename, strerror(errno));
+#endif /* DEBUG */
+ return NULL;
+ }
+#ifdef DEBUG
+ else
+ fprintf( stderr, "Opened configuration file %s\n", filename );
+#endif /* DEBUG */
+
+ /* Iterate over lines in the file */
+ while (fgets(buf, 255, handle) != NULL) {
+
+ line = buf;
+
+ /* Strip leading, trailing whitespace */
+ while(isspace((int) *line))
+ line++;
+
+ while((strlen(line) > 0) && isspace((int) line[strlen(line) - 1]))
+ line[strlen(line) - 1] = '\0';
+
+ /* Ignore blank lines and comments */
+ if ((*line == '\n') || (*line == '\0') || (*line == '#'))
+ continue;
+
+ /* Look for "headings" enclosed in square brackets */
+ if ((line[0] == '[') && (line[strlen(line) - 1] == ']')) {
+ struct CFG_Header *heading;
+
+ /* Allocate new heading entry */
+ if ((heading = (struct CFG_Header *)malloc(sizeof(*heading))) == NULL) {
+ return NULL;
+ }
+
+ /* Fill in fields */
+ memset(heading, '\0', sizeof(*heading));
+
+ line++;
+ line[strlen(line) - 1] = '\0';
+
+ /* FIXME: strdup is not ANSI C compliant. */
+ heading->section = strdup(line);
+
+ /* Add to tail of list */
+ heading->prev = cfg_info;
+
+ if (cfg_info != NULL) {
+ cfg_info->next = heading;
+ } else {
+ /* Store copy of head of list for return value */
+ cfg_head = heading;
+ }
+
+ cfg_info = heading;
+
+#ifdef DEBUG
+ fprintf(stderr, "Added new section %s\n", heading->section);
+#endif
+ /* Go on to next line */
+
+ continue;
+ }
+
+ /* Process key/value line */
+
+ if ((strchr(line, '=') != NULL) && cfg_info != NULL) {
+ struct CFG_Entry *entry;
+ char *value;
+
+ /* Allocate new entry */
+ if ((entry = (struct CFG_Entry *)malloc(sizeof(*entry))) == NULL) {
+ return NULL;
+ }
+
+ /* Fill in fields */
+ memset(entry, '\0', sizeof(*entry));
+
+ value = strchr(line, '=');
+ *value = '\0'; /* Split string */
+ value++;
+
+ while(isspace((int) *value)) { /* Remove leading white */
+ value++;
+ }
+
+ entry->value = strdup(value);
+
+ while((strlen(line) > 0) && isspace((int) line[strlen(line) - 1])) {
+ line[strlen(line) - 1] = '\0'; /* Remove trailing white */
+ }
+
+ /* FIXME: strdup is not ANSI C compliant. */
+ entry->key = strdup(line);
+
+ /* Add to head of list */
+
+ entry->next = cfg_info->entries;
+
+ if (cfg_info->entries != NULL) {
+ cfg_info->entries->prev = entry;
+ }
+
+ cfg_info->entries = entry;
+
+#ifdef DEBUG
+ fprintf(stderr, "Adding key/value %s/%s\n", entry->key, entry->value);
+#endif
+ /* Go on to next line */
+ continue;
+ }
+
+ /* Line not part of any heading */
+ fprintf(stderr, "Orphaned line: %s\n", line);
+ }
+
+ /* Return pointer to configuration information */
+ return cfg_head;
+}
+
+/* Write configuration information to a config file */
+
+int CFG_WriteFile(struct CFG_Header *cfg, char *filename)
+{
+ /* Not implemented - tricky to do and preserve comments */
+
+ return 0;
+}
+
+/*
+ * Find the value of a key in a config file. Return value associated
+ * with key or NULL if no such key exists.
+ */
+
+char *CFG_Get(struct CFG_Header *cfg, char *section, char *key)
+{
+ struct CFG_Header *h;
+ struct CFG_Entry *e;
+
+ if ((cfg == NULL) || (section == NULL) || (key == NULL)) {
+ return NULL;
+ }
+
+ /* Search for section name */
+ for (h = cfg; h != NULL; h = h->next) {
+ if (strcmp(section, h->section) == 0) {
+ /* Search for key within section */
+ for (e = h->entries; e != NULL; e = e->next) {
+ if (strcmp(key, e->key) == 0) {
+ /* Found! */
+ return e->value;
+ }
+ }
+ }
+ }
+ /* Key not found in section */
+ return NULL;
+}
+
+/* Set the value of a key in a config file. Return the new value if
+ the section/key can be found, else return NULL. */
+
+char *CFG_Set(struct CFG_Header *cfg, char *section, char *key,
+ char *value)
+{
+ struct CFG_Header *h;
+ struct CFG_Entry *e;
+
+ if ((cfg == NULL) || (section == NULL) || (key == NULL) ||
+ (value == NULL)) {
+ return NULL;
+ }
+
+ /* Search for section name */
+ for (h = cfg; h != NULL; h = h->next) {
+ if (strcmp(section, h->section) == 0) {
+ /* Search for key within section */
+ for (e = h->entries; e != NULL; e = e->next) {
+ if ((e->key != NULL) && strcmp(key, e->key) == 0) {
+ /* Found - set value */
+ free(e->key);
+ /* FIXME: strdup is not ANSI C compliant. */
+ e->key = strdup(value);
+ return e->value;
+ }
+ }
+ }
+ }
+ /* Key not found in section */
+ return NULL;
+}
+
+struct CFG_Header *CFG_FindGnokiirc()
+{
+ struct CFG_Header *cfg_info;
+ char *homedir;
+ char rcfile[200];
+
+#ifdef WIN32
+ homedir = getenv("HOMEDRIVE");
+ strncpy(rcfile, homedir ? homedir : "", 200);
+ homedir = getenv("HOMEPATH");
+ strncat(rcfile, homedir ? homedir : "", 200);
+ strncat(rcfile, "\gnokiirc", 200);
+#else
+ homedir = getenv("HOME");
+ if (homedir) strncpy(rcfile, homedir, 200);
+ strncat(rcfile, "/.gnokiirc", 200);
+#endif
+
+ /* Try opening .gnokirc from users home directory first */
+ if ((cfg_info = CFG_ReadFile(rcfile)) == NULL) {
+#ifndef WIN32
+
+ /* It failed so try for /etc/gnokiirc */
+ if ((cfg_info = CFG_ReadFile("/etc/gnokiirc")) == NULL) {
+ /* That failed too so exit */
+#ifdef DEBUG
+ fprintf(stderr, _("Couldn't open %s or /etc/gnokiirc. Using defaults...\n"), rcfile);
+#endif /* DEBUG */
+ return NULL;
+ }
+
+#else /* WIN32 */
+
+ /* It failed so try for gnokiirc */
+ if ((cfg_info = CFG_ReadFile("gnokiirc")) == NULL) {
+ /* That failed too so exit */
+#ifdef DEBUG
+ fprintf(stderr, _("Couldn't open %s or gnokiirc. Using defaults...\n"), rcfile);
+#endif /* DEBUG */
+ return NULL;
+ }
+
+#endif /* WIN32 */
+ }
+
+ return cfg_info;
+}
+
+int CFG_ReadConfig(char **model, char **port, char **initlength,
+ char **connection, char **bindir, char **synchronizetime,
+ bool isgnokiid)
+{
+ struct CFG_Header *cfg_info;
+#ifdef WIN32
+ char *DefaultPort = "com2:";
+#else
+ char *DefaultPort = "/dev/ttyS1";
+#endif
+ char *DefaultModel = "auto";
+ char *DefaultConnection = "fbus";
+ char *DefaultBindir = "/usr/local/sbin/";
+ char *DefaultSynchronizeTime = "yes";
+ char *DefaultInitLength = "30";
+
+ char *section = "global";
+
+ (char *)*model = DefaultModel;
+ (char *)*port = DefaultPort;
+ (char *)*connection = DefaultConnection;
+ (char *)*bindir = DefaultBindir;
+ (char *)*synchronizetime = DefaultSynchronizeTime;
+ (char *)*initlength = DefaultInitLength;
+
+ cfg_info=CFG_FindGnokiirc();
+ if (cfg_info==NULL) return 0;
+
+ if (isgnokiid) (char *)section = "gnokiid";
+
+ (char *)*model = CFG_Get(cfg_info, section, "model");
+ if (!*model) (char *)*model = DefaultModel;
+
+ (char *)*port = CFG_Get(cfg_info, section, "port");
+ if (!*port) (char *)*port = DefaultPort;
+
+ (char *)*connection = CFG_Get(cfg_info, section, "connection");
+ if (!*connection) (char *)*connection = DefaultConnection;
+
+ (char *)*bindir = CFG_Get(cfg_info, section, "bindir");
+ if (!*bindir) (char *)*bindir = DefaultBindir;
+
+ (char *)*synchronizetime = CFG_Get(cfg_info, section, "synchronizetime");
+ if (!*synchronizetime) (char *)*synchronizetime = DefaultSynchronizeTime;
+
+ (char *)*initlength = CFG_Get(cfg_info, section, "initlength");
+ if (!*initlength) (char *)*initlength = "default";
+
+ return 0;
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Copyright (C) 1999, 2000 Hugh Blemings & Pavel JanÃk ml.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Functions to read and write common file types.
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+#ifndef VC6
+#include <unistd.h>
+#endif
+
+#include "gsm-common.h"
+#include "gsm-ringtones.h"
+#include "gsm-bitmaps.h"
+#include "files/gsm-filetypes.h"
+#include "files/midifile.h"
+#include "gsm-coding.h"
+#include "misc.h"
+#include "newmodules/n7110.h"
+#include "newmodules/n6110.h"
+
+#ifdef XPM
+ #include <X11/xpm.h>
+#endif
+
+/**
+* GetvCalTime
+*
+* Fills vCalendar time string into GSM_DateTime structure
+*
+* in:
+* dt: datetime structure
+* time: string in format yyyymmddThhmmss
+* out:
+* <>0 if error
+*/
+int GetvCalTime(GSM_DateTime *dt, char *time)
+{
+ char year[5]="", month[3]="", day[3]="", hour[3]="", minute[3]="", second[3]="";
+ dt->Year=dt->Month=dt->Day=dt->Hour=dt->Minute=dt->Second=dt->Timezone=0;
+
+ strncpy(year, time, 4);
+ strncpy(month, time+4, 2);
+ strncpy(day, time+6, 2);
+ strncpy(hour, time+9, 2);
+ strncpy(minute, time+11, 2);
+ strncpy(second, time+13, 2);
+
+/* FIXME: Should check ranges... */
+ dt->Year=atoi(year);
+ dt->Month=atoi(month);
+ dt->Day=atoi(day);
+ dt->Hour=atoi(hour);
+ dt->Minute=atoi(minute);
+ dt->Second=atoi(second);
+/* FIXME */
+ dt->Timezone=0;
+
+ return 0;
+}
+
+/**
+* FillCalendarNote
+*
+* Fills calendar data from strings into calendar note
+*
+* in:
+* note: calendar note structure
+* type: type of calendar note
+* text: text or phonenumber
+* time: string in format yyyymmddThhmmss
+* alarm: dito
+* out:
+* <>0 if error
+*/
+int FillCalendarNote(GSM_CalendarNote *note, char *type,
+ char *text, char *time, char *alarm)
+{
+ GetvCalTime(¬e->Time, time);
+ GetvCalTime(¬e->Alarm, alarm);
+
+ note->Location=0;
+
+ strncpy(note->Text, text, MAX_CALENDAR_TEXT_LENGTH);
+ strcpy(note->Phone, ""); /* correct in most cases */
+
+ /* FIXME: Handle additional strings, maybe from configuration file */
+
+ if(!strcmp(type, "PHONE CALL"))
+ {
+ strncpy(note->Phone, text, MAX_CALENDAR_PHONE_LENGTH);
+ note->Type=GCN_CALL;
+ }
+ else if(!strcmp(type, "MEETING"))
+ note->Type=GCN_MEETING;
+ else if(!strcmp(type, "SPECIAL OCCASION"))
+ note->Type=GCN_BIRTHDAY;
+ else
+ note->Type=GCN_REMINDER;
+
+ return 0;
+}
+
+/**
+* GSM_ReadVCalendarFile
+*
+* Reads vCalendar file
+*
+* in:
+* FileName: name of vCalendar file
+* cnote: pointer to calendar note
+* number: number in file of calendar note to read
+* out:
+* <>0 if error
+*/
+GSM_Error GSM_ReadVCalendarFile(char *FileName, GSM_CalendarNote *cnote, int *number)
+{
+ FILE *file;
+ char type[21]="", text[40]="", time[16]="", alarm[16]="";
+ char phone[40]="";
+ long recurr=0L;
+ char altype=0x00;
+
+ int veventcounter=0;
+ int isOK=0;
+
+ bool NoteOK=false;
+
+ char *Line, OLine[1024], BackLine[1024];
+
+ Line = OLine;
+
+ file=fopen(FileName, "r");
+ if (!file) {
+#ifdef DEBUG
+ fprintf(stderr, _("File cannot be opened!\n"));
+#endif
+ return GE_CANTOPENFILE;
+ }
+
+ /* Go through data from file. */
+ while (GetLine(file, Line, sizeof(OLine))!=-1) {
+
+ strcpy(BackLine, Line);
+
+ switch (isOK) {
+ case 0:
+ if (!strcmp(Line,"BEGIN:VCALENDAR"))
+ isOK++;
+ break;
+ case 1:
+ if (!strcmp(Line,"BEGIN:VEVENT")) {
+ isOK++;
+ veventcounter++;
+ }
+ if (!strcmp(Line,"END:VCALENDAR"))
+ isOK--;
+ break;
+ case 2:
+ if (veventcounter==*number) {
+ if (!strncmp(Line,"CATEGORIES:",11)) {
+ strncpy(type,Line+11,strlen(Line)-11);
+ type[strlen(Line)-11]=0;
+ }
+ if (!strncmp(Line,"DESCRIPTION:",12)) {
+ strncpy(phone,Line+12,strlen(Line)-12);
+ phone[strlen(Line)-12]=0;
+ }
+ if (!strncmp(Line,"SUMMARY:",8)) {
+ strncpy(text,Line+8,strlen(Line)-8);
+ text[strlen(Line)-8]=0;
+ }
+ if (!strncmp(Line,"SUMMARY;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:",48)) {
+ DecodeUTF8(text,Line+48,strlen(Line)-48);
+ text[strlen(Line)-48]=0;
+ }
+ if (!strncmp(Line,"DTSTART:",8)) {
+ strncpy(time,Line+8,strlen(Line)-8);
+ time[strlen(Line)-8]=0;
+ }
+ if (!strncmp(Line,"DALARM:",7)) {
+ strncpy(alarm,Line+7,strlen(Line)-7);
+ alarm[strlen(Line)-7]=0;
+ }
+
+ /* Obsolete */
+ if (!strncmp(Line,"RECURR:",7)) {
+ recurr=mem_to_int(Line+7,strlen(Line)-7);
+ }
+
+ if (!strncmp(Line,"RRULE:D1 :",9)) {
+ recurr=1;
+ }
+ if (!strncmp(Line,"RRULE:W1 :",9)) {
+ recurr=7;
+ }
+ if (!strncmp(Line,"RRULE:W2 :",9)) {
+ recurr=14;
+ }
+ if (!strncmp(Line,"RRULE:YD1 :",10)) {
+ recurr=365;
+ }
+
+ if (!strncmp(Line,"ALTYPE:",7)) {
+ altype=(!strncmp("TONE",Line+7,4)) ? 0x00 : 0x01;
+ }
+ }
+ if (!strcmp(Line,"END:VEVENT")) {
+ if (veventcounter==*number) NoteOK=true;
+ isOK--;
+ }
+ break;
+ }
+
+ if (NoteOK) break;
+ }
+
+ if (!NoteOK) {
+ *number=veventcounter;
+#ifdef DEBUG
+ fprintf(stdout,_("Note not found in VCalendarfile\n"));
+#endif
+ return GE_TOOSHORT;
+ }
+
+ FillCalendarNote(cnote, type, text, time, alarm);
+
+ cnote->Recurrance = recurr*24; /* it was in days. I convert in hours */
+ cnote->AlarmType = altype;
+
+ if( strcmp( phone, "" ) ) { /* Invert data if CALL ... */
+ strcpy( cnote->Text, phone );
+ strcpy( cnote->Phone, text ); // alread FillCalendar does it ..
+ }
+
+ fclose(file);
+
+ return 0;
+}
+
+GSM_Error GSM_ReadBinRingtoneFile(char *FileName, GSM_BinRingtone *ringtone)
+{
+ FILE *file;
+ int i;
+
+ file = fopen(FileName, "rb");
+
+ if (!file)
+ return(GE_CANTOPENFILE);
+
+ ringtone->length=fread(ringtone->frame, 1, 500, file);
+
+ fclose(file);
+
+ if (ringtone->frame[0]!=0x00 || ringtone->frame[1]!=0x00 ||
+ ringtone->frame[2]!=0x0C || ringtone->frame[3]!=0x01)
+ return GE_NOTSUPPORTED;
+
+ i=5;
+ while (ringtone->frame[i]!=0x00) {
+ ringtone->name[i-5]=ringtone->frame[i];
+ i++;
+ }
+ ringtone->name[i-5]=0x00;
+
+ return GE_NONE;
+}
+
+/* Function to convert scale field in to correct number. */
+int GetRTTLDuration (char *num)
+{
+
+int duration=0;
+
+ switch (atoi(num)) {
+
+ case 1: duration=128; break;
+ case 2: duration= 64; break;
+ case 4: duration= 32; break;
+ case 8: duration= 16; break;
+ case 16: duration= 8; break;
+ case 32: duration= 4; break;
+ }
+
+ return (duration);
+
+}
+
+int GetRTTLScale (char *num)
+{
+
+ /* This may well need improving. */
+
+ int scale=0;
+
+ if ((atoi(num))<4) scale=(atoi(num));
+ if ((atoi(num))>4) scale=(atoi(num))-4;
+
+ return (scale);
+}
+
+GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone)
+{
+ FILE *file;
+ unsigned char buffer[300];
+ GSM_Error error;
+ GSM_Filetypes filetype=RTTL;
+
+ file = fopen(FileName, "rb");
+
+ if (!file)
+ return(GE_CANTOPENFILE);
+
+ fread(buffer, 1, 4, file); /* Read the header of the file. */
+
+ /* Attempt to identify filetype */
+
+ if (memcmp(buffer, "MThd",3)==0) /* MIDI files have 'MThd' at the start */
+ filetype=MIDI;
+
+ if (buffer[0]==0xc7 && buffer[1]==0x45 && buffer[2]==0xc1 && buffer[3]==0x53)
+ filetype=COMMUNICATOR;
+
+ if (strstr(FileName,".ott")) filetype=OTT; /* OTT files saved by NCDS3 */
+
+ error=GE_NONE;
+
+ rewind(file);
+
+ switch (filetype) {
+ case RTTL:
+ error=loadrttl(file,ringtone);
+ fclose(file);
+ break;
+ case OTT:
+ error=loadott(file,ringtone);
+ fclose(file);
+ break;
+ case COMMUNICATOR:
+ error=loadcommunicator(file,ringtone);
+ fclose(file);
+ break;
+ case MIDI:
+ fclose(file);
+ error=loadmid(FileName,ringtone);
+ break;
+ default:
+ error=GE_INVALIDFILEFORMAT;
+ }
+
+ return(error);
+
+}
+
+GSM_Error loadott(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[2000];
+ int i;
+
+ i=fread(Buffer, 1, 2000, file);
+
+ if (!feof(file)) return GE_TOOLONG;
+
+ return GSM_UnPackRingtone(ringtone, Buffer, i);
+}
+
+GSM_Error loadcommunicator(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[4000];
+ int i,j;
+
+ i=fread(Buffer, 1, 4000, file);
+
+ if (!feof(file)) return GE_TOOLONG;
+
+ i=0;j=0;
+ while (true) {
+ if (Buffer[j]==0x00 && Buffer[j+1]==0x02 &&
+ Buffer[j+2]==0x4a && Buffer[j+3]==0x3a) break;
+ if (j==i-4) return GE_INTERNALERROR;
+ j++;
+ }
+ j++;
+
+ return GSM_UnPackRingtone(ringtone, Buffer+j, i-j);
+}
+
+/* TODO: spaces should not be interpreted */
+/* Note: ringtone have to be in one line (without 0x13 and 0x10 chars) */
+GSM_Error loadrttl(FILE *file, GSM_Ringtone *ringtone)
+{
+ int NrNote=0;
+
+ u8 DefNoteScale=2, DefNoteDuration=4;
+ int DefNoteTempo=63;
+ u8 DefNoteStyle=ContinuousStyle;
+
+ unsigned char buffer[2000];
+ unsigned char *def, *notes, *ptr;
+
+ ringtone->Loop=15; //default value
+
+ fread(buffer, 2000, 1, file);
+
+ /* This is for buggy RTTTL ringtones without name. */
+ if (buffer[0] != RTTTL_SEP[0]) {
+ strtok(buffer, RTTTL_SEP);
+ sprintf(ringtone->name, "%s", buffer);
+ def=strtok(NULL, RTTTL_SEP);
+ notes=strtok(NULL, RTTTL_SEP);
+ }
+ else {
+ sprintf(ringtone->name, "GNOKII");
+ def=strtok(buffer, RTTTL_SEP);
+ notes=strtok(NULL, RTTTL_SEP);
+ }
+
+ ptr=strtok(def, ", ");
+
+ /* Parsing the <defaults> section. */
+ while (ptr) {
+
+ switch(*ptr) {
+ case 'd':
+ case 'D':
+ DefNoteDuration=GetRTTLDuration(ptr+2);
+ break;
+ case 'o':
+ case 'O':
+ DefNoteScale=GetRTTLScale(ptr+2);
+ break;
+ case 'b':
+ case 'B':
+ DefNoteTempo=atoi(ptr+2);
+ break;
+ case 'l':
+ case 'L':
+ ringtone->Loop=atoi(ptr+2);
+ break;
+ case 's':
+ case 'S':
+ switch (*(ptr+1)) {
+ case 'C':
+ case 'c':
+ DefNoteStyle=ContinuousStyle;
+ break;
+ case 'N':
+ case 'n':
+ DefNoteStyle=NaturalStyle;
+ break;
+ case 'S':
+ case 's':
+ DefNoteStyle=StaccatoStyle;
+ break;
+ }
+ switch (*(ptr+2)) {
+ case 'c':
+ case 'C':
+ DefNoteStyle=ContinuousStyle;
+ break;
+ case 'n':
+ case 'N':
+ DefNoteStyle=NaturalStyle;
+ break;
+ case 's':
+ case 'S':
+ DefNoteStyle=StaccatoStyle;
+ break;
+ }
+ break;
+ }
+
+ ptr=strtok(NULL,", ");
+ }
+
+#ifdef DEBUG
+ printf("DefNoteDuration=%d\n", DefNoteDuration);
+ printf("DefNoteScale=%d\n", DefNoteScale);
+#endif
+
+ ptr=strtok(notes, ", ");
+
+ /* Parsing the <note-command>+ section. */
+ while (ptr && NrNote<MAX_RINGTONE_NOTES) {
+
+ switch(*ptr) {
+ case 'o':
+ case 'O':
+ DefNoteScale=GetRTTLScale(ptr+2);
+ break;
+ case 's':
+ case 'S':
+ switch (*(ptr+1)) {
+ case 'C':
+ case 'c':
+ DefNoteStyle=ContinuousStyle;
+ break;
+ case 'N':
+ case 'n':
+ DefNoteStyle=NaturalStyle;
+ break;
+ case 'S':
+ case 's':
+ DefNoteStyle=StaccatoStyle;
+ break;
+ }
+ switch (*(ptr+2)) {
+ case 'C':
+ case 'c':
+ DefNoteStyle=ContinuousStyle;
+ break;
+ case 'N':
+ case 'n':
+ DefNoteStyle=NaturalStyle;
+ break;
+ case 'S':
+ case 's':
+ DefNoteStyle=StaccatoStyle;
+ break;
+ }
+ break;
+ default:
+ /* [<duration>] */
+ ringtone->notes[NrNote].duration=GetRTTLDuration(ptr);
+ if (ringtone->notes[NrNote].duration==0)
+ ringtone->notes[NrNote].duration=DefNoteDuration;
+
+ /* Skip all numbers in duration specification. */
+ while(isdigit(*ptr))
+ ptr++;
+
+ /* <note> */
+ /* B or b is not in specs, but I decided to put it, because
+ it's in some RTTL files. It's the same to H note */
+ if ((*ptr=='B') || (*ptr=='b')) ringtone->notes[NrNote].note=12;
+ else if ((*ptr=='H') || (*ptr=='h')) ringtone->notes[NrNote].note=12;
+ else if ((*ptr>='a') && (*ptr<='g')) ringtone->notes[NrNote].note=((*ptr-'a')*2)+10;
+ else if ((*ptr>='A') && (*ptr<='G')) ringtone->notes[NrNote].note=((*ptr-'A')*2)+10;
+ else ringtone->notes[NrNote].note=255;
+
+ if ((ringtone->notes[NrNote].note>13)&&(ringtone->notes[NrNote].note!=255))
+ ringtone->notes[NrNote].note-=14;
+
+ ptr++;
+
+ if ((*ptr)=='#') {
+ ringtone->notes[NrNote].note++;
+ if ((ringtone->notes[NrNote].note==5) || (ringtone->notes[NrNote].note==13))
+ ringtone->notes[NrNote].note++;
+ ptr++;
+ }
+
+ /* Check for dodgy rttl */
+ /* [<special-duration>] */
+ if (*ptr=='.') {
+ ringtone->notes[NrNote].duration*=1.5;
+ ptr++;
+ }
+
+ /* [<scale>] */
+ if (ringtone->notes[NrNote].note!=255) {
+ if (isdigit(*ptr)) {
+ ringtone->notes[NrNote].note+=GetRTTLScale(ptr)*14;
+ ptr++;
+ } else
+ ringtone->notes[NrNote].note+=DefNoteScale*14;
+ }
+
+ /* [<special-duration>] */
+ if (*ptr=='.') {
+ ringtone->notes[NrNote].duration*=1.5;
+ ptr++;
+ }
+
+ /* Style */
+ ringtone->notes[NrNote].style=DefNoteStyle;
+
+ /* Tempo */
+ ringtone->notes[NrNote].tempo=DefNoteTempo;
+
+ NrNote++;
+
+ break;
+ }
+ ptr=strtok(NULL, ", ");
+ }
+
+ ringtone->NrNotes=NrNote;
+
+ return GE_NONE;
+}
+
+GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone)
+{
+
+ FILE *file;
+ bool done=false;
+
+ file = fopen(FileName, "wb");
+
+ if (!file)
+ return(GE_CANTOPENFILE);
+
+ if (strstr(FileName,".ott"))
+ {
+ saveott(file, ringtone);
+ done=true;
+ }
+ if (strstr(FileName,".mid"))
+ {
+ savemid(file, ringtone);
+ done=true;
+ }
+
+ if (!done) saverttl(file, ringtone);
+
+ fclose(file);
+
+ return GE_NONE;
+}
+
+void saveott(FILE *file, GSM_Ringtone *ringtone)
+{
+ char Buffer[2000];
+
+ int i=2000;
+
+ GSM_PackRingtone(ringtone, Buffer, &i);
+
+ fwrite(Buffer, 1, i, file);
+}
+
+void saverttl(FILE *file, GSM_Ringtone *ringtone)
+{
+ u8 DefNoteScale=2, DefNoteDuration=4;
+ int DefNoteTempo=63;
+ u8 DefNoteStyle=ContinuousStyle;
+
+ int CurrentNote;
+ int buffer[6];
+ int i,j,k=0;
+
+ /* Saves ringtone name */
+ fprintf(file,_("%s:"),ringtone->name);
+
+ /* Find the most frequently used duration and use this for the default */
+
+ for (i=0;i<6;i++) buffer[i]=0;
+ for (i=0;i<ringtone->NrNotes;i++) {
+ switch (ringtone->notes[i].duration) {
+ case 192:buffer[0]++; break;
+ case 128:buffer[0]++; break;
+ case 96:buffer[1]++; break;
+ case 64:buffer[1]++; break;
+ case 48:buffer[2]++; break;
+ case 32:buffer[2]++; break;
+ case 24:buffer[3]++; break;
+ case 16:buffer[3]++; break;
+ case 12:buffer[4]++; break;
+ case 8:buffer[4]++; break;
+ case 6:buffer[5]++; break;
+ case 4:buffer[5]++; break;
+ }
+ }
+
+ /* Now find the most frequently used */
+ j=0;
+ for (i=0;i<6;i++) {
+ if (buffer[i]>j) {
+ k=i;
+ j=buffer[i];
+ }
+ }
+
+ /* Finally convert and save the default duration */
+
+ switch (k) {
+ case 0: DefNoteDuration=128; fprintf(file, _("d=1,")); break;
+ case 1: DefNoteDuration= 64; fprintf(file, _("d=2,")); break;
+ case 2: DefNoteDuration= 32; fprintf(file, _("d=4,")); break;
+ case 3: DefNoteDuration= 16; fprintf(file, _("d=8,")); break;
+ case 4: DefNoteDuration= 8; fprintf(file,_("d=16,")); break;
+ case 5: DefNoteDuration= 4; fprintf(file,_("d=32,")); break;
+ default: DefNoteDuration= 16; fprintf(file, _("d=8,")); break;
+ }
+
+
+ /* Find the most frequently used scale and use this for the default */
+
+ for (i=0;i<6;i++) buffer[i]=0;
+ for (i=0;i<ringtone->NrNotes;i++) {
+ if (ringtone->notes[i].note!=255) {
+ buffer[ringtone->notes[i].note/14]++;
+ }
+ }
+ j=0;
+ for (i=0;i<6;i++) {
+ if (buffer[i]>j) {
+ DefNoteScale=i;
+ j=buffer[i];
+ }
+ }
+
+ if (ringtone->NrNotes!=0) {
+ DefNoteTempo=ringtone->notes[0].tempo;
+ DefNoteStyle=ringtone->notes[0].style;
+ }
+
+ /* Save the default scale */
+ fprintf(file,_("o=%i,"),DefNoteScale+4);
+
+ switch (DefNoteStyle) {
+ case StaccatoStyle: fprintf(file,_("s=S,")); break;
+ case NaturalStyle : fprintf(file,_("s=N,")); break;
+ }
+
+ /* Save the default tempo */
+ fprintf(file,_("b=%i,"),DefNoteTempo);
+
+ /* Save the default loop */
+ fprintf(file,_("l=%i:"),ringtone->Loop);
+
+#ifdef DEBUG
+ printf("DefNoteDuration=%d\n", DefNoteDuration);
+ printf("DefNoteScale=%d\n", DefNoteScale);
+ printf("Number of notes=%d\n",ringtone->NrNotes);
+#endif
+
+ /* Now loop round for each note */
+
+ for (i=0;i<ringtone->NrNotes;i++) {
+ CurrentNote=ringtone->notes[i].note;
+
+ if (ringtone->notes[i].style!=DefNoteStyle) {
+ DefNoteStyle=ringtone->notes[i].style;
+ switch (DefNoteStyle) {
+ case StaccatoStyle : fprintf(file,_("s=S")); break;
+ case NaturalStyle : fprintf(file,_("s=N")); break;
+ case ContinuousStyle: fprintf(file,_("s=C")); break;
+ }
+ /* And a separator before next note */
+ if (i!=ringtone->NrNotes-1)
+ fprintf(file,_(","));
+ }
+
+ if (ringtone->notes[i].tempo!=DefNoteTempo) {
+ DefNoteTempo=ringtone->notes[i].tempo;
+ fprintf(file,_("b=%i"),DefNoteTempo);
+ if (i!=ringtone->NrNotes-1)
+ fprintf(file,_(","));
+ }
+
+ /* This note has a duration different than the default. We must save it */
+ if (ringtone->notes[i].duration!=DefNoteDuration) {
+ switch (ringtone->notes[i].duration) {
+ case 192: fprintf(file, _("1")); break; //192=128*1.5
+ case 128: fprintf(file, _("1")); break;
+ case 96: fprintf(file, _("2")); break; //96=64*1.5
+ case 64: fprintf(file, _("2")); break;
+ case 48: fprintf(file, _("4")); break; //48=32*1.5
+ case 32: fprintf(file, _("4")); break;
+ case 24: fprintf(file, _("8")); break; //24=16*1.5
+ case 16: fprintf(file, _("8")); break;
+ case 12: fprintf(file,_("16")); break; //12=8*1.5
+ case 8: fprintf(file,_("16")); break;
+ case 6: fprintf(file,_("32")); break; //6=4*1.5
+ case 4: fprintf(file,_("32")); break;
+ default:
+ break;
+ }
+ }
+
+ /* Now save the actual note */
+ switch (GSM_GetNote(CurrentNote)) {
+ case Note_C :fprintf(file,_("c"));break;
+ case Note_Cis:fprintf(file,_("c#"));break;
+ case Note_D :fprintf(file,_("d"));break;
+ case Note_Dis:fprintf(file,_("d#"));break;
+ case Note_E :fprintf(file,_("e"));break;
+ case Note_F :fprintf(file,_("f"));break;
+ case Note_Fis:fprintf(file,_("f#"));break;
+ case Note_G :fprintf(file,_("g"));break;
+ case Note_Gis:fprintf(file,_("g#"));break;
+ case Note_A :fprintf(file,_("a"));break;
+ case Note_Ais:fprintf(file,_("a#"));break;
+ case Note_H :fprintf(file,_("h"));break;
+ default :fprintf(file,_("p"));break; //Pause ?
+ }
+
+ /* Saving info about special duration */
+ if (ringtone->notes[i].duration==128*1.5 ||
+ ringtone->notes[i].duration==64*1.5 ||
+ ringtone->notes[i].duration==32*1.5 ||
+ ringtone->notes[i].duration==16*1.5 ||
+ ringtone->notes[i].duration==8*1.5 ||
+ ringtone->notes[i].duration==4*1.5)
+ fprintf(file,_("."));
+
+ /* This note has a scale different than the default, so save it */
+ if ( (CurrentNote!=255) && (CurrentNote/14!=DefNoteScale))
+ fprintf(file,_("%i"),(CurrentNote/14)+4);
+
+ /* And a separator before next note */
+ if (i!=ringtone->NrNotes-1)
+ fprintf(file,_(","));
+
+ }
+}
+
+void WriteVarLen(char* midifile, int* current, long value)
+{
+ long buffer;
+
+ buffer = value & 0x7f;
+
+ while (value >>= 7) {
+ buffer <<= 8;
+ buffer |= 0x80;
+ buffer += (value & 0x7f);
+ }
+
+ while (1) {
+ midifile[(*current)++] = buffer;
+ if (buffer & 0x80)
+ buffer >>= 8;
+ else
+ break;
+ }
+}
+
+#define singlepauses
+
+/* FIXME: need adding tempo before each note and scale too ? */
+void savemid(FILE* file, GSM_Ringtone *ringtone)
+{
+ char midifile[3000] = { 0x4D, 0x54, 0x68, 0x64, // MThd
+ 0x00, 0x00, 0x00, 0x06, // chunk length
+ 0x00, 0x00, // format 0
+ 0x00, 0x01, // one track
+ 0x00, 0x20, // 32 per quarter note
+ 0x4D, 0x54, 0x72, 0x6B, // MTrk
+ 0x00, 0x00, 0x00, 0x00, // chunk length
+ 0x00, 0xFF, 0x51, 0x03, // tempo meta event
+ 0x00, 0x00, 0x00 // 3 bytes for us for a quarter note
+ };
+
+//{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
+char midinotes[14] =
+ { 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10 , 11, 11 };
+
+ int length = 20;
+ int start = 22;
+ int current = 26, i, note, pause = 0;
+ bool notesexisting = false;
+
+ /* FIXME: we need add tempo before each note or so... */
+ long duration=60000000/63; // us for a quarter note
+ if (ringtone->NrNotes!=0)
+ duration=60000000/ringtone->notes[0].tempo;
+ midifile[current++] = duration >> 16;
+ midifile[current++] = duration >> 8;
+ midifile[current++] = duration;
+
+ for (i = 0; i < ringtone->NrNotes; i++) {
+
+ note = ringtone->notes[i].note;
+ if (note == 255) { // readmid does not read pauses at the beginning
+
+ if (notesexisting) {
+ pause += ringtone->notes[i].duration;
+#ifdef singlepauses
+ WriteVarLen(midifile,¤t,pause);
+ pause=0;
+ midifile[current++]=0x00; // pause
+ midifile[current++]=0x00;
+#endif
+ }
+
+ } else {
+
+ notesexisting = true;
+ note = 48+12*((note/14)%4) + midinotes[note%14];
+
+ WriteVarLen(midifile,¤t,pause);
+ pause=0;
+ midifile[current++]=0x90; // note on
+ midifile[current++]=note;
+ midifile[current++]=0x64; // forte
+
+ WriteVarLen(midifile,¤t,ringtone->notes[i].duration);
+ midifile[current++]=0x80; // note off
+ midifile[current++]=note;
+ midifile[current++]=0x64;
+
+ }
+ }
+
+ if (pause) {
+ WriteVarLen(midifile,¤t,pause);
+ midifile[current++]=0x00; // pause
+ midifile[current++]=0x00; //
+ }
+ midifile[current++] = 0x00;
+ midifile[current++] = 0xFF; // track end
+ midifile[current++] = 0x2F;
+ midifile[current++] = 0x00;
+ midifile[length++] = (current-start) >> 8;
+ midifile[length++] = current-start;
+
+ fwrite(midifile,1,current,file);
+}
+
+GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_Bitmap *bitmap)
+{
+
+ FILE *file;
+ unsigned char buffer[300];
+ GSM_Error error;
+ GSM_Filetypes filetype=None;
+
+ file = fopen(FileName, "rb");
+
+ if (!file)
+ return(GE_CANTOPENFILE);
+
+ fread(buffer, 1, 9, file); /* Read the header of the file. */
+
+ /* Attempt to identify filetype */
+
+ if (memcmp(buffer, "NOL",3)==0) { /* NOL files have 'NOL' at the start */
+ filetype=NOL;
+ } else if (memcmp(buffer, "NGG",3)==0) { /* NGG files have 'NGG' at the start */
+ filetype=NGG;
+ } else if (memcmp(buffer, "FORM",4)==0) { /* NSL files have 'FORM' at the start */
+ filetype=NSL;
+ } else if (memcmp(buffer, "NLM",3)==0) { /* NLM files have 'NLM' at the start */
+ filetype=NLM;
+ } else if (memcmp(buffer, "BM",2)==0) { /* BMP, I61 and GGP files have 'BM' at the start */
+ filetype=BMP;
+ } else if (memcmp(buffer, "/* XPM */",9)==0) { /* XPM files have 'XPM' at the start */
+ filetype=XPMF;
+ } else filetype=None;
+
+ if (strstr(FileName,".otb")) filetype=OTA; /* OTA files saved by NCDS3 */
+
+ error=GE_NONE;
+
+ rewind(file);
+
+ switch (filetype) {
+ case NOL: error=loadnol(file,bitmap); fclose(file); break;
+ case NGG: error=loadngg(file,bitmap); fclose(file); break;
+ case NSL: error=loadnsl(file,bitmap); fclose(file); break;
+ case NLM: error=loadnlm(file,bitmap); fclose(file); break;
+ case OTA: error=loadota(file,bitmap); fclose(file); break;
+ case BMP: error=loadbmp(file,bitmap); fclose(file); break;
+#ifdef XPM
+ case XPMF:fclose(file);error=loadxpm(FileName,bitmap);break;
+#endif
+ default : error=GE_INVALIDFILEFORMAT;
+ }
+
+ return(error);
+}
+
+#ifdef XPM
+
+GSM_Error loadxpm(char *filename, GSM_Bitmap *bitmap)
+{
+ int y,x,error;
+ XpmImage image;
+ XpmInfo info;
+
+ error=XpmReadFileToXpmImage(filename,&image,&info);
+
+ switch (error) {
+ case XpmColorError: return GE_WRONGCOLORS;break;
+ case XpmColorFailed: return GE_WRONGCOLORS;break;
+ case XpmOpenFailed: return GE_CANTOPENFILE;break;
+ case XpmFileInvalid: return GE_INVALIDFILEFORMAT;break;
+ case XpmSuccess: break;
+ }
+
+ if (image.ncolors!=2) {
+ printf("Wrong number of colors\n");
+ return GE_WRONGNUMBEROFCOLORS;
+ }
+
+ if ((image.height==48) && (image.width==84)) {
+ bitmap->type=GSM_StartupLogo;
+ }
+ else if ((image.height==65) && (image.width==96)) {
+ bitmap->type=GSM_7110StartupLogo;
+ }
+ else if ((image.height==60) && (image.width==96)) {
+ bitmap->type=GSM_6210StartupLogo;
+ }
+ else if ((image.height==28) && (image.width==72)) {
+ bitmap->type=GSM_PictureImage;
+ }
+ else if ((image.height==14) && (image.width==72)) {
+ bitmap->type=GSM_CallerLogo;
+ }
+ else {
+#ifdef DEBUG
+ printf("Invalid Image Size (%dx%d).\n",image.width,image.height);
+#endif
+ return GE_INVALIDIMAGESIZE;
+ }
+
+ bitmap->height=image.height;
+ bitmap->width=image.width;
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ GSM_ClearBitmap(bitmap);
+
+ for(y=0;y<image.height;y++) {
+ for(x=0;x<image.width;x++) {
+ if (image.data[y*image.width+x]==0) GSM_SetPointBitmap(bitmap,x,y);
+ }
+ }
+
+ return GE_NONE;
+}
+
+#endif
+
+/* Based on the article from the Polish Magazine "Bajtek" 11/92 */
+ /* Marcin-Wiacek@Topnet.PL */
+GSM_Error loadbmp(FILE *file, GSM_Bitmap *bitmap)
+{
+ unsigned char buffer[34];
+ bool first_white;
+ int w,h,pos,y,x,i,sizeimage;
+
+ fread(buffer, 1, 34, file); //required part of header
+
+ h=buffer[22]+256*buffer[21]; //height of image in the file
+ w=buffer[18]+256*buffer[17]; //width of image in the file
+#ifdef DEBUG
+ printf("Image Size in BMP file: %dx%d\n",w,h);
+#endif
+
+ bitmap->type=GSM_7110StartupLogo;
+ bitmap->width=96;
+ bitmap->height=65;
+
+ if (h==48 && w==84) {
+ bitmap->width=84;
+ bitmap->height=48;
+ bitmap->type=GSM_StartupLogo;
+ }
+ if (h==60 && w==96) {
+ bitmap->width=96;
+ bitmap->height=60;
+ bitmap->type=GSM_6210StartupLogo;
+ }
+ if (h==14 && w==72) {
+ bitmap->width=72;
+ bitmap->height=14;
+ bitmap->type=GSM_CallerLogo;
+ }
+ if (h==28 && w==72) {
+ bitmap->width=72;
+ bitmap->height=28;
+ bitmap->type=GSM_PictureImage;
+ }
+ if (h==21 && w==78) {
+ bitmap->width=78;
+ bitmap->height=21;
+ bitmap->type=GSM_7110OperatorLogo;
+ }
+
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ GSM_ClearBitmap(bitmap);
+
+#ifdef DEBUG
+ printf("Number of colors in BMP file: ");
+ switch (buffer[28]) {
+ case 1:printf("2 (supported by gnokii)\n");break;
+ case 4:printf("16 (not supported by gnokii)\n");break;
+ case 8:printf("256 (not supported by gnokii)\n");break;
+ case 24:printf("True Color (not supported by gnokii)\n");break;
+ default:printf("unknown\n");break;
+ }
+#endif
+ if (buffer[28]!=1) {
+ printf("Wrong number of colors\n"); //we support only 2 colors images !
+ return GE_WRONGNUMBEROFCOLORS;
+ }
+
+#ifdef DEBUG
+ printf("Compression in BMP file: ");
+ switch (buffer[30]) {
+ case 0:printf("no compression (supported by gnokii)\n");break;
+ case 1:printf("RLE8 (not supported by gnokii)\n");break;
+ case 2:printf("RLE4 (not supported by gnokii)\n");break;
+ default:printf("unknown\n");break;
+ }
+#endif
+ if (buffer[30]!=0) {
+#ifdef DEBUG
+ printf("Subformat not supported\n"); //we don't support RLE compression
+#endif
+ return GE_SUBFORMATNOTSUPPORTED;
+ }
+
+ pos=buffer[10]-34;
+ fread(buffer, 1, pos, file); //rest of header (if exists) and color palette
+
+#ifdef DEBUG
+ printf("First color in BMP file: %i %i %i ",buffer[pos-8], buffer[pos-7], buffer[pos-6]);
+ if (buffer[pos-8]==0 && buffer[pos-7]==0 && buffer[pos-6]==0) printf("(white)");
+ if (buffer[pos-8]==0xFF && buffer[pos-7]==0xFF && buffer[pos-6]==0xFF) printf("(black)");
+ if (buffer[pos-8]==102 && buffer[pos-7]==204 && buffer[pos-6]==102) printf("(green)");
+ printf("\n");
+
+ printf("Second color in BMP file: %i %i %i ",buffer[pos-4], buffer[pos-3], buffer[pos-2]);
+ if (buffer[pos-4]==0 && buffer[pos-3]==0 && buffer[pos-2]==0) printf("(white)");
+ if (buffer[pos-4]==0xFF && buffer[pos-3]==0xFF && buffer[pos-2]==0xFF) printf("(black)");
+ printf("\n");
+#endif
+ first_white=true;
+ if (buffer[pos-8]!=0 || buffer[pos-7]!=0 || buffer[pos-6]!=0) first_white=false;
+
+ sizeimage=0;
+ pos=7;
+ for (y=h-1;y>=0;y--) { //lines are written from the last to the first
+ i=1;
+ for (x=0;x<w;x++) {
+ if (pos==7) { //new byte !
+ fread(buffer, 1, 1, file);
+ sizeimage++;
+ i++;
+ if(i==5) i=1; //each line is written in multiply of 4 bytes
+ }
+ if (x<=bitmap->width && y<=bitmap->height) { //we have top left corner !
+ if (first_white) {
+ if ((buffer[0]&(1<<pos))<=0) GSM_SetPointBitmap(bitmap,x,y);
+ } else {
+ if ((buffer[0]&(1<<pos))>0) GSM_SetPointBitmap(bitmap,x,y);
+ }
+ }
+ pos--;
+ if (pos<0) pos=7; //going to new byte
+ }
+ pos=7; //going to new byte
+ if (i!=1) {
+ while (i!=5) //each line is written in multiply of 4 bytes
+ {
+ fread(buffer, 1, 1, file);
+ sizeimage++;
+ i++;
+ }
+ }
+ }
+
+#ifdef DEBUG
+ printf("Data size in BMP file: %i\n",sizeimage);
+#endif
+
+ return(GE_NONE);
+}
+
+GSM_Error loadnol(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ unsigned char buffer[2000];
+ int i,j;
+
+ bitmap->type=GSM_OperatorLogo;
+
+ fread(buffer, 1, 6, file);
+ fread(buffer, 1, 4, file);
+ sprintf(bitmap->netcode, "%d %02d", buffer[0]+256*buffer[1], buffer[2]);
+
+ fread(buffer, 1, 4, file); /* Width and height of the icon. */
+ bitmap->width=buffer[0];
+ bitmap->height=buffer[2];
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ if ((bitmap->height!=14) || (bitmap->width!=72)) {
+#ifdef DEBUG
+ printf("Invalid Image Size (%dx%d).\n",bitmap->width,bitmap->height);
+#endif
+ return GE_INVALIDIMAGESIZE;
+ }
+
+ fread(buffer, 1, 6, file); /* Unknown bytes. */
+
+ for (i=0; i<bitmap->size; i++) {
+ if (fread(buffer, 1, 8, file)==8) {
+ bitmap->bitmap[i]=0;
+ for (j=7; j>=0;j--)
+ if (buffer[7-j] == '1')
+ bitmap->bitmap[i]|=(1<<j);
+ }
+ else
+ return (GE_TOOSHORT);
+ }
+
+#ifdef DEBUG
+ /* Some programs writes here fileinfo */
+ if (fread(buffer, 1, 1, file)==1) {
+ fprintf(stdout, _("Fileinfo: %c"),buffer[0]);
+ while (fread(buffer, 1, 1, file)==1) {
+ if (buffer[0]!=0x0A) fprintf(stdout,_("%c"),buffer[0]);
+ }
+ fprintf(stdout, _("\n"));
+ }
+#endif
+
+ return(GE_NONE);
+}
+
+GSM_Error loadngg(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ unsigned char buffer[2000];
+ int i,j;
+
+ bitmap->type=GSM_CallerLogo;
+
+ fread(buffer, 1, 6, file);
+ fread(buffer, 1, 4, file); /* Width and height of the icon. */
+ bitmap->width=buffer[0];
+ bitmap->height=buffer[2];
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ if ((bitmap->height!=14) || (bitmap->width!=72)) {
+#ifdef DEBUG
+ printf("Invalid Image Size (%dx%d).\n",bitmap->width,bitmap->height);
+#endif
+ return GE_INVALIDIMAGESIZE;
+ }
+
+ fread(buffer, 1, 6, file); /* Unknown bytes. */
+
+ for (i=0; i<bitmap->size; i++) {
+ if (fread(buffer, 1, 8, file)==8){
+ bitmap->bitmap[i]=0;
+ for (j=7; j>=0;j--)
+ if (buffer[7-j] == '1')
+ bitmap->bitmap[i]|=(1<<j);
+ }
+ else
+ return(GE_TOOSHORT);
+ }
+
+#ifdef DEBUG
+ /* Some programs writes here fileinfo */
+ if (fread(buffer, 1, 1, file)==1) {
+ fprintf(stdout, _("Fileinfo: %c"),buffer[0]);
+ while (fread(buffer, 1, 1, file)==1) {
+ if (buffer[0]!=0x0A) fprintf(stdout,_("%c"),buffer[0]);
+ }
+ fprintf(stdout, _("\n"));
+ }
+#endif
+
+ return(GE_NONE);
+}
+
+GSM_Error loadnsl(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ unsigned char block[6],buffer[505];
+ int block_size;
+
+ bitmap->size=0;
+
+ while (fread(block,1,6,file)==6) {
+
+ block_size=block[4]*256+block[5];
+
+#ifdef DEBUG
+ fprintf(stdout,_("Block %c%c%c%c, size %i\n"),block[0],block[1],block[2],block[3],block_size);
+#endif
+
+ if (!strncmp(block, "FORM", 4)) {
+#ifdef DEBUG
+ fprintf(stdout,_(" File ID\n"));
+#endif
+ } else
+ {
+ if (block_size>504) return(GE_INVALIDFILEFORMAT);
+
+ if (block_size!=0) {
+
+ fread(buffer,1,block_size,file);
+ buffer[block_size]=0; //if it's string, we end it with \0
+
+#ifdef DEBUG
+ if (!strncmp(block, "VERS", 4)) fprintf(stdout,_(" File saved by: %s\n"),buffer);
+ if (!strncmp(block, "MODL", 4)) fprintf(stdout,_(" Logo saved from: %s\n"),buffer);
+ if (!strncmp(block, "COMM", 4)) fprintf(stdout,_(" Phone was connected to COM port: %s\n"),buffer);
+#endif
+
+ if (!strncmp(block, "NSLD", 4)) {
+ bitmap->type=GSM_StartupLogo;
+ bitmap->height=48;
+ bitmap->width=84;
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ memcpy(bitmap->bitmap,buffer,bitmap->size);
+
+#ifdef DEBUG
+ fprintf(stdout,_(" Startup logo (size %i)\n"),block_size);
+#endif
+ }
+ }
+ }
+ }
+
+ if (bitmap->size==0) return(GE_TOOSHORT);
+
+ return(GE_NONE);
+}
+
+GSM_Error loadnlm (FILE *file, GSM_Bitmap *bitmap)
+{
+ unsigned char buffer[1000];
+ int pos,pos2,x,y;
+ div_t division;
+
+ fread(buffer,1,5,file);
+ fread(buffer,1,1,file);
+
+ switch (buffer[0]) {
+ case 0x00: bitmap->type=GSM_OperatorLogo; break;
+ case 0x01: bitmap->type=GSM_CallerLogo; break;
+ case 0x02: bitmap->type=GSM_StartupLogo; break;
+ case 0x03: bitmap->type=GSM_PictureImage; break;
+ default:
+ return(GE_SUBFORMATNOTSUPPORTED);
+ }
+
+ fread(buffer,1,4,file);
+ bitmap->width=buffer[1];
+ bitmap->height=buffer[2];
+
+ if (bitmap->type==GSM_StartupLogo && bitmap->width==96 && bitmap->height==65)
+ bitmap->type=GSM_7110StartupLogo;
+ if (bitmap->type==GSM_StartupLogo && bitmap->width==96 && bitmap->height==60)
+ bitmap->type=GSM_6210StartupLogo;
+ if (bitmap->type==GSM_OperatorLogo && bitmap->width==78 && bitmap->height==21)
+ bitmap->type=GSM_7110OperatorLogo;
+
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ division=div(bitmap->width,8);
+ if (division.rem!=0) division.quot++; /* For startup logos */
+
+ if (fread(buffer,1,(division.quot*bitmap->height),file)!=(division.quot*bitmap->height))
+ return(GE_TOOSHORT);
+
+ GSM_ClearBitmap(bitmap);
+
+ pos=0;pos2=7;
+ for (y=0;y<bitmap->height;y++) {
+ for (x=0;x<bitmap->width;x++) {
+ if ((buffer[pos]&(1<<pos2))>0) GSM_SetPointBitmap(bitmap,x,y);
+ pos2--;
+ if (pos2<0) {pos2=7;pos++;} //going to new byte
+ }
+ if (pos2!=7) {pos2=7;pos++;} //for startup logos-new line means new byte
+ }
+
+ return (GE_NONE);
+}
+
+GSM_Error loadota(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ char buffer[4];
+
+ fread(buffer,1,4,file);
+
+ bitmap->width=buffer[1];
+ bitmap->height=buffer[2];
+
+ if ((bitmap->height==48) && (bitmap->width==84)) {
+ bitmap->type=GSM_StartupLogo;
+ }
+ else if ((bitmap->height==14) && (bitmap->width==72)) {
+ bitmap->type=GSM_CallerLogo;
+ }
+ else {
+#ifdef DEBUG
+ printf("Invalid Image Size (%dx%d).\n",bitmap->width,bitmap->height);
+#endif
+ return GE_INVALIDIMAGESIZE;
+ }
+
+ bitmap->size=GSM_GetBitmapSize(bitmap);
+
+ if (fread(bitmap->bitmap,1,bitmap->size,file)!=bitmap->size)
+ return(GE_TOOSHORT);
+
+ return(GE_NONE);
+}
+
+GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_Bitmap *bitmap)
+{
+
+ FILE *file;
+ bool done=false;
+
+ file = fopen(FileName, "wb");
+
+ if (!file)
+ return(GE_CANTOPENFILE);
+
+ if (strstr(FileName,".xpm")) { savexpm(file, bitmap); done=true; }
+ if (strstr(FileName,".nlm")) { savenlm(file, bitmap); done=true; }
+ if (strstr(FileName,".ngg")) { savengg(file, bitmap); done=true; }
+ if (strstr(FileName,".nsl")) { savensl(file, bitmap); done=true; }
+ if (strstr(FileName,".otb")) { saveota(file, bitmap); done=true; }
+ if (strstr(FileName,".nol")) { savenol(file, bitmap); done=true; }
+ if (strstr(FileName,".bmp") ||
+ strstr(FileName,".ggp") ||
+ strstr(FileName,".i61"))
+ {
+ savebmp(file, bitmap);
+ done=true;
+ }
+
+ if (!done)
+ {
+ switch (bitmap->type) {
+ case GSM_CallerLogo : savengg(file, bitmap); break;
+ case GSM_OperatorLogo : savenol(file, bitmap); break;
+ case GSM_7110OperatorLogo: savebmp(file, bitmap); break;
+ case GSM_7110StartupLogo : savebmp(file, bitmap); break;
+ case GSM_6210StartupLogo : savebmp(file, bitmap); break;
+ case GSM_StartupLogo : savensl(file, bitmap); break;
+ case GSM_PictureImage : savenlm(file, bitmap); break;
+ case GSM_WelcomeNoteText : break;
+ case GSM_DealerNoteText : break;
+ case GSM_None : break;
+ }
+ }
+
+ fclose(file);
+
+ return GE_NONE;
+}
+
+void savexpm(FILE *file, GSM_Bitmap *bitmap)
+{
+ int x,y;
+
+ fprintf(file,_("/* XPM */\n"));
+ fprintf(file,_("static char * ala_xpm[] = {\n"));
+ fprintf(file,_("\"%i %i 2 1\",\n"),bitmap->width,bitmap->height);
+ fprintf(file,_("\". s c m #000000 g4 #000000 g #000000 c #000000\",\n"));
+ fprintf(file,_("\"# s c m #ffffff g4 #ffffff g #ffffff c #ffffff\",\n"));
+
+ for (y=0;y<bitmap->height;y++) {
+ fprintf(file,_("\""));
+ for (x=0;x<bitmap->width;x++)
+ if (GSM_IsPointBitmap(bitmap,x,y))
+ fprintf(file,_("."));
+ else
+ fprintf(file,_("#"));
+ fprintf(file,_("\""));
+ if (y==bitmap->height-1)
+ fprintf(file,_("};\n"));
+ else
+ fprintf(file,_(",\n"));
+ }
+}
+
+/* Based on the article from the Polish Magazine "Bajtek" 11/92 */
+ /* Marcin-Wiacek@Topnet.PL */
+void savebmp(FILE *file, GSM_Bitmap *bitmap)
+{
+ int x,y,pos,i,sizeimage;
+ unsigned char buffer[1];
+ div_t division;
+
+ unsigned char header[]={
+/*1'st header*/ 'B','M', /* BMP file ID */
+ 0x00,0x00,0x00,0x00, /* Size of file */
+ 0x00,0x00, /* Reserved for future use */
+ 0x00,0x00, /* Reserved for future use */
+ 62,0x00,0x00,0x00, /* Offset for image data */
+
+/*2'nd header*/ 40,0x00,0x00,0x00, /* Length of this part of header */
+ 0x00,0x00,0x00,0x00, /* Width of image */
+ 0x00,0x00,0x00,0x00, /* Height of image */
+ 1,0x00, /* How many planes in target device */
+ 1,0x00, /* How many colors in image. 1 means 2^1=2 colors */
+ 0x00,0x00,0x00,0x00, /* Type of compression. 0 means no compression */
+/*Sometimes */ 0x00,0x00,0x00,0x00, /* Size of part with image data */
+/*ttttttt...*/ 0xE8,0x03,0x00,0x00, /* XPelsPerMeter */
+/*hhiiiiissss*/ 0xE8,0x03,0x00,0x00, /* YPelsPerMeter */
+/*part of header*/2,0x00,0x00,0x00, /* How many colors from palette is used */
+/*doesn't exist*/ 0x00,0x00,0x00,0x00, /* How many colors from palette is required to display image. 0 means all */
+
+/*Color palette*/ 0x00,0x00,0x00, /* First color in palette in Blue, Green, Red. Here white */
+ 0x00, /* Each color in palette is end by 4'th byte */
+ 102,204,102, /* Second color in palette in Blue, Green, Red. Here green */
+ 0x00}; /* Each color in palette is end by 4'th byte */
+
+ header[22]=bitmap->height;
+ header[18]=bitmap->width;
+
+ pos=7;
+ sizeimage=0;
+ for (y=bitmap->height-1;y>=0;y--) { //lines are written from the last to the first
+ i=1;
+ for (x=0;x<bitmap->width;x++) {
+ if (pos==7) { //new byte !
+ if (x!=0) sizeimage++;
+ i++;
+ if(i==5) i=1; //each line is written in multiply of 4 bytes
+ }
+ pos--;
+ if (pos<0) pos=7; //going to new byte
+ }
+ pos=7; //going to new byte
+ sizeimage++;
+ if (i!=1) {
+ while (i!=5) //each line is written in multiply of 4 bytes
+ {
+ sizeimage++;
+ i++;
+ }
+ }
+ }
+#ifdef DEBUG
+ printf("Data size in BMP file: %i\n",sizeimage);
+#endif
+ division=div(sizeimage,256);
+ header[35]=division.quot;
+ header[34]=sizeimage-(division.quot*256);
+
+ sizeimage=sizeimage+sizeof(header);
+#ifdef DEBUG
+ printf("Size of BMP file: %i\n",sizeimage);
+#endif
+ division=div(sizeimage,256);
+ header[3]=division.quot;
+ header[2]=sizeimage-(division.quot*256);
+
+ fwrite(header,1,sizeof(header),file);
+
+ pos=7;
+ for (y=bitmap->height-1;y>=0;y--) { //lines are written from the last to the first
+ i=1;
+ for (x=0;x<bitmap->width;x++) {
+ if (pos==7) { //new byte !
+ if (x!=0) fwrite(buffer, 1, sizeof(buffer), file);
+ i++;
+ if(i==5) i=1; //each line is written in multiply of 4 bytes
+ buffer[0]=0;
+ }
+ if (!GSM_IsPointBitmap(bitmap,x,y)) buffer[0]|=(1<<pos);
+ pos--;
+ if (pos<0) pos=7; //going to new byte
+ }
+ pos=7; //going to new byte
+ fwrite(buffer, 1, sizeof(buffer), file);
+ if (i!=1) {
+ while (i!=5) //each line is written in multiply of 4 bytes
+ {
+ buffer[0]=0;
+ fwrite(buffer, 1, sizeof(buffer), file);
+ i++;
+ }
+ }
+ }
+}
+
+void savengg(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ char header[]={'N','G','G',0x00,0x01,0x00,
+ 0x00,0x00, /* Width */
+ 0x00,0x00, /* Height */
+ 0x01,0x00,0x01,0x00,
+ 0x00, /* Unknown.Can't be checksum - for */
+ /* the same logo files can be different */
+ 0x00};
+
+ char buffer[8];
+ int i,j;
+ GSM_Bitmap copy;
+
+ copy=*bitmap;
+
+ GSM_ResizeBitmap(©,GSM_CallerLogo);
+
+ header[6]=copy.width;
+ header[8]=copy.height;
+
+ fwrite(header,1,sizeof(header),file);
+
+ for (i=0; i<copy.size; i++) {
+ for (j=7; j>=0;j--)
+ if ((copy.bitmap[i]&(1<<j))>0) {
+ buffer[7-j] = '1';
+ } else {
+ buffer[7-j] = '0';
+ }
+ fwrite(buffer,1,8,file);
+ }
+}
+
+void savenol(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ char header[]={'N','O','L',0x00,0x01,0x00,
+ 0x00,0x00, /* MCC */
+ 0x00,0x00, /* MNC */
+ 0x00,0x00, /* Width */
+ 0x00,0x00, /* Height */
+ 0x01,0x00,0x01,0x00,
+ 0x00, /* Unknown.Can't be checksum - for */
+ /* the same logo files can be different */
+ 0x00};
+ char buffer[8];
+ int i,j,country,net;
+ GSM_Bitmap copy;
+
+ copy=*bitmap;
+
+ GSM_ResizeBitmap(©,GSM_OperatorLogo);
+
+ sscanf(copy.netcode, "%d %d", &country, &net);
+
+ header[6]=country%256;
+ header[7]=country/256;
+ header[8]=net%256;
+ header[9]=net/256;
+ header[10]=copy.width;
+ header[12]=copy.height;
+
+ fwrite(header,1,sizeof(header),file);
+
+ for (i=0; i<copy.size; i++) {
+ for (j=7; j>=0;j--)
+ if ((copy.bitmap[i]&(1<<j))>0) {
+ buffer[7-j] = '1';
+ } else {
+ buffer[7-j] = '0';
+ }
+ fwrite(buffer,1,8,file);
+ }
+}
+
+void savensl(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ u8 header[]={'F','O','R','M', 0x01,0xFE, /* File ID block, size 1*256+0xFE=510*/
+ 'N','S','L','D', 0x01,0xF8}; /* Startup Logo block, size 1*256+0xF8=504*/
+ GSM_Bitmap copy;
+
+ copy=*bitmap;
+
+ GSM_ResizeBitmap(©,GSM_StartupLogo);
+
+ fwrite(header,1,sizeof(header),file);
+
+ fwrite(copy.bitmap,1,copy.size,file);
+}
+
+void saveota(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ char header[]={0x01,
+ 0x00, /* Width */
+ 0x00, /* Height */
+ 0x01};
+ GSM_Bitmap copy;
+
+ copy=*bitmap;
+
+ header[1]=copy.width;
+ header[2]=copy.height;
+
+ fwrite(header,1,sizeof(header),file);
+
+ fwrite(copy.bitmap,1,copy.size,file);
+}
+
+void savenlm(FILE *file, GSM_Bitmap *bitmap)
+{
+
+ char header[]={'N','L','M', /* Nokia Logo Manager file ID. */
+ 0x20,
+ 0x01,
+ 0x00, /* 0x00 (OP), 0x01 (CLI), 0x02 (Startup), 0x03 (Picture)*/
+ 0x00, /* Number of images inside file - 1. 0x01==2 images, 0x03==4 images, etc. */
+ 0x00, /* Width. */
+ 0x00, /* Height. */
+ 0x01};
+
+ unsigned char buffer[1000];
+ int x,y,pos,pos2;
+ div_t division;
+ GSM_Bitmap copy;
+
+ copy=*bitmap;
+
+ switch (copy.type) {
+ case GSM_OperatorLogo : header[5]=0x00; break;
+ case GSM_7110OperatorLogo: header[5]=0x00; break;
+ case GSM_CallerLogo : header[5]=0x01; break;
+ case GSM_StartupLogo : header[5]=0x02; break;
+ case GSM_7110StartupLogo : header[5]=0x02; break;
+ case GSM_6210StartupLogo : header[5]=0x02; break;
+ case GSM_PictureImage : header[5]=0x03; break;
+ case GSM_WelcomeNoteText : break;
+ case GSM_DealerNoteText : break;
+ case GSM_None : break;
+ }
+
+ header[7]=copy.width;
+ header[8]=copy.height;
+
+ pos=0;pos2=7;
+ for (y=0;y<copy.height;y++) {
+ for (x=0;x<copy.width;x++) {
+ if (pos2==7) buffer[pos]=0;
+
+ if (GSM_IsPointBitmap(©,x,y)) buffer[pos]|=(1<<pos2);
+
+ pos2--;
+ if (pos2<0) {pos2=7;pos++;} //going to new line
+ }
+ if (pos2!=7) {pos2=7;pos++;} //for startup logos - new line with new byte
+ }
+
+ division=div(copy.width,8);
+ if (division.rem!=0) division.quot++; /* For startup logos */
+
+ fwrite(header,1,sizeof(header),file);
+
+ fwrite(buffer,1,(division.quot*copy.height),file);
+}
+
+/* mode == 0 -> overwrite
+ * mode == 1 -> ask
+ * mode == 2 -> append
+ */
+int GSM_SaveTextFile(char *FileName, char *text, int mode)
+{
+
+ FILE *file;
+
+ if (mode == 2) file = fopen(FileName, "a");
+ else file = fopen(FileName, "w");
+
+ if (!file) return -1;
+
+ fprintf(file, "%s\n\n", text);
+
+ fclose(file);
+
+ return mode;
+}
+
+GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup)
+{
+
+ FILE *file;
+
+ file = fopen(FileName, "wb");
+
+ if (!file) return(GE_CANTOPENFILE);
+
+ savelmb(file, backup);
+
+ fclose(file);
+
+ return GE_NONE;
+}
+
+void savelmbstartupentry(FILE *file, GSM_Bitmap startup, GSM_Bitmap text, bool available)
+{
+ /* Welcome note and logo header block */
+ char req[1000] = {'W','E','L',' ', /*block identifier*/
+ 00,00, /*block data size*/
+ 0x02,00,00,00,00,00,
+
+ 0x02}; /*number of blocks (like in 6110 frame)*/
+
+ int count=13;
+
+ if (!available) {
+ } else {
+ count=count+N6110_MakeStartupLogoFrame(req+13,startup);
+ }
+
+ req[count++]=0x02;
+ req[count++]=strlen(text.text);
+ memcpy(req+count,text.text,strlen(text.text));
+ count=count+strlen(text.text);
+
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+
+ fwrite(req, 1, count, file);
+}
+
+void savelmbopentry(FILE *file, GSM_Bitmap bitmap)
+{
+ /* Operator logo header block */
+ char req[500] = {'O','L','G',' ', /*block identifier*/
+ 0x88,00, /*block data size*/
+ 0x02,00,00,00,00,00,
+
+ 00};
+
+ int count=13,i;
+
+ count=count+N6110_MakeOperatorLogoFrame(req+13,bitmap);
+
+ if (bitmap.width!=0x48) {
+ req[4]=(count-7)%256;
+ req[5]=(count-7)/256;
+
+ for (i=1;i<=5;i++) req[count++]=0;
+
+ req[17]=req[17]+5; //we fix size of logo block
+ } else {
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+ }
+
+ fwrite(req, 1, count, file);
+}
+
+/* Work in progress ! */
+void savelmbspeedentry(FILE *file, GSM_SpeedDial speed)
+{
+ /* Speed dial header block */
+ char req[] = {'S','P','D',' ', /*block identifier*/
+ 0x03,00, /*block data size*/
+ 0x02,00,
+ 00, /*number of speed dial*/
+ 00,0xFF,00,
+
+ 00, /*number of speed dial*/
+ 03, /*memory type. ME=02;SM=03*/
+ 00}; /*number of location assigned to speed dial*/
+
+ req[8]=req[12]=speed.Number;
+
+ if (speed.MemoryType==GMT_ME) req[13]=2; //memory type=GMT_ME
+
+ req[14]=speed.Location;
+
+ fwrite(req, 1, 15, file);
+}
+
+void savelmbcallerentry(FILE *file, GSM_Bitmap bitmap)
+{
+ char req[500] = {'C','G','R',' ', /*block identifier*/
+ 00,00, /*block data size*/
+ 02,00,
+ 00, /*group number=0,1,etc.*/
+ 00,00,00};
+
+ int count=12;
+
+ req[8]=bitmap.number;
+
+ count=count+N6110_MakeCallerGroupFrame(req+12,bitmap);
+
+ req[count++]=0;
+
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+
+ fwrite(req, 1, count, file);
+}
+
+void savelmbpbkentry(FILE *file, GSM_PhonebookEntry entry)
+{
+ char req[500] = {'P','B','E','2', /*block identifier*/
+ 00,00, /*block data size*/
+ 00,00,
+ 00,00, /*position of phonebook entry*/
+ 03, /*memory type. ME=02;SM=03*/
+ 00,
+
+ 00,00, /*position of phonebook entry*/
+ 03, /*memory type. ME=02;SM=03*/
+ 00};
+
+ int count = 16, blocks;
+
+ req[9]=req[13] = (entry.Location >> 8);
+ req[8]=req[12] = entry.Location & 0xff;
+
+ if (entry.MemoryType==GMT_ME) req[10]=req[14]=2;
+
+ count=count+N7110_EncodePhonebookFrame(req+16, entry, &blocks);
+
+ req[4]=(count-12)%256;
+ req[5]=(count-12)/256;
+
+ fwrite(req, 1, count, file);
+}
+
+void savelmb(FILE *file, GSM_Backup *backup)
+{
+ int i;
+
+ char LMBHeader[] = {'L','M','B',' '}; /*file identifier*/
+
+ /* Phonebook header block */
+ char PBKHeader[] = {'P','B','K',' ', /*block identifier*/
+ 0x08,00, /*block data size*/
+ 0x02,00,
+ 03, /*memory type. ME=02;SM=03*/
+ 00,00,00,
+
+ 00,00, /*size of phonebook*/
+ 14, /*max length of each position*/
+ 00,00,00,00,00};
+
+ fwrite(LMBHeader, 1, sizeof(LMBHeader), file); /* Write the header of the file. */
+
+ if (backup->SIMPhonebookUsed!=0) {
+ PBKHeader[12]=backup->SIMPhonebookSize%256;
+ PBKHeader[13]=backup->SIMPhonebookSize/256;
+ fwrite(PBKHeader, 1, sizeof(PBKHeader), file);
+
+ for (i=0;i<backup->SIMPhonebookUsed;i++)
+ savelmbpbkentry(file, backup->SIMPhonebook[i]);
+ }
+
+ if (backup->PhonePhonebookUsed!=0) {
+ PBKHeader[8]=2; //memory type=GMT_ME
+ PBKHeader[12]=backup->PhonePhonebookSize%256;
+ PBKHeader[13]=backup->PhonePhonebookSize/256;
+ PBKHeader[14]=0x16; //max size of one entry
+ fwrite(PBKHeader, 1, sizeof(PBKHeader), file);
+
+ for (i=0;i<backup->PhonePhonebookUsed;i++)
+ savelmbpbkentry(file, backup->PhonePhonebook[i]);
+ }
+
+ if (backup->CallerAvailable)
+ for (i=0;i<5;i++) savelmbcallerentry(file,backup->CallerGroups[i]);
+
+// if (backup->SpeedAvailable)
+// for (i=0;i<8;i++) savelmbspeedentry(file,backup->SpeedDials[i]);
+
+ if (backup->OperatorLogoAvailable) savelmbopentry(file,backup->OperatorLogo);
+
+ savelmbstartupentry(file,backup->StartupLogo,backup->StartupText,backup->StartupLogoAvailable);
+}
+
+void loadlmbcallerentry(unsigned char *buffer, unsigned char *buffer2, GSM_Backup *backup, int number)
+{
+ int i;
+
+ backup->CallerAvailable=true;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Number %i, name \""), buffer2[0]);
+ for (i=0;i<buffer2[1];i++) {
+ fprintf(stdout, _("%c"), buffer2[i+2]);
+ }
+ fprintf(stdout, _("\"\n"));
+
+ fprintf(stdout,_(" Ringtone ID=%i\n"), buffer2[i+2]);
+
+ if (buffer2[i+3]==1) fprintf(stdout,_(" Logo enabled\n"));
+ else fprintf(stdout,_(" Logo disabled\n"));
+#endif
+
+ backup->CallerGroups[number].number=buffer2[0];
+ backup->CallerGroups[number].type=GSM_CallerLogo;
+
+ for (i=0;i<buffer2[1];i++) {
+ backup->CallerGroups[number].text[i]=buffer2[i+2];
+ }
+ backup->CallerGroups[number].text[buffer2[1]]=0;
+
+ backup->CallerGroups[number].ringtone=buffer2[i+2];
+
+ backup->CallerGroups[number].enabled=false;
+ if (buffer2[i+3]==1) backup->CallerGroups[number].enabled=true;
+
+ backup->CallerGroups[number].width=buffer2[i+7];
+ backup->CallerGroups[number].height=buffer2[i+8];
+
+ backup->CallerGroups[number].size=GSM_GetBitmapSize(&backup->CallerGroups[number]);
+
+ memcpy(backup->CallerGroups[number].bitmap,buffer2+i+10,backup->CallerGroups[number].size);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Caller logo"));
+ fprintf(stdout, _(" (size %ix%i - %i bytes)\n"),
+ backup->CallerGroups[number].width, backup->CallerGroups[number].height, backup->CallerGroups[number].size);
+ GSM_PrintBitmap(&backup->CallerGroups[number]);
+#endif
+
+}
+
+void loadlmbopentry(unsigned char *buffer, unsigned char *buffer2, GSM_Backup *backup)
+{
+ backup->OperatorLogoAvailable=true;
+
+ DecodeNetworkCode(buffer2+1, backup->OperatorLogo.netcode);
+
+ backup->OperatorLogo.text[0]=0;
+
+ backup->OperatorLogo.width=buffer2[7];
+ backup->OperatorLogo.height=buffer2[8];
+
+ backup->OperatorLogo.type=GSM_OperatorLogo;
+ if (backup->OperatorLogo.width==78) backup->OperatorLogo.type=GSM_7110OperatorLogo;
+
+ backup->OperatorLogo.size=GSM_GetBitmapSize(&backup->OperatorLogo);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" GSM operator logo (size %ix%i - %i bytes) for %s (%s) network.\n"),
+ backup->OperatorLogo.width, backup->OperatorLogo.height,
+ backup->OperatorLogo.size, backup->OperatorLogo.netcode,
+ GSM_GetNetworkName(backup->OperatorLogo.netcode));
+#endif
+
+ memcpy(backup->OperatorLogo.bitmap,buffer2+10,backup->OperatorLogo.size);
+
+#ifdef DEBUG
+ GSM_PrintBitmap(&backup->OperatorLogo);
+#endif
+
+}
+
+void loadlmbpbkentry(unsigned char *buffer, unsigned char *buffer2, GSM_Backup *backup)
+{
+ GSM_PhonebookEntry pbk;
+
+#ifdef DEBUG
+ fprintf(stdout,_(" Memory : "));
+ switch(buffer[10]) {
+ case 2: fprintf(stdout, _("(internal)\n"));break;
+ case 3: fprintf(stdout, _("(sim)\n"));break;
+ default: fprintf(stdout, _("(unknown)\n"));break;
+ }
+ fprintf(stdout,_(" Location : %i\n"),buffer2[0]+buffer2[1]*256);
+#endif
+
+ pbk.Empty = true;
+ pbk.Group = 5; /* 5 = no group as 6110 */
+ pbk.Name[0] = 0;
+ pbk.Number[0] = 0;
+ pbk.SubEntriesCount = 0;
+
+ N7110_DecodePhonebookFrame(&pbk,buffer2+4,(buffer[4]+buffer[5]*256)-4);
+
+ pbk.MemoryType=GMT_SM;
+ if (buffer[10]==2) pbk.MemoryType=GMT_ME;
+
+ pbk.Location=buffer2[0]+256*buffer2[1];
+
+ if (buffer[10]==2) backup->PhonePhonebook[backup->PhonePhonebookUsed++]=pbk;
+ else backup->SIMPhonebook [backup->SIMPhonebookUsed++] =pbk;
+}
+
+void loadlmbstartupentry(unsigned char *buffer, unsigned char *buffer2, GSM_Backup *backup)
+{
+ int i,j,z;
+
+ j=1;
+ for (i=0;i<buffer2[0];i++) {
+ switch (buffer2[j++]) {
+ case 1:
+ backup->StartupLogoAvailable=true;
+ backup->StartupLogo.height=buffer2[j++];
+ backup->StartupLogo.width=buffer2[j++];
+ backup->StartupLogo.text[0]=0;
+ backup->StartupLogo.type=GSM_StartupLogo;
+ switch (backup->StartupLogo.height) {
+ case 65:backup->StartupLogo.type=GSM_7110StartupLogo;break;
+ case 60:backup->StartupLogo.type=GSM_6210StartupLogo;break;
+ }
+ backup->StartupLogo.size=GSM_GetBitmapSize(&backup->StartupLogo);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Block 1 - startup logo (size %ix%i - %i bytes)\n"),
+ backup->StartupLogo.width, backup->StartupLogo.height, backup->StartupLogo.size);
+#endif
+
+ memcpy(backup->StartupLogo.bitmap,buffer2+j,backup->StartupLogo.size);
+#ifdef DEBUG
+ GSM_PrintBitmap(&backup->StartupLogo);
+#endif
+ j=j+backup->StartupLogo.size;
+
+ break;
+ case 2:
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Block 2 - welcome note \""));
+ for (z=0;z<buffer2[j];z++) fprintf(stdout, _("%c"),buffer2[j+z+1]);
+ fprintf(stdout, _("\"\n"));
+#endif
+ break;
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _(" Unknown block %02x\n"),buffer2[j]);
+#endif
+ break;
+ }
+ }
+}
+
+GSM_Error loadlmb(FILE *file, GSM_Backup *backup)
+{
+#ifdef DEBUG
+ int i;
+#endif
+ int number=0;
+
+ unsigned char buffer[12], buffer2[1000]; //for data from file
+
+ fread(buffer, 1, 4, file); /* Read the header of the file. */
+
+ while (fread(buffer, 1, 12, file)==12) { //while we have something to read
+
+#ifdef DEBUG
+ /* Info about block in the file */
+ fprintf(stdout, _("Block \""));
+ for (i=0;i<4;i++) {fprintf(stdout, _("%c"),buffer[i]);}
+ fprintf(stdout, _("\" ("));
+ if (memcmp(buffer, "PBK ",4)==0) {fprintf(stdout, _("Phonebook")); } else {
+ if (memcmp(buffer, "PBE2",4)==0) {fprintf(stdout, _("Phonebook entry"));} else {
+ if (memcmp(buffer, "CGR ",4)==0) {fprintf(stdout, _("Caller group")); } else {
+ if (memcmp(buffer, "SPD ",4)==0) {fprintf(stdout, _("Speed dial")); } else {
+ if (memcmp(buffer, "OLG ",4)==0) {fprintf(stdout, _("Operator logo")); } else {
+ if (memcmp(buffer, "WEL ",4)==0) {fprintf(stdout, _("Startup logo and welcome text")); } else {
+ fprintf(stdout, _("uknown - ignored"));}}}}}}
+
+ fprintf(stdout, _(") - length %i\n"), buffer[4]+buffer[5]*256);
+#endif
+
+ fread(buffer2, 1, buffer[4]+buffer[5]*256, file); //reading block data
+
+#ifdef DEBUG
+ if (memcmp(buffer, "PBK ",4)==0) { //phonebook
+ fprintf(stdout, _(" Size of phonebook %i, type %i "),(buffer2[0]+buffer2[1]*256),buffer[8]);
+ switch(buffer[8]) {
+ case 2 : fprintf(stdout, _("(internal)"));break;
+ case 3 : fprintf(stdout, _("(sim)")) ;break;
+ default: fprintf(stdout, _("(unknown)")) ;break;
+ }
+ fprintf(stdout, _(", length of each position - %i\n"),buffer2[2]);
+ }
+#endif
+
+ if (memcmp(buffer, "PBE2",4)==0) //phonebook entry
+ loadlmbpbkentry(buffer,buffer2,backup);
+
+ if (memcmp(buffer, "CGR ",4)==0) { //caller groups
+ loadlmbcallerentry(buffer,buffer2,backup,number);
+ number++;
+ }
+
+ if (memcmp(buffer, "OLG ",4)==0) //operator logo
+ loadlmbopentry(buffer,buffer2,backup);
+
+ if (memcmp(buffer, "WEL ",4)==0) //welcome blocks
+ loadlmbstartupentry(buffer,buffer2,backup);
+ }
+
+ return(GE_NONE);
+}
+
+GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup)
+{
+
+ FILE *file;
+ unsigned char buffer[300];
+ GSM_Error error;
+ GSM_Filetypes filetype=None;
+
+ file = fopen(FileName, "rb");
+
+ if (!file) return(GE_CANTOPENFILE);
+
+ fread(buffer, 1, 4, file); /* Read the header of the file. */
+
+ /* Attempt to identify filetype */
+
+ if (memcmp(buffer, "LMB ",4)==0) { /* LMB files have 'LMB ' at the start */
+ filetype=LMB;
+ } else filetype=None;
+
+ error=GE_NONE;
+
+ rewind(file);
+
+ backup->PhonePhonebookUsed=0;
+ backup->SIMPhonebookUsed=0;
+ backup->StartupLogoAvailable=false;
+ backup->StartupText.text[0]=0;
+ backup->OperatorLogoAvailable=false;
+ backup->CallerAvailable=false;
+ backup->SpeedAvailable=false;
+
+ switch (filetype) {
+ case LMB: error=loadlmb(file,backup); fclose(file); break;
+ default : error=GE_INVALIDFILEFORMAT;
+ }
+
+ return(error);
+}
+
+GSM_Error GSM_SaveBinRingtoneFile(char *FileName, GSM_BinRingtone *ringtone)
+{
+
+ FILE *file;
+
+ file = fopen(FileName, "wb");
+
+ if (!file) return(GE_CANTOPENFILE);
+
+ fwrite(ringtone->frame, 1, ringtone->length, file);
+
+ fclose(file);
+
+ return GE_NONE;
+}
--- /dev/null
+/* a little modified code from http://iki.fi/too/sw/xring/ */
+
+/* embedding modified midifile.h and midifile.c into this file */
+
+/***** midifile.h ******/
+
+struct MF {
+/* definitions for MIDI file parsing code */
+ int (*Mf_getc)(struct MF *);
+ void (*Mf_header)(struct MF *, int, int, int);
+ void (*Mf_trackstart)(struct MF *);
+ void (*Mf_trackend)(struct MF *);
+ void (*Mf_noteon)(struct MF *, int, int, int);
+ void (*Mf_noteoff)(struct MF *, int, int, int);
+ void (*Mf_pressure)(struct MF *, int, int, int);
+ void (*Mf_parameter)(struct MF *, int, int, int);
+ void (*Mf_pitchbend)(struct MF *, int, int, int);
+ void (*Mf_program)(struct MF *, int, int);
+ void (*Mf_chanpressure)(struct MF *, int, int);
+ void (*Mf_sysex)(struct MF *, int, char *);
+ void (*Mf_metamisc)(struct MF *, int, int, char * );
+ void (*Mf_seqspecific)(struct MF *, int, int, char *);
+ void (*Mf_seqnum)(struct MF *, int);
+ void (*Mf_text)(struct MF *, int, int, char *);
+ void (*Mf_eot)(struct MF *);
+ void (*Mf_timesig)(struct MF *, int, int, int, int);
+ void (*Mf_smpte)(struct MF *, int, int, int, int, int);
+ void (*Mf_tempo)(struct MF *, long);
+ void (*Mf_keysig)(struct MF *, int, int);
+ void (*Mf_arbitrary)(struct MF *, int, char *);
+ void (*Mf_error)(struct MF *, char * );
+#if 0
+/* definitions for MIDI file writing code */
+ void (*Mf_putc)(struct MF *);
+ void (*Mf_writetrack)(struct MF *);
+ void (*Mf_writetempotrack)(struct MF *);
+#endif
+ /* variables */
+ int Mf_nomerge; /* 1 => continue'ed system exclusives are */
+ /* not collapsed. */
+ long Mf_currtime; /* current time in delta-time units */
+
+/* private stuff */
+ long Mf_toberead;
+ long Mf_numbyteswritten;
+
+ char *Msgbuff; /* message buffer */
+ int Msgsize; /* Size of currently allocated Msg */
+ int Msgindex; /* index of next available location in Msg */
+
+};
+
+float mf_ticks2sec(unsigned long ticks,int division,unsigned int tempo);
+unsigned long mf_sec2ticks(float secs,int division, unsigned int tempo);
+
+void mferror(struct MF * mf, char * s);
+
+/*void mfwrite(); */
+
+
+/* MIDI status commands most significant bit is 1 */
+#define note_off 0x80
+#define note_on 0x90
+#define poly_aftertouch 0xa0
+#define control_change 0xb0
+#define program_chng 0xc0
+#define channel_aftertouch 0xd0
+#define pitch_wheel 0xe0
+#define system_exclusive 0xf0
+#define delay_packet (1111)
+
+/* 7 bit controllers */
+#define damper_pedal 0x40
+#define portamento 0x41
+#define sostenuto 0x42
+#define soft_pedal 0x43
+#define general_4 0x44
+#define hold_2 0x45
+#define general_5 0x50
+#define general_6 0x51
+#define general_7 0x52
+#define general_8 0x53
+#define tremolo_depth 0x5c
+#define chorus_depth 0x5d
+#define detune 0x5e
+#define phaser_depth 0x5f
+
+/* parameter values */
+#define data_inc 0x60
+#define data_dec 0x61
+
+/* parameter selection */
+#define non_reg_lsb 0x62
+#define non_reg_msb 0x63
+#define reg_lsb 0x64
+#define reg_msb 0x65
+
+/* Standard MIDI Files meta event definitions */
+#define meta_event 0xFF
+#define sequence_number 0x00
+#define text_event 0x01
+#define copyright_notice 0x02
+#define sequence_name 0x03
+#define instrument_name 0x04
+#define lyric 0x05
+#define marker 0x06
+#define cue_point 0x07
+#define channel_prefix 0x20
+#define end_of_track 0x2f
+#define set_tempo 0x51
+#define smpte_offset 0x54
+#define time_signature 0x58
+#define key_signature 0x59
+#define sequencer_specific 0x74
+
+/* Manufacturer's ID number */
+#define Seq_Circuits (0x01) /* Sequential Circuits Inc. */
+#define Big_Briar (0x02) /* Big Briar Inc. */
+#define Octave (0x03) /* Octave/Plateau */
+#define Moog (0x04) /* Moog Music */
+#define Passport (0x05) /* Passport Designs */
+#define Lexicon (0x06) /* Lexicon */
+#define Tempi (0x20) /* Bon Tempi */
+#define Siel (0x21) /* S.I.E.L. */
+#define Kawai (0x41)
+#define Roland (0x42)
+#define Korg (0x42)
+#define Yamaha (0x43)
+
+/* miscellaneous definitions */
+#define MThd 0x4d546864
+#define MTrk 0x4d54726b
+#define lowerbyte(x) ((unsigned char)(x & 0xff))
+#define upperbyte(x) ((unsigned char)((x & 0xff00)>>8))
+
+/* the midifile interface */
+void midifile(struct MF * mf);
+
+/***** midifile.c ******/
+
+/*
+ * midifile 1.11
+ *
+ * Read and write a MIDI file. Externally-assigned function pointers are
+ * called upon recognizing things in the file.
+ *
+ * Original release ?
+ * June 1989 - Added writing capability, M. Czeiszperger.
+ *
+ * The file format implemented here is called
+ * Standard MIDI Files, and is part of the Musical
+ * instrument Digital Interface specification.
+ * The spec is avaiable from:
+ *
+ * International MIDI Association
+ * 5316 West 57th Street
+ * Los Angeles, CA 90056
+ *
+ * An in-depth description of the spec can also be found
+ * in the article "Introducing Standard MIDI Files", published
+ * in Electronic Musician magazine, April, 1989.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+
+#ifdef WIN32
+
+ #include <windows.h>
+
+#else
+
+ #include <unistd.h>
+#endif
+
+#include "gsm-common.h"
+#include "gsm-ringtones.h"
+
+#define NULLFUNC NULL
+
+static void readheader(struct MF * mf);
+static int readtrack(struct MF * mf);
+static void chanmessage(struct MF * mf,int status,int c1,int c2);
+static void msginit(struct MF * mf);
+static void msgadd(struct MF * mf,int c);
+static void metaevent(struct MF * mf, int type);
+static void sysex(struct MF * mf);
+static int msgleng(struct MF * mf);
+static void badbyte(struct MF * mf,int c);
+static void biggermsg(struct MF * mf);
+
+
+static long readvarinum(struct MF * mf);
+static long read32bit(struct MF * mf);
+static long to32bit(int, int, int, int);
+static int read16bit(struct MF * mf);
+static int to16bit(int, int);
+static char * msg(struct MF * mf);
+
+/* The only non-static function in this file. */
+void mfread(struct MF * mf)
+{
+ if ( mf->Mf_getc == NULLFUNC )
+ mferror(mf, "mfread() called without setting Mf_getc");
+
+ readheader(mf);
+ while ( readtrack(mf) )
+ ;
+}
+
+/* for backward compatibility with the original lib */
+void midifile(struct MF * mf)
+{
+ mfread(mf);
+}
+
+/* read through the "MThd" or "MTrk" header string */
+static int readmt(struct MF * mf, char * s)
+{
+ int n = 0;
+ char *p = s;
+ int c=0;
+
+ while ( n++<4 && (c=mf->Mf_getc(mf)) != EOF ) {
+ if ( c != *p++ ) {
+ char buff[32];
+ (void) strcpy(buff, "expecting ");
+ (void) strcat(buff, s);
+ mferror(mf, buff);
+ }
+ }
+ return c;
+}
+
+/* read a single character and abort on EOF */
+static int egetc(struct MF * mf)
+{
+ int c = mf->Mf_getc(mf);
+
+ if ( c == EOF )
+ mferror(mf, "premature EOF");
+ mf->Mf_toberead--;
+ return c;
+}
+
+/* read a header chunk */
+static void readheader(struct MF * mf)
+{
+ int format, ntrks, division;
+
+ if ( readmt(mf, "MThd") == EOF )
+ return;
+
+ mf->Mf_toberead = read32bit(mf);
+ format = read16bit(mf);
+ ntrks = read16bit(mf);
+ division = read16bit(mf);
+
+ if ( mf->Mf_header )
+ (*mf->Mf_header)(mf, format,ntrks,division);
+
+ /* flush any extra stuff, in case the length of header is not 6 */
+ while ( mf->Mf_toberead > 0 )
+ (void) egetc(mf);
+}
+
+static int readtrack(struct MF * mf) /* read a track chunk */
+{
+ /* This array is indexed by the high half of a status byte. It's */
+ /* value is either the number of bytes needed (1 or 2) for a channel */
+ /* message, or 0 (meaning it's not a channel message). */
+ static int chantype[] = {
+ 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 through 0x70 */
+ 2, 2, 2, 2, 1, 1, 2, 0 /* 0x80 through 0xf0 */
+ };
+ long lookfor;
+ int c, c1, type;
+ int sysexcontinue = 0; /* 1 if last message was an unfinished sysex */
+ int running = 0; /* 1 when running status used */
+ int status = 0; /* status value (e.g. 0x90==note-on) */
+ int needed;
+
+ if ( readmt(mf, "MTrk") == EOF )
+ return(0);
+
+ mf->Mf_toberead = read32bit(mf);
+ mf->Mf_currtime = 0;
+
+ if ( mf->Mf_trackstart )
+ (*mf->Mf_trackstart)(mf);
+
+ while ( mf->Mf_toberead > 0 ) {
+
+ mf->Mf_currtime += readvarinum(mf); /* delta time */
+
+ c = egetc(mf);
+
+ if ( sysexcontinue && c != 0xf7 )
+ mferror(mf, "didn't find expected continuation of a sysex");
+
+ if ( (c & 0x80) == 0 ) { /* running status? */
+ if ( status == 0 )
+ mferror(mf, "unexpected running status");
+ running = 1;
+ }
+ else {
+ status = c;
+ running = 0;
+ }
+
+ needed = chantype[ (status>>4) & 0xf ];
+
+ if ( needed ) { /* ie. is it a channel message? */
+
+ if ( running )
+ c1 = c;
+ else
+ c1 = egetc(mf);
+ chanmessage(mf, status, c1, (needed>1)? egetc(mf): 0);
+ continue;;
+ }
+
+ switch ( c ) {
+
+ case 0xff: /* meta event */
+
+ type = egetc(mf);
+ lookfor = mf->Mf_toberead - readvarinum(mf);
+ msginit(mf);
+
+ while ( mf->Mf_toberead > lookfor )
+ msgadd(mf, egetc(mf));
+
+ metaevent(mf, type);
+ break;
+
+ case 0xf0: /* start of system exclusive */
+
+ lookfor = mf->Mf_toberead - readvarinum(mf);
+ msginit(mf);
+ msgadd(mf, 0xf0);
+
+ while ( mf->Mf_toberead > lookfor )
+ msgadd(mf, c=egetc(mf));
+
+ if ( c==0xf7 || mf->Mf_nomerge==0 )
+ sysex(mf);
+ else
+ sysexcontinue = 1; /* merge into next msg */
+ break;
+
+ case 0xf7: /* sysex continuation or arbitrary stuff */
+
+ lookfor = mf->Mf_toberead - readvarinum(mf);
+
+ if ( ! sysexcontinue )
+ msginit(mf);
+
+ while ( mf->Mf_toberead > lookfor )
+ msgadd(mf, c=egetc(mf));
+
+ if ( ! sysexcontinue ) {
+ if ( mf->Mf_arbitrary )
+ (*mf->Mf_arbitrary)(mf, msgleng(mf),msg(mf));
+ }
+ else if ( c == 0xf7 ) {
+ sysex(mf);
+ sysexcontinue = 0;
+ }
+ break;
+ default:
+ badbyte(mf, c);
+ break;
+ }
+ }
+ if ( mf->Mf_trackend )
+ (*mf->Mf_trackend)(mf);
+ return(1);
+}
+
+static void badbyte(struct MF * mf,int c)
+{
+ char buff[32];
+
+ (void) sprintf(buff,"unexpected byte: 0x%02x",c);
+ mferror(mf, buff);
+}
+
+static void metaevent(struct MF * mf, int type)
+{
+ int leng = msgleng(mf);
+ char *m = msg(mf);
+
+ switch ( type ) {
+ case 0x00:
+ if ( mf->Mf_seqnum )
+ (*mf->Mf_seqnum)(mf, to16bit(m[0],m[1]));
+ break;
+ case 0x01: /* Text event */
+ case 0x02: /* Copyright notice */
+ case 0x03: /* Sequence/Track name */
+ case 0x04: /* Instrument name */
+ case 0x05: /* Lyric */
+ case 0x06: /* Marker */
+ case 0x07: /* Cue point */
+ case 0x08:
+ case 0x09:
+ case 0x0a:
+ case 0x0b:
+ case 0x0c:
+ case 0x0d:
+ case 0x0e:
+ case 0x0f:
+ /* These are all text events */
+ if ( mf->Mf_text )
+ (*mf->Mf_text)(mf, type,leng,m);
+ break;
+ case 0x2f: /* End of Track */
+ if ( mf->Mf_eot )
+ (*mf->Mf_eot)(mf);
+ break;
+ case 0x51: /* Set tempo */
+ if ( mf->Mf_tempo )
+ (*mf->Mf_tempo)(mf, to32bit(0,m[0],m[1],m[2]));
+ break;
+ case 0x54:
+ if ( mf->Mf_smpte )
+ (*mf->Mf_smpte)(mf, m[0],m[1],m[2],m[3],m[4]);
+ break;
+ case 0x58:
+ if ( mf->Mf_timesig )
+ (*mf->Mf_timesig)(mf, m[0],m[1],m[2],m[3]);
+ break;
+ case 0x59:
+ if ( mf->Mf_keysig )
+ (*mf->Mf_keysig)(mf, m[0],m[1]);
+ break;
+ case 0x7f:
+ if ( mf->Mf_seqspecific )
+ (*mf->Mf_seqspecific)(mf, type, leng, m);
+ break;
+ default:
+ if ( mf->Mf_metamisc )
+ (*mf->Mf_metamisc)(mf, type,leng,m);
+ }
+}
+
+static void sysex(struct MF * mf)
+{
+ if ( mf->Mf_sysex )
+ (*mf->Mf_sysex)(mf, msgleng(mf),msg(mf));
+}
+
+static void chanmessage(struct MF * mf,int status,int c1,int c2)
+{
+ int chan = status & 0xf;
+
+ switch ( status & 0xf0 ) {
+ case 0x80:
+ if ( mf->Mf_noteoff )
+ (*mf->Mf_noteoff)(mf, chan,c1,c2);
+ break;
+ case 0x90:
+ if ( mf->Mf_noteon )
+ (*mf->Mf_noteon)(mf, chan,c1,c2);
+ break;
+ case 0xa0:
+ if ( mf->Mf_pressure )
+ (*mf->Mf_pressure)(mf, chan,c1,c2);
+ break;
+ case 0xb0:
+ if ( mf->Mf_parameter )
+ (*mf->Mf_parameter)(mf, chan,c1,c2);
+ break;
+ case 0xe0:
+ if ( mf->Mf_pitchbend )
+ (*mf->Mf_pitchbend)(mf, chan,c1,c2);
+ break;
+ case 0xc0:
+ if ( mf->Mf_program )
+ (*mf->Mf_program)(mf, chan,c1);
+ break;
+ case 0xd0:
+ if ( mf->Mf_chanpressure )
+ (*mf->Mf_chanpressure)(mf, chan,c1);
+ break;
+ }
+}
+
+/* readvarinum - read a varying-length number, and return the */
+/* number of characters it took. */
+
+static long readvarinum(struct MF * mf)
+{
+ long value;
+ int c;
+
+ c = egetc(mf);
+ value = c;
+ if ( c & 0x80 ) {
+ value &= 0x7f;
+ do {
+ c = egetc(mf);
+ value = (value << 7) + (c & 0x7f);
+ } while (c & 0x80);
+ }
+ return (value);
+}
+
+static long to32bit(int c1,int c2,int c3,int c4)
+{
+ long value = 0L;
+
+ value = (c1 & 0xff);
+ value = (value<<8) + (c2 & 0xff);
+ value = (value<<8) + (c3 & 0xff);
+ value = (value<<8) + (c4 & 0xff);
+ return (value);
+}
+
+static int to16bit(int c1,int c2)
+{
+ return ((c1 & 0xff ) << 8) + (c2 & 0xff);
+}
+
+static long read32bit(struct MF * mf)
+{
+ int c1, c2, c3, c4;
+
+ c1 = egetc(mf);
+ c2 = egetc(mf);
+ c3 = egetc(mf);
+ c4 = egetc(mf);
+ return to32bit(c1,c2,c3,c4);
+}
+
+static int read16bit(struct MF * mf)
+{
+ int c1, c2;
+ c1 = egetc(mf);
+ c2 = egetc(mf);
+ return to16bit(c1,c2);
+}
+
+/* static */
+void mferror(struct MF * mf, char * s)
+{
+ if ( mf->Mf_error )
+ (*mf->Mf_error)(mf, s);
+ exit(1);
+}
+
+/* The code below allows collection of a system exclusive message of */
+/* arbitrary length. The Msgbuff is expanded as necessary. The only */
+/* visible data/routines are msginit(), msgadd(), msg(), msgleng(). */
+
+#define MSGINCREMENT 128
+
+static void msginit(struct MF * mf)
+{
+ mf->Msgindex = 0;
+}
+
+static char * msg(struct MF * mf)
+{
+ return(mf->Msgbuff);
+}
+
+static int msgleng(struct MF * mf)
+{
+ return(mf->Msgindex);
+}
+
+static void msgadd(struct MF * mf,int c)
+{
+ /* If necessary, allocate larger message buffer. */
+ if ( mf->Msgindex >= mf->Msgsize )
+ biggermsg(mf);
+ mf->Msgbuff[mf->Msgindex++] = c;
+}
+
+static void biggermsg(struct MF * mf)
+{
+ char *newmess;
+ char *oldmess = mf->Msgbuff;
+ int oldleng = mf->Msgsize;
+
+ mf->Msgsize += MSGINCREMENT;
+ newmess = (char *) malloc( (unsigned)(sizeof(char) * mf->Msgsize) );
+
+ if(newmess == NULL)
+ mferror(mf, "malloc error!");
+
+ /* copy old message into larger new one */
+ if ( oldmess != NULL ) {
+ register char *p = newmess;
+ register char *q = oldmess;
+ register char *endq = &oldmess[oldleng];
+
+ for ( ; q!=endq ; p++,q++ )
+ *p = *q;
+ free(oldmess);
+ }
+ mf->Msgbuff = newmess;
+}
+
+#if 0 /* saving time not converting write function at this time
+ */
+/*
+ * mfwrite() - The only fuction you'll need to call to write out
+ * a midi file.
+ *
+ * format 0 - Single multi-channel track
+ * 1 - Multiple simultaneous tracks
+ * 2 - One or more sequentially independent
+ * single track patterns
+ * ntracks The number of tracks in the file.
+ * division This is kind of tricky, it can represent two
+ * things, depending on whether it is positive or negative
+ * (bit 15 set or not). If bit 15 of division is zero,
+ * bits 14 through 0 represent the number of delta-time
+ * "ticks" which make up a quarter note. If bit 15 of
+ * division is a one, delta-times in a file correspond to
+ * subdivisions of a second similiar to SMPTE and MIDI
+ * time code. In this format bits 14 through 8 contain
+ * one of four values - 24, -25, -29, or -30,
+ * corresponding to the four standard SMPTE and MIDI
+ * time code frame per second formats, where -29
+ * represents 30 drop frame. The second byte
+ * consisting of bits 7 through 0 corresponds the the
+ * resolution within a frame. Refer the Standard MIDI
+ * Files 1.0 spec for more details.
+ * fp This should be the open file pointer to the file you
+ * want to write. It will have be a global in order
+ * to work with Mf_putc.
+ */
+void
+mfwrite(format,ntracks,division,fp)
+int format,ntracks,division;
+FILE *fp;
+{
+ int i; void mf_write_track_chunk(), mf_write_header_chunk();
+
+ if ( mf->Mf_putc == NULLFUNC )
+ mferror(mf, "mfmf_write() called without setting Mf_putc");
+
+ if ( mf->Mf_writetrack == NULLFUNC )
+ mferror(mf, "mfmf_write() called without setting Mf_mf_writetrack");
+
+ /* every MIDI file starts with a header */
+ mf_write_header_chunk(format,ntracks,division);
+
+ /* In format 1 files, the first track is a tempo map */
+ if(format == 1 && ( mf->Mf_writetempotrack ))
+ {
+ (*mf->Mf_writetempotrack)();
+ }
+
+ /* The rest of the file is a series of tracks */
+ for(i = 0; i < ntracks; i++)
+ mf_write_track_chunk(i,fp);
+}
+
+void
+mf_write_track_chunk(which_track,fp)
+int which_track;
+FILE *fp;
+{
+ unsigned long trkhdr,trklength;
+ long offset, place_marker;
+ void write16bit(),write32bit();
+
+
+ trkhdr = MTrk;
+ trklength = 0;
+
+ /* Remember where the length was written, because we don't
+ know how long it will be until we've finished writing */
+ offset = ftell(fp);
+
+#ifdef DEBUG
+ printf("offset = %d\n",(int) offset);
+#endif
+
+ /* Write the track chunk header */
+ write32bit(trkhdr);
+ write32bit(trklength);
+
+ mf->Mf_numbyteswritten = 0L; /* the header's length doesn't count */
+
+ if( mf->Mf_writetrack )
+ {
+ (*mf->Mf_writetrack)(which_track);
+ }
+
+ /* mf_write End of track meta event */
+ eputc(mf, 0);
+ eputc(mf, meta_event);
+ eputc(mf, end_of_track);
+
+ eputc(mf, 0);
+
+ /* It's impossible to know how long the track chunk will be beforehand,
+ so the position of the track length data is kept so that it can
+ be written after the chunk has been generated */
+ place_marker = ftell(fp);
+
+ /* This method turned out not to be portable because the
+ parameter returned from ftell is not guaranteed to be
+ in bytes on every machine */
+ /* track.length = place_marker - offset - (long) sizeof(track); */
+
+#ifdef DEBUG
+printf("length = %d\n",(int) trklength);
+#endif
+
+ if(fseek(fp,offset,0) < 0)
+ mferror(mf, "error seeking during final stage of write");
+
+ trklength = mf->Mf_numbyteswritten;
+
+ /* Re-mf_write the track chunk header with right length */
+ write32bit(trkhdr);
+ write32bit(trklength);
+
+ fseek(fp,place_marker,0);
+} /* End gen_track_chunk() */
+
+
+void
+mf_write_header_chunk(format,ntracks,division)
+int format,ntracks,division;
+{
+ unsigned long ident,length;
+ void write16bit(),write32bit();
+
+ ident = MThd; /* Head chunk identifier */
+ length = 6; /* Chunk length */
+
+ /* individual bytes of the header must be written separately
+ to preserve byte order across cpu types :-( */
+ write32bit(ident);
+ write32bit(length);
+ write16bit(format);
+ write16bit(ntracks);
+ write16bit(division);
+} /* end gen_header_chunk() */
+
+
+#ifdef WHENISTHISNEEDED
+/*
+ * mf_write_midi_event()
+ *
+ * Library routine to mf_write a single MIDI track event in the standard MIDI
+ * file format. The format is:
+ *
+ * <delta-time><event>
+ *
+ * In this case, event can be any multi-byte midi message, such as
+ * "note on", "note off", etc.
+ *
+ * delta_time - the time in ticks since the last event.
+ * type - the type of meta event.
+ * chan - The midi channel.
+ * data - A pointer to a block of chars containing the META EVENT,
+ * data.
+ * size - The length of the meta-event data.
+ */
+int
+mf_write_midi_event(delta_time, type, chan, data, size)
+unsigned long delta_time;
+unsigned int chan,type;
+unsigned long size;
+unsigned char *data;
+{
+ int i;
+ void WriteVarLen();
+ unsigned char c;
+
+ WriteVarLen(delta_time);
+
+ /* all MIDI events start with the type in the first four bits,
+ and the channel in the lower four bits */
+ c = type | chan;
+
+ if(chan > 15)
+ perror("error: MIDI channel greater than 16\n");
+
+ eputc(mf, c);
+
+ /* write out the data bytes */
+ for(i = 0; i < size; i++)
+ eputc(mf, data[i]);
+
+ return(size);
+} /* end mf_write MIDI event */
+
+/*
+ * mf_write_meta_event()
+ *
+ * Library routine to mf_write a single meta event in the standard MIDI
+ * file format. The format of a meta event is:
+ *
+ * <delta-time><FF><type><length><bytes>
+ *
+ * delta_time - the time in ticks since the last event.
+ * type - the type of meta event.
+ * data - A pointer to a block of chars containing the META EVENT,
+ * data.
+ * size - The length of the meta-event data.
+ */
+int
+mf_write_meta_event(delta_time, type, data, size)
+unsigned long delta_time;
+unsigned char *data,type;
+unsigned long size;
+{
+ int i;
+
+ WriteVarLen(delta_time);
+
+ /* This marks the fact we're writing a meta-event */
+ eputc(mf, meta_event);
+
+ /* The type of meta event */
+ eputc(mf, type);
+
+ /* The length of the data bytes to follow */
+ WriteVarLen(size);
+
+ for(i = 0; i < size; i++)
+ {
+ if(eputc(mf, data[i]) != data[i])
+ return(-1);
+ }
+ return(size);
+} /* end mf_write_meta_event */
+
+void
+mf_write_tempo(tempo)
+unsigned long tempo;
+{
+ /* Write tempo */
+ /* all tempos are written as 120 beats/minute, */
+ /* expressed in microseconds/quarter note */
+ eputc(mf, 0);
+ eputc(mf, meta_event);
+ eputc(mf, set_tempo);
+
+ eputc(mf, 3);
+ eputc(mf, (unsigned)(0xff & (tempo >> 16)));
+ eputc(mf, (unsigned)(0xff & (tempo >> 8)));
+ eputc(mf, (unsigned)(0xff & tempo));
+}
+
+#endif
+/*
+ * Write multi-length bytes to MIDI format files
+ */
+void
+WriteVarLen(value)
+unsigned long value;
+{
+ unsigned long buffer;
+
+ buffer = value & 0x7f;
+ while((value >>= 7) > 0)
+ {
+ buffer <<= 8;
+ buffer |= 0x80;
+ buffer += (value & 0x7f);
+ }
+ while(1){
+ eputc(mf, (unsigned)(buffer & 0xff));
+
+ if(buffer & 0x80)
+ buffer >>= 8;
+ else
+ return;
+ }
+}/* end of WriteVarLen */
+
+
+/*
+ * write32bit()
+ * write16bit()
+ *
+ * These routines are used to make sure that the byte order of
+ * the various data types remains constant between machines. This
+ * helps make sure that the code will be portable from one system
+ * to the next. It is slightly dangerous that it assumes that longs
+ * have at least 32 bits and ints have at least 16 bits, but this
+ * has been true at least on PCs, UNIX machines, and Macintosh's.
+ *
+ */
+void
+write32bit(data)
+unsigned long data;
+{
+ eputc(mf, x(unsigned)((data >> 24) & 0xff));
+ eputc(mf, (unsigned)((data >> 16) & 0xff));
+ eputc(mf, (unsigned)((data >> 8 ) & 0xff));
+ eputc(mf, (unsigned)(data & 0xff));
+}
+
+void
+write16bit(data)
+int data;
+{
+ eputc(mf, (unsigned)((data & 0xff00) >> 8));
+ eputc(mf, (unsigned)(data & 0xff));
+}
+
+/* write a single character and abort on error */
+eputc(mf, c)
+unsigned char c;
+{
+ int return_val;
+
+ if((mf->Mf_putc) == NULLFUNC)
+ {
+ mferror(mf, "Mf_putc undefined");
+ return(-1);
+ }
+
+ return_val = (mf->Mf_putc)(mf, c);
+
+ if ( return_val == EOF )
+ mferror(mf, "error writing");
+
+ mf->Mf_numbyteswritten++;
+ return(return_val);
+}
+
+#endif
+
+unsigned long mf_sec2ticks(float secs,int division, unsigned int tempo)
+{
+ return (long)(((secs * 1000.0) / 4.0 * division) / tempo);
+}
+
+
+/*
+ * This routine converts delta times in ticks into seconds. The
+ * else statement is needed because the formula is different for tracks
+ * based on notes and tracks based on SMPTE times.
+ *
+ */
+float mf_ticks2sec(unsigned long ticks,int division,unsigned int tempo)
+{
+ float smpte_format, smpte_resolution;
+
+ if(division > 0)
+ return ((float) (((float)(ticks) * (float)(tempo)) / ((float)(division) * 1000000.0)));
+ else
+ {
+ smpte_format = upperbyte(division);
+ smpte_resolution = lowerbyte(division);
+ return (float) ((float) ticks / (smpte_format * smpte_resolution * 1000000.0));
+ }
+} /* end of ticks2sec() */
+
+/* code to utilize the interface */
+
+#define TRACE(x, y) do { if (x) printf y; } while (0)
+
+
+typedef unsigned long ulg;
+typedef unsigned char uch;
+typedef unsigned int ui;
+
+struct NoteInfo
+{
+ int beats;
+ int nrnotes;
+ struct Notes {
+ ui note : 4;
+ ui scale : 4;
+ ui length : 4;
+ ui lextra : 4;
+ } note[1];
+};
+
+#define IBUFSIZE 1024
+struct MFX
+{
+ struct MF mfi;
+ struct NoteInfo * ni;
+ int allocated;
+
+ int division;
+ int trackstate;
+
+ int prevnoteonpitch; /* -1, nothing, 0 pause, 1-x note. */
+ ulg prevnoteontime;
+
+ struct {
+ int fd;
+ uch buf[IBUFSIZE];
+ int len;
+ int p;
+ } istrm;
+};
+
+enum { TRK_NONE, TRK_READING, TRK_FINISHED };
+
+#define ALLOCSIZE 256
+
+#define NIALLOC(size) (struct NoteInfo *)malloc(sizeof (struct NoteInfo) + ((size) - 1) * sizeof (struct Notes))
+
+#define NIREALLOC(ni, size) (struct NoteInfo *)realloc((ni), sizeof (struct NoteInfo) + ((size) - 1) * sizeof (struct Notes))
+
+
+static void lm_error(struct MF * mf, char * s);
+
+static int lm_getc(struct MF * mf);
+static void lm_header(struct MF * mf, int, int, int);
+static void lm_trackstart(struct MF * mf);
+static void lm_trackend(struct MF * mf);
+static void lm_tempo(struct MF *, long);
+static void lm_noteon(struct MF *, int, int, int);
+static void lm_noteoff(struct MF *, int, int, int);
+
+
+struct NoteInfo * readmidi(int fd)
+{
+ struct MFX mfxi = { { 0 } };
+ struct MF * mf = (struct MF *)&mfxi;
+
+ mfxi.ni = NIALLOC(ALLOCSIZE);
+ mfxi.allocated = ALLOCSIZE;
+
+ /* set variables to their initial values */
+ mfxi.division = 0;
+ mfxi.trackstate = TRK_NONE;
+ mfxi.prevnoteonpitch = -1;
+ mfxi.ni->nrnotes = 0;
+ mfxi.ni->beats = 120;
+
+ mfxi.istrm.fd = fd;
+ mfxi.istrm.p = mfxi.istrm.len = 0;
+ mf->Mf_getc = lm_getc;
+
+ mf->Mf_header = lm_header;
+ mf->Mf_tempo = lm_tempo;
+ mf->Mf_trackstart = lm_trackstart;
+ mf->Mf_trackend = lm_trackend;
+ mf->Mf_noteon = lm_noteon;
+ mf->Mf_noteoff = lm_noteoff;
+
+ mf->Mf_error = lm_error;
+
+ midifile(mf);
+
+ return mfxi.ni;
+}
+
+static void lm_error(struct MF * mf, char * s)
+{
+ fprintf(stderr, "%s\n", s);
+}
+
+static int lm_getc(struct MF * mf)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+
+ /* printf("p %d, len %d\n", mfx->istrm.p, mfx->istrm.len); */
+ if (mfx->istrm.p == mfx->istrm.len)
+ {
+ mfx->istrm.len = read(mfx->istrm.fd, mfx->istrm.buf, IBUFSIZE);
+ /* printf("readlen %d\n", mfx->istrm.len); */
+ if (mfx->istrm.len <= 0)
+ return -1;
+
+ mfx->istrm.p = 1;
+ return mfx->istrm.buf[0];
+ }
+ /* else */
+ return mfx->istrm.buf[mfx->istrm.p++];
+}
+
+static void lm_header(struct MF * mf, int format, int ntrks, int division)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+
+ TRACE(0, ("lm_header(%p, %d, %d, %d)\n", mf, format, ntrks, division));
+
+ mfx->division = division;
+}
+
+/* this is just a quess */
+static void lm_tempo(struct MF * mf, long tempo)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+
+ TRACE(0, ("lm_tempo(%p, %ld)\n", mf, tempo));
+
+ if (mfx->trackstate != TRK_FINISHED)
+ mfx->ni->beats = 60000000 / tempo;
+}
+
+
+static void addnote(struct MFX * mfx, int pitch, int duration, int special)
+{
+ int nr, p, s;
+ struct NoteInfo * ni;
+
+ if (mfx->ni->nrnotes == mfx->allocated)
+ {
+ mfx->allocated += ALLOCSIZE;
+ mfx->ni = NIREALLOC(mfx->ni, mfx->allocated);
+ if (mfx->ni == NULL)
+ exit(1);
+ }
+ ni = mfx->ni; /* mfx->ni pointer value may have changed above */
+ nr = ni->nrnotes++;
+
+
+ if (pitch == 0) { p = 0; s = 0; }
+ else { pitch--; p = (pitch % 12) + 1; s = pitch / 12; }
+
+ ni->note[nr].note = p;
+ ni->note[nr].scale = s;
+
+ ni->note[nr].length = duration;
+ ni->note[nr].lextra = special;
+}
+
+/* currently supported */
+static /* N 32 32. 16 16. 8 8. 4 4. 2 2. 1 1. */
+int vals[] = { 15, 38, 54, 78, 109, 156, 218, 312, 437, 625, 875, 1250 };
+
+static void writenote(struct MFX * mfx, int delta)
+{
+ ulg millinotetime = delta * 250 / mfx->division;
+ int i;
+ int duration;
+ int special;
+
+ for(i = 0; i < sizeof vals / sizeof vals[0]; i++)
+ {
+ if (millinotetime < vals[i])
+ break;
+ }
+
+ if (i == 0)
+ return;
+
+ i--;
+ duration = i / 2;
+ special = i & 1;
+
+ addnote(mfx, mfx->prevnoteonpitch, duration, special); /* XXX think this */
+}
+
+
+static void lm_trackstart(struct MF * mf)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+
+ TRACE(0, ("lm_trackstart(%p)\n", mf));
+
+ if (mfx->trackstate == TRK_NONE)
+ mfx->trackstate = TRK_READING;
+
+ mfx->prevnoteonpitch = -1;
+}
+
+static void lm_trackend(struct MF * mf)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+ long time = mf->Mf_currtime;
+
+ TRACE(0, ("lm_trackend(%p)\n", mf));
+
+ if (mfx->trackstate == TRK_READING && mfx->ni->nrnotes > 0)
+ mfx->trackstate = TRK_FINISHED;
+
+ if (mfx->prevnoteonpitch >= 0)
+ writenote(mfx, time - mfx->prevnoteontime);
+
+ mfx->prevnoteonpitch = -1;
+}
+
+static void lm_noteon(struct MF * mf, int chan, int pitch, int vol)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+ long time = mf->Mf_currtime;
+
+ TRACE(0, ("lm_noteon(%p, %d, %d, %d)\n", mf, chan, pitch, vol));
+
+ if (vol == 0) /* kludge? to handle some (format 1? midi files) */
+ return;
+
+ if (mfx->trackstate != TRK_READING)
+ return;
+
+ if (mfx->prevnoteonpitch >= 0)
+ writenote(mfx, time - mfx->prevnoteontime);
+
+ if (vol == 0)
+ mfx->prevnoteonpitch = 0;
+ else
+ mfx->prevnoteonpitch = pitch + 1;
+
+ mfx->prevnoteontime = time;
+}
+
+static void lm_noteoff(struct MF * mf, int chan, int pitch, int vol)
+{
+ struct MFX * mfx = (struct MFX *)mf;
+ long time = mf->Mf_currtime;
+
+ TRACE(0, ("lm_noteoff(%p, %d, %d, %d)\n", mf, chan, pitch, vol));
+
+ if (mfx->prevnoteonpitch >= 0)
+ {
+ writenote(mfx, time - mfx->prevnoteontime);
+ mfx->prevnoteonpitch = -1;
+ }
+ mfx->prevnoteonpitch = 0;
+ mfx->prevnoteontime = time;
+}
+
+//{ "p", "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
+char notes[] =
+ { 255, 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11 , 12 };
+
+u8 lengths[] = { 4, 8, 16, 32, 64, 128 };
+
+static void countdefaults(struct NoteInfo * ni, int * length_p, int * scale_p)
+{
+ int lengths[15] = { 0 };
+ int scales[15] = { 0 };
+ int maxlenval = 0; /* (*) */
+ int maxscaleval = 0;
+ int i;
+
+ for (i = 0; i < ni->nrnotes; i++)
+ {
+ struct Notes * note = &ni->note[i];
+
+ lengths[note->length]++;
+ scales[note->scale]++;
+ }
+
+ maxlenval = lengths[0]; /* (*) smart compiler eliminates dead code */
+ *length_p = 0;
+
+ for (i = 1; i < 15; i++) /* `p' incremented scales[0], therefore ignored */
+ {
+ TRACE(0, ("%d - len: %d, scale: %d\n", i, lengths[i], scales[i]));
+
+ if (lengths[i] > maxlenval) {
+ *length_p = i;
+ maxlenval = lengths[i];
+ }
+ if (scales[i] > maxscaleval) {
+ *scale_p = i;
+ maxscaleval = scales[i];
+ }
+ }
+}
+
+GSM_Error loadmid(char *filename, GSM_Ringtone *ringtone)
+{
+ int fd;
+ struct NoteInfo * ni;
+ int i;
+ int deflen, defscale;
+
+#ifdef WIN32
+ if ((fd = open(filename, O_RDONLY | O_BINARY)) < 0)
+ {
+ perror("open");
+ return GE_CANTOPENFILE;
+ }
+#else
+ if ((fd = open(filename, O_RDONLY)) < 0)
+ {
+ perror("open");
+ return GE_CANTOPENFILE;
+ }
+#endif
+
+ ni = readmidi(fd);
+
+ if (ni == NULL)
+ return 0;
+
+ countdefaults(ni, &deflen, &defscale);
+
+ strcpy(ringtone->name,"GNOKII");
+
+ if (ni->nrnotes<MAX_RINGTONE_NOTES)
+ ringtone->NrNotes=ni->nrnotes;
+ else
+ ringtone->NrNotes=MAX_RINGTONE_NOTES;
+
+ for (i = 0; i < ringtone->NrNotes; i++)
+ {
+ struct Notes * note = &ni->note[i];
+
+ ringtone->notes[i].note=notes[note->note];
+ ringtone->notes[i].note=notes[note->note]+(note->scale%4)*14;
+
+ ringtone->notes[i].duration=lengths[note->length];
+ if (note->lextra)
+ ringtone->notes[i].duration=ringtone->notes[i].duration*1.5;
+
+ ringtone->notes[i].tempo=ni->beats;
+
+ }
+
+ ringtone->Loop=15;
+
+ return 0;
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Functions for manipulating calendar
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+ #include "misc_win32.h"
+#else
+ #include <unistd.h>
+#endif
+
+#include "gsm-api.h"
+#include "gsm-coding.h"
+
+char *GSM_GetVCALENDARStart(int version) {
+
+ static char Buffer[1000]="";
+ int len=0;
+
+ len+=sprintf(Buffer, "BEGIN:VCALENDAR%c%c",13,10);
+
+ if (version==10) sprintf(Buffer+len, "VERSION:1.0%c%c",13,10);
+ if (version==30) sprintf(Buffer+len, "VERSION:3.0%c%c",13,10);
+
+ return Buffer;
+}
+
+char *GSM_GetVCALENDARNote(GSM_CalendarNote *note, int version) {
+
+ static char Buffer[1000]="";
+
+ int len=0;
+
+ u8 buffer[50*3];
+
+ len+=sprintf(Buffer+len, "BEGIN:VEVENT%c%c",13,10);
+ len+=sprintf(Buffer+len, "CATEGORIES:");
+ switch (note->Type) {
+ case GCN_REMINDER:
+ len+=sprintf(Buffer+len, "MISCELLANEOUS%c%c",13,10);
+ break;
+ case GCN_CALL:
+ len+=sprintf(Buffer+len, "PHONE CALL%c%c",13,10);
+ break;
+ case GCN_MEETING:
+ len+=sprintf(Buffer+len, "MEETING%c%c",13,10);
+ break;
+ case GCN_BIRTHDAY:
+ len+=sprintf(Buffer+len, "SPECIAL OCCASION%c%c",13,10);
+ break;
+ default:
+ len+=sprintf(Buffer+len, "UNKNOWN%c%c",13,10);
+ break;
+ }
+
+ if( note->Type == GCN_CALL && strcmp( note->Phone, "" ) ) {
+
+ if (note->Text[0]!=0 && version==30)
+ len+=sprintf(Buffer+len, "DESCRIPTION:%s%c%c",note->Text,13,10);
+
+ EncodeUTF8(buffer,note->Phone,strlen(note->Phone));
+ if (strlen(note->Phone)==strlen(buffer)) {
+ len+=sprintf(Buffer+len, "SUMMARY:%s%c%c",note->Phone,13,10);
+ } else {
+ len+=sprintf(Buffer+len, "SUMMARY;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c",buffer,13,10);
+ }
+
+ } else {
+
+ EncodeUTF8(buffer,note->Text,strlen(note->Text));
+ if (strlen(note->Text)==strlen(buffer)) {
+ len+=sprintf(Buffer+len, "SUMMARY:%s%c%c",note->Text,13,10);
+ } else {
+ len+=sprintf(Buffer+len, "SUMMARY;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c",buffer,13,10);
+ }
+
+ }
+
+ /* For 3310: date is set to 2090! */
+ if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
+ len+=sprintf(Buffer+len, "DTSTART:1999%02d%02dT%02d%02d%02d%c%c",
+ note->Time.Month, note->Time.Day, note->Time.Hour,
+ note->Time.Minute, note->Time.Second,13,10);
+ } else {
+ len+=sprintf(Buffer+len, "DTSTART:%04d%02d%02dT%02d%02d%02d%c%c", note->Time.Year,
+ note->Time.Month, note->Time.Day, note->Time.Hour,
+ note->Time.Minute, note->Time.Second,13,10);
+ }
+
+ if (note->Alarm.Year!=0) {
+ len+=sprintf(Buffer+len, "DALARM:%04d%02d%02dT%02d%02d%02d%c%c", note->Alarm.Year,
+ note->Alarm.Month, note->Alarm.Day, note->Alarm.Hour,
+ note->Alarm.Minute, note->Alarm.Second,13,10);
+ }
+
+ if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && version==30 && note->Type == GCN_BIRTHDAY ) {
+ len+=sprintf(Buffer+len, "ALTYPE:%s%c%c", (note->AlarmType==0x00) ?
+ "TONE" : "SILENT",13,10);
+ }
+
+ if ( GetModelFeature (FN_CALENDAR)==F_CAL71 && note->Recurrance!= 0 ) {
+ switch(note->Recurrance/24) {
+ case 1 :len+=sprintf(Buffer+len, "RRULE:D1 #0%c%c",13,10);break;
+ case 7 :len+=sprintf(Buffer+len, "RRULE:W1 #0%c%c",13,10);break;
+ case 14 :len+=sprintf(Buffer+len, "RRULE:W2 #0%c%c",13,10);break;
+ case 365:len+=sprintf(Buffer+len, "RRULE:YD1 #0%c%c",13,10);break;
+ }
+ }
+
+ len+=sprintf(Buffer+len, "END:VEVENT%c%c",13,10);
+
+ return Buffer;
+}
+
+char *GSM_GetVCALENDAREnd(int version) {
+
+ static char Buffer[1000]="";
+
+ sprintf(Buffer, "END:VCALENDAR%c%c",13,10);
+
+ return Buffer;
+}
+
+int GSM_SaveCalendarNoteToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_CalendarNote *note)
+{
+ char Buffer[1000]="";
+ int length;
+ GSM_UDH UDH=GSM_NoUDH;
+
+ sprintf(Buffer,GSM_GetVCALENDARStart(10));
+ sprintf(Buffer+strlen(Buffer),GSM_GetVCALENDARNote(note,10));
+ sprintf(Buffer+strlen(Buffer),GSM_GetVCALENDAREnd(10));
+
+ /* 1 SMS: no UDH */
+ if (strlen(Buffer)<=160-8) { //8==length of ..SCKE4.
+ sprintf(Buffer,"//SCKE4 ");
+ sprintf(Buffer+strlen(Buffer),GSM_GetVCALENDARStart(10));
+ sprintf(Buffer+strlen(Buffer),GSM_GetVCALENDARNote(note,10));
+ sprintf(Buffer+strlen(Buffer),GSM_GetVCALENDAREnd(10));
+ } else {
+ UDH=GSM_CalendarNoteUDH;
+ }
+
+ length=strlen(Buffer);
+ GSM_MakeMultiPartSMS2(SMS,Buffer,length, UDH, GSM_Coding_Default);
+
+ return 0;
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "gsm-common.h"
+#include "gsm-coding.h"
+
+#ifdef WIN32
+ #include <windows.h>
+#else
+ #include "devices/device.h"
+#endif
+
+/* Coding functions */
+#define NUMBER_OF_7_BIT_ALPHABET_ELEMENTS 128
+
+#ifndef USE_NLS
+ static unsigned char GSM_DefaultAlphabet[NUMBER_OF_7_BIT_ALPHABET_ELEMENTS] = {
+
+ /* ETSI GSM 03.38, version 6.0.1, section 6.2.1; Default alphabet */
+ /* Generally table shows chars in Latin 1, but not only - Greek
+ chars are visible correctly in ... */
+
+ '@', 0xa3, '$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec, // 0x08
+ 0xf2, 0xc7, '\n', 0xd8, 0xf8, '\r', 0xc5, 0xe5,
+
+/* from v13@priest.com codes for Greek chars. Not confirmed and commented */
+// 0xc4, '_' , 0xd6, 0xc3, 0xcb, 0xd9, 0xd0, 0xd8,
+// 0xd3, 0xc8, 0xce, 0xcb, 0xc6, 0xe6, 0xdf, 0xc9, // 0x20
+
+ '?', '_', '?', '?', '?', '?', '?', '?',
+ '?', '?', '?', '?', 0xc6, 0xe6, 0xdf, 0xc9, // 0x20
+ ' ', '!', '\"', '#', 0xa4, '%', '&', '\'',
+ '(', ')', '*', '+', ',', '-', '.', '/', // 0x30
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', ':', ';', '<', '=', '>', '?', // 0x40
+ 0xa1, 'A', 'B', 'C', 'D', 'E', 'F', 'G',
+ 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O',
+ 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',
+ 'X', 'Y', 'Z', 0xc4, 0xd6, 0xd1, 0xdc, 0xa7,
+ 0xbf, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+ 'x', 'y', 'z', 0xe4, 0xf6, 0xf1, 0xfc, 0xe0
+ };
+
+ #ifndef WIN32
+ /*Simple UNICODE decoding and encoding from/to iso-8859-2
+ First version prepared by Martin Kacer <M.Kacer@sh.cvut.cz>
+
+ Following table contains triplets:
+ first unicode byte, second unicode byte, iso-8859-2 character*/
+ unsigned char unicode_table[][3] =
+ {
+ /* C< D< E< N< R< S< T< Uo Z< */
+ {0x01, 0x0C, 0xC8}, {0x01, 0x0E, 0xCF}, {0x01, 0x1A, 0xCC},
+ {0x01, 0x47, 0xD2}, {0x01, 0x58, 0xD8}, {0x01, 0x60, 0xA9},
+ {0x01, 0x64, 0xAB}, {0x01, 0x6E, 0xD9}, {0x01, 0x7D, 0xAE},
+ /* c< d< e< n< r< s< t< uo z< */
+ {0x01, 0x0D, 0xE8}, {0x01, 0x0F, 0xEF}, {0x01, 0x1B, 0xEC},
+ {0x01, 0x48, 0xF2}, {0x01, 0x59, 0xF8}, {0x01, 0x61, 0xB9},
+ {0x01, 0x65, 0xBB}, {0x01, 0x6F, 0xF9}, {0x01, 0x7E, 0xBE},
+ /* A< A, C' D/ E, L< L' L/ */
+ {0x01, 0x02, 0xC3}, {0x01, 0x04, 0xA1}, {0x01, 0x06, 0xC6},
+ {0x01, 0x10, 0xD0}, {0x01, 0x18, 0xCA}, {0x01, 0x3D, 0xA5},
+ {0x01, 0x39, 0xC5}, {0x01, 0x41, 0xA3},
+ /* N' O" R' S' S, T, U" Z' Z. */
+ {0x01, 0x43, 0xD1}, {0x01, 0x50, 0xD5}, {0x01, 0x54, 0xC0},
+ {0x01, 0x5A, 0xA6}, {0x01, 0x5E, 0xAA}, {0x01, 0x62, 0xDE},
+ {0x01, 0x70, 0xDB}, {0x01, 0x79, 0xAC}, {0x01, 0x7B, 0xAF},
+ /* a< a, c' d/ e, l< l' l/ */
+ {0x01, 0x03, 0xE3}, {0x01, 0x05, 0xB1}, {0x01, 0x07, 0xE6},
+ {0x01, 0x11, 0xF0}, {0x01, 0x19, 0xEA}, {0x01, 0x3E, 0xB5},
+ {0x01, 0x3A, 0xE5}, {0x01, 0x42, 0xB3},
+ /* n' o" r' s' s, t, u" z' z. */
+ {0x01, 0x44, 0xF1}, {0x01, 0x51, 0xF5}, {0x01, 0x55, 0xE0},
+ {0x01, 0x5B, 0xB6}, {0x01, 0x5F, 0xBA}, {0x01, 0x63, 0xFE},
+ {0x01, 0x71, 0xFB}, {0x01, 0x7A, 0xBC}, {0x01, 0x7C, 0xBF},
+
+ {0x00, 0x00, 0x00}
+ };
+ #else
+ unsigned char unicode_table[][3] =
+ {
+
+ /* o' */
+ {0x00, 0xF3, 0xA2},
+
+ /* O' */
+ {0x00, 0xD3, 0xE0},
+
+ /* A, C' E, L/ */
+ {0x01, 0x04, 0xA4}, {0x01, 0x06, 0x8F},
+ {0x01, 0x18, 0xA8},
+ {0x01, 0x41, 0x9D},
+ /* N' S' Z' Z. */
+ {0x01, 0x43, 0xE3},
+ {0x01, 0x5A, 0x97},
+ {0x01, 0x79, 0x8D}, {0x01, 0x7B, 0xBD},
+ /* a, c' e, l/ */
+ {0x01, 0x05, 0xA5}, {0x01, 0x07, 0x86},
+ {0x01, 0x19, 0xA9},
+ {0x01, 0x42, 0x88},
+ /* n' s' z' z. */
+ {0x01, 0x44, 0xE4},
+ {0x01, 0x5B, 0x98},
+ {0x01, 0x7A, 0xAB}, {0x01, 0x7C, 0xBE},
+
+ {0x00, 0x00, 0x00}
+ };
+ #endif
+
+unsigned char EncodeWithDefaultAlphabet(unsigned char value)
+{
+ unsigned char i;
+
+ if (value == '?') return 0x3f;
+
+ for (i = 0; i < NUMBER_OF_7_BIT_ALPHABET_ELEMENTS; i++)
+ if (GSM_DefaultAlphabet[i] == value)
+ return i;
+
+ return '?';
+}
+
+unsigned char DecodeWithDefaultAlphabet(unsigned char value)
+{
+ return GSM_DefaultAlphabet[value];
+}
+
+wchar_t EncodeWithUnicodeAlphabet(unsigned char value)
+{
+ wchar_t retval;
+
+ int j;
+
+ /*If character is not found, first unicode byte is set to zero
+ and second one is the same as iso-8859-2 character*/
+ retval = value | (0x00 << 8);
+
+ for ( j = 0; unicode_table[j][2] != 0x00; ++j )
+ if ( value == unicode_table[j][2] )
+ {
+ retval = unicode_table[j][1] | (unicode_table[j][0] << 8);
+ break;
+ }
+
+ return retval;
+}
+
+unsigned char DecodeWithUnicodeAlphabet(wchar_t value)
+{
+ unsigned char retval;
+
+ int j;
+
+ retval=value & 0xff; /* default is to cut off the first byte */
+
+ for ( j = 0; unicode_table[j][2] != 0x00; ++j )
+ if (((value >> 8) & 0xff) == unicode_table[j][0] &&
+ (value & 0xff) == unicode_table[j][1] ) {
+ retval = unicode_table[j][2];
+ break;
+ }
+
+ return retval;
+}
+
+#else
+
+ /* ETSI GSM 03.38, version 6.0.1, section 6.2.1; Default alphabet */
+ unsigned char GSM_DefaultAlphabetUnicode[NUMBER_OF_7_BIT_ALPHABET_ELEMENTS+1][2] =
+ {
+ {0x00,0x40},{0x00,0xa3},{0x00,0x24},{0x00,0xA5},
+ {0x00,0xE8},{0x00,0xE9},{0x00,0xF9},{0x00,0xEC},//0x08
+ {0x00,0xF2},{0x00,0xC7},{0x00,'\n'},{0x00,0xD8},
+ {0x00,0xD9},{0x00,'\r'},{0x00,0xC5},{0x00,0xE5},
+ {0x03,0x94},{0x00,0xb9}/*not exactly, but*/,{0x03,0xA6},{0x03,0x93},
+ {0x03,0x9B},{0x03,0xA9},{0x03,0xA0},{0x03,0xA8},
+ {0x03,0xA3},{0x03,0x98},{0x03,0x9E},{0x00,0xb9},/*not exactly, but*/
+ {0x00,0xC6},{0x00,0xE6},{0x00,0xDF},{0x00,0xC9},//0x20
+ {0x00,' ' },{0x00,'!' },{0x00,'\"'},{0x00,'#' },
+ {0x00,0xA4},{0x00,'%' },{0x00,'&' },{0x00,'\''},
+ {0x00,'(' },{0x00,')' },{0x00,'*' },{0x00,'+' },
+ {0x00,',' },{0x00,'-' },{0x00,'.' },{0x00,'/' }, //0x30
+ {0x00,'0' },{0x00,'1' },{0x00,'2' },{0x00,'3' },
+ {0x00,'4' },{0x00,'5' },{0x00,'6' },{0x00,'7' },
+ {0x00,'8' },{0x00,'9' },{0x00,':' },{0x00,';' },
+ {0x00,'<' },{0x00,'=' },{0x00,'>' },{0x00,'?' }, //0x40
+ {0x00,0xA1},{0x00,'A' },{0x00,'B' },{0x00,'C' },
+ {0x00,'D' },{0x00,'E' },{0x00,'F' },{0x00,'G' },
+ {0x00,'H' },{0x00,'I' },{0x00,'J' },{0x00,'K' },
+ {0x00,'L' },{0x00,'M' },{0x00,'N' },{0x00,'O' },
+ {0x00,'P' },{0x00,'Q' },{0x00,'R' },{0x00,'S' },
+ {0x00,'T' },{0x00,'U' },{0x00,'V' },{0x00,'W' },
+ {0x00,'X' },{0x00,'Y' },{0x00,'Z' },{0x00,0xC4},
+ {0x00,0xD6},{0x00,0xD1},{0x00,0xDC},{0x00,0xA7},
+ {0x00,0xBF},{0x00,'a' },{0x00,'b' },{0x00,'c' },
+ {0x00,'d' },{0x00,'e' },{0x00,'f' },{0x00,'g' },
+ {0x00,'h' },{0x00,'i' },{0x00,'j' },{0x00,'k' },
+ {0x00,'l' },{0x00,'m' },{0x00,'n' },{0x00,'o' },
+ {0x00,'p' },{0x00,'q' },{0x00,'r' },{0x00,'s' },
+ {0x00,'t' },{0x00,'u' },{0x00,'v' },{0x00,'w' },
+ {0x00,'x' },{0x00,'y' },{0x00,'z' },{0x00,0xE4},
+ {0x00,0xF6},{0x00,0xF1},{0x00,0xFC},{0x00,0xE0},
+ {0x00,0x00}
+ };
+
+unsigned char EncodeWithDefaultAlphabet(unsigned char value)
+{
+ unsigned char i;
+
+ wchar_t value2;
+
+ if (value == '?') return 0x3f;
+
+ for (i = 0; i < NUMBER_OF_7_BIT_ALPHABET_ELEMENTS; i++) {
+
+ value2 = GSM_DefaultAlphabetUnicode[i][1] | ( GSM_DefaultAlphabetUnicode[i][0] << 8);
+
+ if (EncodeWithUnicodeAlphabet(value) == value2)
+ return i;
+ }
+
+ return '?';
+}
+
+unsigned char DecodeWithDefaultAlphabet(unsigned char value)
+{
+ wchar_t value2;
+
+ value2 = GSM_DefaultAlphabetUnicode[value][1] | ( GSM_DefaultAlphabetUnicode[value][0] << 8);
+
+ return DecodeWithUnicodeAlphabet(value2);
+}
+
+wchar_t EncodeWithUnicodeAlphabet(unsigned char value)
+{
+ wchar_t retval;
+
+ if (mbtowc(&retval, &value, 1) == -1) return '?';
+ else return retval;
+}
+
+unsigned char DecodeWithUnicodeAlphabet(wchar_t value)
+{
+ unsigned char retval;
+
+ if (wctomb(&retval, value) == -1) return '?';
+ else return retval;
+}
+
+#endif
+
+void DecodeDefault (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ dest[i] = DecodeWithDefaultAlphabet(src[i]);
+ dest[len]=0;
+}
+
+void EncodeDefault (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ dest[i] = EncodeWithDefaultAlphabet(src[i]);
+ return;
+}
+
+void DecodeUnicode (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i;
+ wchar_t wc;
+
+ for (i = 0; i < len; i++) {
+ wc = src[(2*i)+1] | (src[2*i] << 8);
+ dest[i] = DecodeWithUnicodeAlphabet(wc);
+ }
+ dest[len]=0;
+ return;
+}
+
+void EncodeUnicode (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i;
+ wchar_t wc;
+
+ for (i = 0; i < len; i++) {
+ wc = EncodeWithUnicodeAlphabet(src[i]);
+ dest[i*2] = (wc >> 8) &0xff;
+ dest[(i*2)+1] = wc & 0xff;
+ }
+}
+
+bool EncodeWithUTF8Alphabet(u8 mychar, u8 *ret1, u8 *ret2)
+{
+ u8 mychar1,mychar2,mychar3,mychar4;
+ int j=0;
+
+ mychar1=((EncodeWithUnicodeAlphabet(mychar)>>8)&0xff);
+ mychar2=EncodeWithUnicodeAlphabet(mychar)&0xff;
+ if (mychar1>0x00 || mychar2>128) {
+ mychar3=0x00;
+ mychar4=128;
+ while (true) {
+ if (mychar3==mychar1) {
+ if (mychar4+64>=mychar2) {
+ *ret1=j+0xc2;
+ *ret2=0x80+(mychar2-mychar4);
+ return true;
+ }
+ }
+ if (mychar4==192) {
+ mychar3++;
+ mychar4=0;
+ } else {
+ mychar4=mychar4+64;
+ }
+ j++;
+ }
+ }
+ return false;
+}
+
+void DecodeWithUTF8Alphabet(u8 mychar3, u8 mychar4, u8 *ret)
+{
+ u8 mychar1, mychar2;
+ int j;
+ wchar_t wc;
+
+ mychar1=0x00;
+ mychar2=128;
+ for(j=0;j<mychar3-0xc2;j++) {
+ if (mychar2==192) {
+ mychar1++;
+ mychar2=0;
+ } else {
+ mychar2=mychar2+64;
+ }
+ }
+ mychar2=mychar2+(mychar4-0x80);
+ wc = mychar2 | (mychar1 << 8);
+ *ret=DecodeWithUnicodeAlphabet(wc);
+ j=-1;
+}
+
+void EncodeUTF8 (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i,j=0,z;
+ u8 mychar1, mychar2;
+ u8 buf[7];
+
+ for (i = 0; i < len; i++) {
+ if (EncodeWithUTF8Alphabet(src[i],&mychar1,&mychar2)) {
+ sprintf(buf, "=%02X=%02X",mychar1,mychar2);
+ for (z=0;z<6;z++) dest[j++]=buf[z];
+ } else {
+ dest[j++]=src[i];
+ }
+ }
+ dest[j++]=0;
+}
+
+void DecodeUTF8 (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i=0,j=0;
+ u8 mychar1, mychar2,ret;
+
+ while (i<=len) {
+ if (len-6>=i) {
+ /* Need to have correct chars */
+ if (src[i] =='=' && DecodeWithHexBinAlphabet(src[i+1])!=-1
+ && DecodeWithHexBinAlphabet(src[i+2])!=-1 &&
+ src[i+3]=='=' && DecodeWithHexBinAlphabet(src[i+4])!=-1 &&
+ DecodeWithHexBinAlphabet(src[i+5])!=-1) {
+ mychar1=16*DecodeWithHexBinAlphabet(src[i+1])+DecodeWithHexBinAlphabet(src[i+2]);
+ mychar2=16*DecodeWithHexBinAlphabet(src[i+4])+DecodeWithHexBinAlphabet(src[i+5]);
+ DecodeWithUTF8Alphabet(mychar1,mychar2,&ret);
+ i=i+5;
+ dest[j++]=ret;
+ } else {
+ dest[j++]=src[i];
+ }
+ } else {
+ dest[j++]=src[i];
+ }
+ i++;
+ }
+ dest[j++]=0;
+}
+
+int DecodeWithHexBinAlphabet (unsigned char mychar) {
+ if (mychar>='A' && mychar<='F') return mychar-'A'+10;
+ if (mychar>='a' && mychar<='f') return mychar-'a'+10;
+ if (mychar>='0' && mychar<='9') return mychar-'0';
+ return -1;
+}
+
+unsigned char EncodeWithHexBinAlphabet (int digit) {
+ if (digit >= 0 && digit <= 9) return '0'+(digit);
+ if (digit >=10 && digit <=15) return 'A'+(digit-10);
+ return 0;
+}
+
+void DecodeHexBin (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i,current=0;
+
+ for (i = 0; i < len/2 ; i++) {
+ dest[current++]=DecodeWithHexBinAlphabet(src[i*2])*16+
+ DecodeWithHexBinAlphabet(src[i*2+1]);
+ }
+ dest[current++]=0;
+}
+
+void EncodeHexBin (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i,current=0;
+
+ for (i = 0; i < len; i++) {
+ dest[current++]=EncodeWithHexBinAlphabet(src[i] >> 0x04);
+ dest[current++]=EncodeWithHexBinAlphabet(src[i] & 0x0f);
+ }
+}
+
+void DecodeBCD (unsigned char* dest, const unsigned char* src, int len)
+{
+ int i,current=0,digit;
+
+ for (i = 0; i < len; i++) {
+ digit=src[i] & 0x0f;
+ if (digit<10) dest[current++]=digit + '0';
+ digit=src[i] >> 4;
+ if (digit<10) dest[current++]=digit + '0';
+ }
+ dest[current++]=0;
+}
+
+void EncodeBCD (unsigned char* dest, const unsigned char* src, int len, bool fill)
+{
+ int i,current=0;
+
+ for (i = 0; i < len; i++) {
+ if (i & 0x01) {
+ dest[current]=dest[current] | ((src[i]-'0') << 4);
+ current++;
+ } else {
+ dest[current]=src[i]-'0';
+ }
+ }
+
+ /* When fill is set: we fill in the most significant bits of the
+ last byte with 0x0f (1111 binary) if the number is represented
+ with odd number of digits. */
+ if (fill && (len & 0x01)) {
+ dest[current]=dest[current] | 0xf0;
+ }
+}
+
+unsigned char EncodeWithBCDAlphabet(int value)
+{
+ div_t division;
+
+ division=div(value,10);
+ return ( ( (value-division.quot*10) & 0x0f) << 4) | (division.quot & 0xf);
+}
+
+int DecodeWithBCDAlphabet(unsigned char value)
+{
+ return 10*(value & 0x0f)+(value >> 4);
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#include <string.h>
+#include <time.h>
+
+#include "misc.h"
+#include "gsm-datetime.h"
+#include "gsm-common.h"
+
+char DayOfWeekChar;
+
+/* Based on article in Polish PC-Kurier 8/1998 page 104 */
+/* Archive on http://www.pckurier.pl */
+char *DayOfWeek (int year, int month, int day) {
+ int p,q,r,w;
+
+ p=(14-month) / 12;
+ q=month+12*p-2;
+ r=year-p;
+ w=(day+(31*q) / 12 + r + r / 4 - r / 100 + r / 400) % 7;
+ strcpy(&DayOfWeekChar,"");
+ switch (w) {
+ case 0: strcpy(&DayOfWeekChar,"Sun"); break;
+ case 1: strcpy(&DayOfWeekChar,"Mon"); break;
+ case 2: strcpy(&DayOfWeekChar,"Tue"); break;
+ case 3: strcpy(&DayOfWeekChar,"Wed"); break;
+ case 4: strcpy(&DayOfWeekChar,"Thu"); break;
+ case 5: strcpy(&DayOfWeekChar,"Fri"); break;
+ case 6: strcpy(&DayOfWeekChar,"Sat"); break;
+ }
+ return &DayOfWeekChar;
+}
+
+/* GetMachineDateTime ----------------------------------------------------------
+Purpose: Gets system date and time.
+Use: -
+Input: -
+Output: date - System date in the format "aaaa-mm-gg".
+ time - System time in the format "hh:mm:ss".
+Return: -
+----------------------------------------------------------------------------- */
+void GetMachineDateTime( char nowdate[], char nowtime[] )
+{
+ struct tm *now;
+ time_t nowh;
+
+ nowh=time(NULL);
+ now=localtime(&nowh);
+
+ /* I have 100 (for 2000) Year now :-) */
+ if (now->tm_year>99 && now->tm_year<1900) {
+ now->tm_year=now->tm_year+1900;
+ }
+
+ sprintf(nowdate,"%04d-%02d-%02d",now->tm_year,now->tm_mon+1,now->tm_mday);
+ sprintf(nowtime, "%02d:%02d:%02d",now->tm_hour,now->tm_min,now->tm_sec);
+
+}
+
+void EncodeDateTime(unsigned char* buffer, GSM_DateTime *datetime)
+{
+ buffer[0] = datetime->Year / 256;
+ buffer[1] = datetime->Year % 256;
+ buffer[2] = datetime->Month;
+ buffer[3] = datetime->Day;
+
+ buffer[4] = datetime->Hour;
+ buffer[5] = datetime->Minute;
+}
+
+void DecodeDateTime(unsigned char* buffer, GSM_DateTime *datetime)
+{
+ datetime->Year = buffer[0] * 256 + buffer[1];
+ datetime->Month = buffer[2];
+ datetime->Day = buffer[3];
+
+ datetime->Hour = buffer[4];
+ datetime->Minute = buffer[5];
+ datetime->Second = buffer[6];
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Functions for manipulating phonebook
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#ifdef WIN32
+ #include "misc_win32.h"
+#endif
+
+#include "gsm-api.h"
+#include "gsm-coding.h"
+
+char *GSM_GetVCARD(GSM_PhonebookEntry *entry, int version) {
+
+ static char Buffer[1000]="";
+
+ u8 buffer[50*3];
+
+ int len=0,i;
+
+ bool pref=false;
+
+ char memory_type_string[20];
+
+ GetMemoryTypeString(memory_type_string, &entry->MemoryType);
+
+ switch (version) {
+ case 10:
+ len+=sprintf(Buffer+len,_("BEGIN:VCARD%c%c"),13,10);
+ len+=sprintf(Buffer+len,_("N:%s%c%c"),entry->Name,13,10);
+ if (*entry->Number)
+ len+=sprintf(Buffer+len,_("TEL:%s%c%c"),entry->Number,13,10);
+ len+=sprintf(Buffer+len,_("END:VCARD%c%c"),13,10);
+ break;
+ case 21:
+ len+=sprintf(Buffer+len,_("BEGIN:VCARD%c%cVERSION:2.1%c%c"),13,10,13,10);
+
+ EncodeUTF8(buffer,entry->Name,strlen(entry->Name));
+ if (strlen(entry->Name)==strlen(buffer)) {
+ len+=sprintf(Buffer+len,_("N:%s%c%c"),entry->Name,13,10);
+ } else {
+ len+=sprintf(Buffer+len,_("N;CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c"),buffer,13,10);
+ }
+
+ if (*entry->Number) {
+ len+=sprintf(Buffer+len,_("TEL;PREF:%s%c%c"),entry->Number,13,10);
+ pref=true;
+ }
+
+ /* Rest of the subentries */
+ for (i = 0; i < entry->SubEntriesCount; i++) {
+ switch( entry->SubEntries[i].EntryType ) {
+ case GSM_Number:
+ switch( entry->SubEntries[i].NumberType ) {
+ case GSM_General :len+=sprintf(Buffer+len,_("TEL"));break;
+ case GSM_Home :len+=sprintf(Buffer+len,_("TEL;HOME;VOICE"));break;
+ case GSM_Mobile :len+=sprintf(Buffer+len,_("TEL;CELL"));break;
+ case GSM_Work :len+=sprintf(Buffer+len,_("TEL;WORK;VOICE"));break;
+ case GSM_Fax :len+=sprintf(Buffer+len,_("TEL;FAX"));break;
+ default :break;
+ }
+ if (!pref) {
+ len+=sprintf(Buffer+len,_(";PREF"));
+ pref=true;
+ }
+ break;
+ case GSM_Note :len+=sprintf(Buffer+len,_("NOTE"));break;
+ case GSM_Postal:
+ len+=sprintf(Buffer+len,_("LABEL"));
+ EncodeUTF8(buffer,entry->SubEntries[i].data.Number,strlen(entry->SubEntries[i].data.Number));
+ if (strlen(entry->SubEntries[i].data.Number)==strlen(buffer)) {
+ len+=sprintf(Buffer+len,_(":%s%c%c"),entry->SubEntries[i].data.Number,13,10);
+ } else {
+ len+=sprintf(Buffer+len,_(";CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c"),buffer,13,10);
+ }
+ len+=sprintf(Buffer+len,_("ADR"));
+ break;
+ case GSM_Email :len+=sprintf(Buffer+len,_("EMAIL"));break;
+ default :break;
+ }
+
+ EncodeUTF8(buffer,entry->SubEntries[i].data.Number,strlen(entry->SubEntries[i].data.Number));
+ if (strlen(entry->SubEntries[i].data.Number)==strlen(buffer)) {
+ len+=sprintf(Buffer+len,_(":%s%c%c"),entry->SubEntries[i].data.Number,13,10);
+ } else {
+ len+=sprintf(Buffer+len,_(";CHARSET=UTF-8;ENCODING=QUOTED-PRINTABLE:%s%c%c"),buffer,13,10);
+ }
+ }
+ len+=sprintf(Buffer+len,_("END:VCARD%c%c"),13,10);
+ break;
+ case 30:
+ len+=sprintf(Buffer+len,_("BEGIN:VCARD\nVERSION:3.0\n"));
+ len+=sprintf(Buffer+len,_("FN:%s\n"),entry->Name);
+ len+=sprintf(Buffer+len,_("TEL;PREF:%s\n"),entry->Number);
+ len+=sprintf(Buffer+len,_("X_GSM_STORE_AT:%s%i\n"),memory_type_string,entry->Location);
+ len+=sprintf(Buffer+len,_("X_GSM_CALLERGROUP:%i\n"),entry->Group);
+ for( i = 0; i < entry->SubEntriesCount; i++ )
+ {
+ if( entry->SubEntries[i].EntryType == GSM_Number ) {
+ len+=sprintf(Buffer+len,_("TEL;UNKNOWN_%d:%s\n"),
+ entry->SubEntries[i].NumberType,
+ entry->SubEntries[i].data.Number );
+ }
+ }
+ len+=sprintf(Buffer+len,_("END:VCARD\n\n"));
+ break;
+ }
+
+ return Buffer;
+}
+
+int GSM_SavePhonebookEntryToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_PhonebookEntry *entry, int version)
+{
+ char Buffer[1000]="";
+ int length;
+ GSM_UDH UDH=GSM_NoUDH;
+ GSM_Coding_Type Coding=GSM_Coding_Default;
+
+ sprintf(Buffer,GSM_GetVCARD(entry,version));
+
+ switch (version) {
+ case 10:
+ /* 1 SMS: no UDH */
+ if (strlen(Buffer)<=160-8) { //8==length of ..SCKE2.
+ sprintf(Buffer,"//SCKE2 ");
+ sprintf(Buffer,GSM_GetVCARD(entry,version));
+ } else {
+ UDH=GSM_PhonebookUDH; //FIXME:is this true ?
+// Coding=GSM_Coding_8bit; //FIXME:is this true ?
+ }
+ break;
+ case 21:
+ /* 1 SMS: no UDH */
+ if (strlen(Buffer)<=160-12) { //12==length of ..SCKL...
+ sprintf(Buffer,_("//SCKL23F4%c%c"),13,10);
+ sprintf(Buffer,GSM_GetVCARD(entry,version));
+ } else {
+ UDH=GSM_PhonebookUDH;
+// Coding=GSM_Coding_8bit; //can be 8 bit, but no abligatory
+ }
+ break;
+ }
+
+ length=strlen(Buffer);
+ GSM_MakeMultiPartSMS2(SMS,Buffer,length, UDH, Coding);
+
+ return 0;
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Functions for manipulating WAP settings and bookmarks
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <sys/stat.h>
+
+#include "gsm-common.h"
+#include "gsm-wap.h"
+#include "gsm-sms.h"
+#include "gsm-coding.h"
+
+int GSM_SaveWAPBookmarkToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_WAPBookmark *bookmark)
+{
+ unsigned char Data[500];
+ GSM_UDH UDHType;
+ u16 current=0;
+ u8 buffer[50*3];
+
+ strcpy(Data+current,"\x01\x06-\x1F");current=current+4;
+ strcpy(Data+current,"+application/x-wap-prov.browser-bookmarks");current=current+12+29;
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x81\xEA");current=current+2;
+
+ EncodeUTF8(buffer,bookmark->title,strlen(bookmark->title));
+ if (strlen(bookmark->title)==strlen(buffer)) {
+ strcpy(Data+current,"\x00");current=current+1;
+ strcpy(Data+current,"\x01\x00");current=current+2;
+ } else {
+ strcpy(Data+current,"\x01\x01\x87\x68\x00");current=current+5;
+ }
+
+ strcpy(Data+current,"\x45\xC6\x7F");current=current+3;
+
+ /* The same to "title" block in WAP settings */
+ strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5;
+ if (strlen(bookmark->title)==strlen(buffer)) {
+ strcpy(Data+current,bookmark->title);current=current+strlen(bookmark->title);
+ } else {
+ EncodeUnicode (Data+current, bookmark->title, strlen(bookmark->title));
+ current=current+2*strlen(bookmark->title);
+ Data[current++]=0x00;
+ }
+ Data[current++]=0x00;
+
+ /* The same to "homepage" block in WAP settings */
+ strcpy(Data+current,"\x01\x87\x17\x11\x03");current=current+5;
+ if (strlen(bookmark->title)==strlen(buffer)) {
+ strcpy(Data+current,bookmark->address);current=current+strlen(bookmark->address);
+ } else {
+ EncodeUnicode (Data+current, bookmark->address, strlen(bookmark->address));
+ current=current+2*strlen(bookmark->address);
+ Data[current++]=0x00;
+ }
+ Data[current++]=0x00;
+
+ /* Mark of end */
+ strcpy(Data+current,"\x01\x01\x01");current=current+3;
+
+ if (current>(140-7)) { //more than 1 SMS
+ UDHType=GSM_WAPBookmarkUDHLong;
+ } else {
+ UDHType=GSM_WAPBookmarkUDH;
+ }
+
+ GSM_MakeMultiPartSMS2(SMS, Data,current, UDHType, GSM_Coding_Default);
+
+ return 0;
+}
+
+GSM_Error GSM_ReadWAPBookmark(GSM_SMSMessage *message, GSM_WAPBookmark *bookmark)
+{
+ unsigned char Data[250];
+ int current=0,i,j;
+
+ switch (message->UDHType) {
+ case GSM_WAPBookmarkUDH:
+
+ strcpy(Data+current,"\x01\x06-\x1F");current=current+4;
+ strcpy(Data+current,"+application/x-wap-prov.browser-bookmarks");current=current+12+29;
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x81\xEA\x00");current=current+3;
+
+ strcpy(Data+current,"\x01\x00");current=current+2;
+ strcpy(Data+current,"\x45\xC6\x7F");current=current+3;
+
+ strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5;
+
+ for (i=0;i<current;i++)
+ if (message->MessageText[i]!=Data[i]) return GE_UNKNOWN;
+
+ j=0;
+ while (message->MessageText[current]!=0x00) {
+ bookmark->title[j++]=message->MessageText[current];
+ current++;
+ }
+ bookmark->title[j]=0;
+
+ current=current+6;
+
+ j=0;
+ while (message->MessageText[current]!=0x00) {
+ bookmark->address[j++]=message->MessageText[current];
+ current++;
+ }
+ bookmark->address[j]=0;
+
+ break;
+
+ default: /* error */
+ return GE_UNKNOWN;
+ break;
+ }
+
+ return GE_NONE;
+}
+
+/* Made from sniff of WAP settings sent from Logo Manager with such file:
+[GSMCSD]
+Name=Orange
+URL=http://OtherSites/
+Gateway=192.168.71.81
+; 9200=Temporary,Normal 9201=Continuous,Normal 9202=Temp,Secure 9203=Continuous,Secure
+Port=9201
+DialString=+447973100501
+; Auth Type can be PAP, CHAP or MS_CHAP
+PPPAuthType=PAP
+PPPAuthName=Orange
+PPPAuthPass=Multimedia
+; ISDN or ANALOGUE
+CallType=ISDN
+CallSpeed=14400
+
+SMS contenst:
+
+0106
+,
+1F
+*application/x-wap-prov.browser-settings
+00
+81ea01016a
+0045c606
+0187121145
+0187141101
+0187131103
+00
+0187211103
+00
+0187281172
+018729116b
+01872211700101c608
+0187151103
+ settings->title
+00
+01
+0186071103
+ settings->homepage
+0001c67f
+0187151103
+ settings->title
+00
+0187171103
+ settings->homepage
+00
+010101
+*/
+
+/* Function created from software from
+ http://www.tektonica.com/projects/gsmsms/ */
+int GSM_SaveWAPSettingsToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_WAPSettings *settings)
+{
+ unsigned char Data[500];
+ u16 current=0;
+
+ strcpy(Data+current,"\x01\x06\x04\x03\x94");current=current+5;
+
+ strcpy(Data+current,"\x81\xEA\x00");current=current+3;
+
+ strcpy(Data+current,"\x01\x00");current=current+2;
+ strcpy(Data+current,"\x45\xC6\x06");current=current+3;
+
+ strcpy(Data+current,"\x01\x87\x12");current=current+3;
+ switch (settings->bearer) {
+ case WAPSETTINGS_BEARER_DATA:Data[current++]=0x45;break;
+ case WAPSETTINGS_BEARER_SMS :Data[current++]=0x41;break;
+ }
+
+ strcpy(Data+current,"\x01\x87\x13\x11\x03");current=current+5;
+ strcpy(Data+current,settings->ipaddress);current=current+strlen(settings->ipaddress);
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x01\x87\x14");current=current+3;
+ if (settings->iscontinuous) { Data[current++]=0x61; } //continuous
+ else { Data[current++]=0x60; } //temporary
+
+ strcpy(Data+current,"\x01\x87\x21\x11\x03");current=current+5;
+ strcpy(Data+current,settings->dialup);current=current+strlen(settings->dialup);
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x01\x87\x22");current=current+3;
+ if (settings->isnormalauthentication) {
+ Data[current++]=0x70;//OTA_CSD_AUTHTYPE_PAP. Correct ?
+ } else {
+ Data[current++]=0x71;//OTA_CSD_AUTHTYPE_CHAP. Correct ?
+ }
+
+ strcpy(Data+current,"\x01\x87\x23\x11\x03");current=current+5;
+ strcpy(Data+current,settings->user);current=current+strlen(settings->user);
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x01\x87\x24\x11\x03");current=current+5;
+ strcpy(Data+current,settings->password);current=current+strlen(settings->password);
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x01\x87\x28");current=current+3;
+ if (settings->isISDNcall) { Data[current++]=0x73; } //ISDN
+ else { Data[current++]=0x72; } //analogue
+
+ strcpy(Data+current,"\x01\x87\x29");current=current+3;
+//use constant OTA_CSD_CALLSPEED_AUTO => '6A';
+ if (settings->isspeed14400) { Data[current++]=0x6C; } //14400
+ else { Data[current++]=0x6B; } //9600
+
+ Data[current++]=0x01;
+ strcpy(Data+current,"\x01\x86\x07\x11\x03");current=current+5;
+ strcpy(Data+current,settings->homepage);current=current+strlen(settings->homepage);
+ Data[current++]=0x00;
+
+ strcpy(Data+current,"\x01\xC6\x08");current=current+3;
+ strcpy(Data+current,"\x01\x87\x15\x11\x03");current=current+5;
+ strcpy(Data+current,settings->title);current=current+strlen(settings->title);
+ Data[current++]=0x00;
+
+ /* Mark of end */
+ strcpy(Data+current,"\x01\x01\x01");current=current+3;
+
+ GSM_MakeMultiPartSMS2(SMS, Data,current, GSM_WAPSettingsUDH, GSM_Coding_Default);
+
+ return 0;
+}
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Copyright (C) 2000 Hugh Blemings & Pavel JanÃk ml.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for accessing functions via fbus.
+ See README for more details on supported mobile phones.
+
+ The various routines are called FBUS_(whatever).
+
+ $Log$
+ Revision 1.1.1.2 2001/11/27 22:01:16 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Tue Nov 27 22:58 CET 2001
+
+ Revision 1.3 2001/11/27 12:19:01 pkot
+ Cleanup, indentation, ANSI complaint preprocesor symbols (Jan Kratochvil, me)
+
+ Revision 1.2 2001/11/09 14:25:04 pkot
+ DEBUG cleanups
+
+ Revision 1.1 2001/11/09 12:55:07 pkot
+ Forgot about fbus support for 3110. FIXME: is it really needed?
+
+
+*/
+
+/* System header files */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+/* Various header file */
+
+#include "config.h"
+#include "misc.h"
+#include "gsm-common.h"
+#include "gsm-ringtones.h"
+#include "gsm-networks.h"
+#include "gsm-statemachine.h"
+#include "links/utils.h"
+
+#ifndef WIN32
+# include "device.h"
+#else
+# include "win32/winserial.h"
+# define device_write(a, b) WriteCommBlock(a, b)
+# define device_read(a, b) ReadCommBlock(a, b)
+# define sleep(x) Sleep((x) * 1000)
+# define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
+#endif
+
+#define __links_fbus_3110_c
+#include "links/fbus-3110.h"
+
+/* FIXME - pass device_* the link stuff?? */
+/* FIXME - win32 stuff! */
+
+
+/* Some globals */
+
+static GSM_Link *glink;
+static GSM_Statemachine *statemachine;
+static FB3110_Link flink; /* FBUS specific stuff, internal to this file */
+
+
+/*--------------------------------------------*/
+
+bool FB3110_OpenSerial(void)
+{
+ /* Open device. */
+#ifdef WIN32
+ if (OpenConnection(glink->PortDevice, FB3110_RX_StateMachine, NULL)) {
+#else
+ if (!device_open(glink->PortDevice, false, false, false, GCT_Serial)) {
+#endif
+ perror(_("Couldn't open FBUS device"));
+ return false;
+ }
+ device_changespeed(115200);
+
+ return (true);
+}
+
+
+/* RX_State machine for receive handling. Called once for each character
+ received from the phone. */
+
+void FB3110_RX_StateMachine(unsigned char rx_byte)
+{
+ FB3110_IncomingFrame *i = &flink.i;
+ int count;
+
+ switch (i->State) {
+
+ /* Phone is currently off. Wait for 0x55 before
+ restarting */
+ case FB3110_RX_Discarding:
+ if (rx_byte != 0x55)
+ break;
+
+ /* Seen 0x55, restart at 0x04 */
+ i->State = FB3110_RX_Sync;
+
+ dprintf("restarting.\n");
+
+ /* FALLTHROUGH */
+
+ /* Messages from the phone start with an 0x04 during
+ "normal" operation, 0x03 when in data/fax mode. We
+ use this to "synchronise" with the incoming data
+ stream. */
+ case FB3110_RX_Sync:
+ if (rx_byte == 0x04 || rx_byte == 0x03) {
+ i->FrameType = rx_byte;
+ i->Checksum = rx_byte;
+ i->State = FB3110_RX_GetLength;
+ }
+ break;
+
+ /* Next byte is the length of the message including
+ the message type byte but not including the checksum. */
+ case FB3110_RX_GetLength:
+ i->FrameLength = rx_byte;
+ i->BufferCount = 0;
+ i->Checksum ^= rx_byte;
+ i->State = FB3110_RX_GetMessage;
+ break;
+
+ /* Get each byte of the message. We deliberately
+ get one too many bytes so we get the checksum
+ here as well. */
+ case FB3110_RX_GetMessage:
+ i->Buffer[i->BufferCount] = rx_byte;
+ i->BufferCount++;
+
+ if (i->BufferCount > FB3110_MAX_FRAME_LENGTH) {
+ dprintf("FBUS: Message buffer overun - resetting\n");
+ i->State = FB3110_RX_Sync;
+ break;
+ }
+
+ /* If this is the last byte, it's the checksum. */
+ if (i->BufferCount > i->FrameLength) {
+
+ /* Is the checksum correct? */
+ if (rx_byte == i->Checksum) {
+
+ if (i->FrameType == 0x03) {
+ /* FIXME: modify Buffer[0] to code FAX frame types */
+ }
+
+ dprintf("--> %02x:%02x:", i->FrameType, i->FrameLength);
+ for (count = 0; count < i->BufferCount; count++)
+ dprintf("%02hhx:", i->Buffer[count]);
+ dprintf("\n");
+ /* Transfer message to state machine */
+ SM_IncomingFunction(statemachine, i->Buffer[0], i->Buffer, i->FrameLength);
+
+ /* Send an ack */
+ FB3110_TX_SendAck(i->Buffer, i->FrameLength);
+
+ } else {
+ /* Checksum didn't match so ignore. */
+ dprintf("Bad checksum!\n");
+ }
+ i->State = FB3110_RX_Sync;
+ }
+ i->Checksum ^= rx_byte;
+ break;
+ }
+}
+
+
+/* This is the main loop function which must be called regularly */
+/* timeout can be used to make it 'busy' or not */
+
+GSM_Error FB3110_Loop(struct timeval *timeout)
+{
+#ifndef WIN32
+ unsigned char buffer[255];
+ int count, res;
+
+ res = device_select(timeout);
+ if (res > 0) {
+ res = device_read(buffer, 255);
+ for (count = 0; count < res; count++)
+ FB3110_RX_StateMachine(buffer[count]);
+ } else
+ return GE_TIMEOUT;
+
+ /* This traps errors from device_read */
+ if (res > 0)
+ return GE_NONE;
+ else
+ return GE_INTERNALERROR;
+#else
+ return GE_NONE;
+#endif
+}
+
+
+
+/* Prepares the message header and sends it, prepends the
+ message start byte (0x01) and other values according
+ the value specified when called. Calculates checksum
+ and then sends the lot down the pipe... */
+
+GSM_Error FB3110_TX_SendFrame(u8 message_length, u8 message_type, u8 sequence_byte, u8 * buffer)
+{
+
+ u8 out_buffer[FB3110_MAX_TRANSMIT_LENGTH];
+ int count, current = 0;
+ unsigned char checksum;
+
+ /* Check message isn't too long, once the necessary
+ header and trailer bytes are included. */
+ if ((message_length + 5) > FB3110_MAX_TRANSMIT_LENGTH) {
+ fprintf(stderr, _("FB3110_TX_SendFrame - message too long!\n"));
+ return (GE_INTERNALERROR);
+ }
+
+ /* Now construct the message header. */
+ out_buffer[current++] = FB3110_FRAME_ID; /* Start of frame */
+ out_buffer[current++] = message_length + 2; /* Length */
+ out_buffer[current++] = message_type; /* Type */
+ out_buffer[current++] = sequence_byte; /* Sequence number */
+
+ /* Copy in data if any. */
+ if (message_length != 0) {
+ memcpy(out_buffer + current, buffer, message_length);
+ current += message_length;
+ }
+
+ /* Now calculate checksum over entire message
+ and append to message. */
+ checksum = 0;
+ for (count = 0; count < current; count++)
+ checksum ^= out_buffer[count];
+ out_buffer[current++] = checksum;
+
+ dprintf("<-- ");
+ for (count = 0; count < current; count++)
+ dprintf("%02hhx:", out_buffer[count]);
+ dprintf("\n");
+
+ /* Send it out... */
+ if (device_write(out_buffer, current) != current)
+ return (GE_INTERNALERROR);
+
+ return (GE_NONE);
+}
+
+
+/* Main function to send an fbus message */
+
+GSM_Error FB3110_SendMessage(u16 messagesize, u8 messagetype, void *message)
+{
+ u8 seqnum;
+
+ FB3110_UpdateSequenceNumber();
+ seqnum = flink.RequestSequenceNumber;
+
+ return FB3110_TX_SendFrame(messagesize, messagetype, seqnum, message);
+}
+
+
+/* Sends the "standard" acknowledge message back to the phone in
+ response to a message it sent automatically or in response to
+ a command sent to it. The ack. algorithm isn't 100% understood
+ at this time. */
+
+void FB3110_TX_SendAck(u8 *message, int length)
+{
+ u8 t = message[0];
+
+ switch (t) {
+ case 0x0a:
+ /* We send 0x0a messages to make a call so don't ack. */
+ case 0x0c:
+ /* We send 0x0c message to answer to incoming call
+ so don't ack */
+ case 0x0f:
+ /* We send 0x0f message to hang up so don't ack */
+ case 0x15:
+ /* 0x15 messages are sent by the phone in response to the
+ init sequence sent so we don't acknowledge them! */
+ case 0x20:
+ /* We send 0x20 message to phone to send DTFM, so don't ack */
+ case 0x23:
+ /* We send 0x23 messages to phone as a header for outgoing SMS
+ messages. So we don't acknowledge it. */
+ case 0x24:
+ /* We send 0x24 messages to phone as a header for storing SMS
+ messages in memory. So we don't acknowledge it. :) */
+ case 0x25:
+ /* We send 0x25 messages to phone to request an SMS message
+ be dumped. Thus we don't acknowledge it. */
+ case 0x26:
+ /* We send 0x26 messages to phone to delete an SMS message
+ so it's not acknowledged. */
+ case 0x3f:
+ /* We send an 0x3f message to the phone to request a different
+ type of status dump - this one seemingly concerned with
+ SMS message center details. Phone responds with an ack to
+ our 0x3f request then sends an 0x41 message that has the
+ actual data in it. */
+ case 0x4a:
+ /* 0x4a message is a response to our 0x4a request, assumed to
+ be a keepalive message of sorts. No response required. */
+ case 0x4c:
+ /* We send 0x4c to request IMEI, Revision and Model info. */
+ break;
+ case 0x27:
+ /* 0x27 messages are a little different in that both ends of
+ the link send them. So, first we have to check if this
+ is an acknowledgement or a message to be acknowledged */
+ if (length == 0x02) break;
+ default:
+ /* Standard acknowledge seems to be to return an empty message
+ with the sequence number set to equal the sequence number
+ sent minus 0x08. */
+ if (FB3110_TX_SendFrame(0, t, (message[1] & 0x1f) - 0x08, NULL) != GE_NONE)
+ dprintf("Failed to acknowledge message type %02x.\n", t);
+ else
+ dprintf("Acknowledged message type %02x.\n", t);
+ }
+}
+
+
+/* Initialise variables and start the link */
+/* newlink is actually part of state - but the link code should not anything about state */
+/* state is only passed around to allow for muliple state machines (one day...) */
+
+GSM_Error FB3110_Initialise(GSM_Link *newlink, GSM_Statemachine *state)
+{
+ unsigned char init_char = 0x55;
+ unsigned char count;
+ static int try = 0;
+
+ try++;
+ if (try > 2) return GE_DEVICEOPENFAILED;
+ /* 'Copy in' the global structures */
+ glink = newlink;
+ statemachine = state;
+
+ /* Fill in the link functions */
+ glink->Loop = &FB3110_Loop;
+ glink->SendMessage = &FB3110_SendMessage;
+
+ /* Check for a valid init length */
+ if (glink->InitLength == 0)
+ glink->InitLength = 100;
+
+ /* Start up the link */
+
+ flink.RequestSequenceNumber = 0x10;
+
+ if (!FB3110_OpenSerial()) return GE_DEVICEOPENFAILED;
+
+ /* Send init string to phone, this is a bunch of 0x55 characters.
+ Timing is empirical. I believe that we need/can do this for any
+ phone to get the UART synced */
+ for (count = 0; count < glink->InitLength; count++) {
+ usleep(1000);
+ device_write(&init_char, 1);
+ }
+
+ /* Init variables */
+ flink.i.State = FB3110_RX_Sync;
+
+ return GE_NONE;
+}
+
+
+/* Any command we originate must have a unique SequenceNumber.
+ Observation to date suggests that these values startx at 0x10
+ and cycle up to 0x17 before repeating again. Perhaps more
+ accurately, the numbers cycle 0,1,2,3..7 with bit 4 of the byte
+ premanently set. */
+
+void FB3110_UpdateSequenceNumber(void)
+{
+ flink.RequestSequenceNumber++;
+
+ if (flink.RequestSequenceNumber > 0x17 || flink.RequestSequenceNumber < 0x10) {
+ flink.RequestSequenceNumber = 0x10;
+ }
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for accessing functions on the 6110 and similar
+ phones.
+
+*/
+
+/* "Turn on" prototypes in n-6110.h */
+
+#define __n_6110_c
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+ #include "misc_win32.h"
+#endif
+
+/* Various header file */
+#ifndef VC6
+ #include "config.h"
+#endif
+
+#include "gsm-api.h"
+#include "gsm-coding.h"
+#include "newmodules/n6110.h"
+#include "newmodules/n7110.h"
+#include "protocol/fbus.h"
+#include "devices/device.h"
+/* Global variables used by code in gsm-api.c to expose the functions
+ supported by this model of phone. */
+
+
+
+
+
+
+
+/* Here we initialise model specific functions. */
+GSM_Functions N6110_Functions = {
+ N6110_Initialise,
+ N6110_DispatchMessage,
+ NULL_Terminate,
+ NULL_KeepAlive,
+ N6110_GetMemoryLocation,
+ N6110_WritePhonebookLocation,
+ N6110_GetSpeedDial,
+ N6110_SetSpeedDial,
+ N6110_GetMemoryStatus,
+ N6110_GetSMSStatus,
+ N6110_GetSMSCenter,
+ N6110_SetSMSCenter,
+ N6110_GetSMSMessage,
+ N6110_DeleteSMSMessage,
+ N6110_SendSMSMessage,
+ N6110_SaveSMSMessage,
+ N6110_GetRFLevel,
+ N6110_GetBatteryLevel,
+ N6110_GetPowerSource,
+ N6110_GetDisplayStatus,
+ N6110_EnterSecurityCode,
+ N6110_GetSecurityCodeStatus,
+ N6110_GetSecurityCode,
+ N6110_GetIMEI,
+ N6110_GetRevision,
+ N6110_GetModel,
+ N6110_GetDateTime,
+ N6110_SetDateTime,
+ N6110_GetAlarm,
+ N6110_SetAlarm,
+ N6110_DialVoice,
+ N6110_DialData,
+ N6110_GetIncomingCallNr,
+ N6110_GetNetworkInfo,
+ N6110_GetCalendarNote,
+ N6110_WriteCalendarNote,
+ N6110_DeleteCalendarNote,
+ N6110_NetMonitor,
+ N6110_SendDTMF,
+ N6110_GetBitmap,
+ N6110_SetBitmap,
+ N6110_SetRingTone,
+ N6110_SetBinRingTone,
+ N6110_GetBinRingTone,
+ N6110_Reset,
+ N6110_GetProfile,
+ N6110_SetProfile,
+ N6110_SendRLPFrame,
+ N6110_CancelCall,
+ N6110_PressKey,
+ N6110_EnableDisplayOutput,
+ N6110_DisableDisplayOutput,
+ N6110_EnableCellBroadcast,
+ N6110_DisableCellBroadcast,
+ N6110_ReadCellBroadcast,
+ N6110_PlayTone,
+ N6110_GetProductProfileSetting,
+ N6110_SetProductProfileSetting,
+ N6110_GetOperatorName,
+ N6110_SetOperatorName,
+ N6110_GetVoiceMailbox, N6110_Tests,
+ N6110_SimlockInfo,
+ UNIMPLEMENTED, //GetCalendarNotesInfo
+ N6110_GetSMSFolders,
+ N6110_ResetPhoneSettings,
+ N7110_GetWAPBookmark,
+ N7110_SetWAPBookmark,
+ N7110_GetWAPSettings,
+ N6110_CallDivert,
+ N6110_AnswerCall,
+ N6110_GetManufacturer
+};
+
+/* Mobile phone information */
+
+GSM_Information N6110_Information = {
+ "3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850",
+ /* Supported models in FBUS */
+ "3210|3310|3330|5110|5130|5190|6110|6130|6150|6190|8210|8850",
+ /* Supported models in MBUS */
+ "6110|6130|6150|8210|8850",
+ /* Supported models in FBUS over infrared */
+ "",
+ /* Supported models in FBUS over DLR3 */
+ "",
+ /* AT commands */
+ "8210|8850",
+ /* infrared sockets */
+ "6110|6130|6150|8210|8850",
+ /* Supported models in FBUS over infrared with Tekram device */
+ 4, /* Max RF Level */
+ 0, /* Min RF Level */
+ GRF_Arbitrary, /* RF level units */
+ 4, /* Max Battery Level */
+ 0, /* Min Battery Level */
+ GBU_Arbitrary, /* Battery level units */
+ GDT_DateTime, /* Have date/time support */
+ GDT_TimeOnly, /* Alarm supports time only */
+ 1 /* Only one alarm available */
+};
+
+const char *N6110_MemoryType_String [] = {
+ "", /* 0x00 */
+ "MT", /* 0x01 */
+ "ME", /* 0x02 */
+ "SM", /* 0x03 */
+ "FD", /* 0x04 */
+ "ON", /* 0x05 */
+ "EN", /* 0x06 */
+ "DC", /* 0x07 */
+ "RC", /* 0x08 */
+ "MC", /* 0x09 */
+};
+
+/* Magic bytes from the phone. */
+unsigned char MagicBytes[4] = { 0x00, 0x00, 0x00, 0x00 };
+
+/* For DisplayOutput */
+char PhoneScreen[5+1][27+1];
+int OldX=1000,OldY=0,NewX=0,NewY=0;
+
+void N6110_ReplyEnableExtendedCommands(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Answer for EnableExtendedSecurityCommands frame, meaning not known :-(\n"));
+#endif /* DEBUG */
+
+ CurrentEnableExtendedCommandsError=GE_NONE;
+}
+
+/* If you set make some things (for example,
+ change Security Code from phone's menu, disable and enable
+ phone), it won't answer for 0x40 frame - you won't be able
+ to play tones, get netmonitor, etc.
+
+ This function do thing called "Enabling extended security commands" -
+ it enables 0x40 frame functions.
+
+ This frame can also some other things - see below */
+GSM_Error N6110_EnableExtendedCommands (unsigned char status)
+{
+ unsigned char req[4] = { 0x00,
+ 0x01,0x64, /* Enable extended commands request */
+ 0x01 }; /* 0x01 - on, 0x00 - off,
+ 0x03 & 0x04 - soft & hard reset,
+ 0x06 - CONTACT SERVICE */
+
+ /* 0x06 MAKES CONTACT SERVICE! BE CAREFULL! */
+ /* When use 0x03 and had during session changed time & date
+ some phones (like 6150 or 6210) can ask for time & date after reset
+ or disable clock on the screen */
+ if (status!=0x06) req[3] = status;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentEnableExtendedCommandsError, 4, 0x40, req);
+}
+
+void N6110_ReplyIMEI(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#if defined WIN32 || !defined HAVE_SNPRINTF
+ sprintf(Current_IMEI, "%s", MessageBuffer+4);
+#else
+ snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+4);
+#endif
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: IMEI %s received\n"),Current_IMEI);
+#endif
+
+ CurrentGetIMEIError=GE_NONE;
+}
+
+GSM_Error N6110_SendIMEIFrame()
+{
+ unsigned char req[4] = {0x00, 0x01, 0x66, 0x00};
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ return NULL_SendMessageSequence (20, &CurrentGetIMEIError, 4, 0x40, req);
+}
+
+void N6110_ReplyHW(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i, j;
+
+ if (MessageBuffer[3]==0x05) {
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: Hardware version received: "));
+#endif
+
+ j=strlen(Current_Revision);
+ Current_Revision[j++]=',';
+ Current_Revision[j++]=' ';
+ Current_Revision[j++]='H';
+ Current_Revision[j++]='W';
+
+ for (i=5;i<9;i++) {
+#ifdef DEBUG
+ fprintf(stdout,_("%c"), MessageBuffer[i]);
+#endif
+ Current_Revision[j++]=MessageBuffer[i];
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("\n"));
+#endif
+
+ CurrentGetHWError=GE_NONE;
+ }
+}
+
+GSM_Error N6110_SendHWFrame()
+{
+ unsigned char req[4] = {0x00, 0x01, 0xc8, 0x05};
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ return NULL_SendMessageSequence (20, &CurrentGetHWError, 4, 0x40, req);
+}
+
+void N6110_ReplyID(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i, j;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Mobile phone model identification received:\n"));
+ fprintf(stdout, _(" Firmware: "));
+#endif
+
+ strcpy(Current_Revision,"SW");
+
+ i=6;j=2;
+ while (MessageBuffer[i]!=0x0a) {
+ Current_Revision[j]=MessageBuffer[i];
+#ifdef DEBUG
+ fprintf(stdout, _("%c"),MessageBuffer[i]);
+#endif
+ if (j==GSM_MAX_REVISION_LENGTH-1) {
+#ifdef DEBUG
+ fprintf(stderr,_("ERROR: increase GSM_MAX_REVISION_LENGTH!\n"));
+#endif
+ break;
+ }
+ j++;
+ i++;
+ }
+ Current_Revision[j+1]=0;
+
+#ifdef DEBUG
+ fprintf(stdout, _("\n Firmware date: "));
+#endif
+
+ i++;
+ while (MessageBuffer[i]!=0x0a) {
+#ifdef DEBUG
+ fprintf(stdout, _("%c"),MessageBuffer[i]);
+#endif
+ i++;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout, _("\n Model: "));
+#endif /* DEBUG */
+
+ i++;j=0;
+ while (MessageBuffer[i]!=0x0a) {
+ Current_Model[j]=MessageBuffer[i];
+#ifdef DEBUG
+ fprintf(stdout, _("%c"),MessageBuffer[i]);
+#endif
+ if (j==GSM_MAX_MODEL_LENGTH-1) {
+#ifdef DEBUG
+ fprintf(stderr,_("ERROR: increase GSM_MAX_MODEL_LENGTH!\n"));
+#endif
+ break;
+ }
+ j++;
+ i++;
+ }
+ Current_Model[j+1]=0;
+
+#ifdef DEBUG
+ fprintf(stdout, _("\n"));
+#endif /* DEBUG */
+
+ CurrentMagicError=GE_NONE;
+}
+
+GSM_Error N6110_SendIDFrame()
+{
+ unsigned char req[5] = {N6110_FRAME_HEADER, 0x03, 0x00};
+
+ return NULL_SendMessageSequence (50, &CurrentMagicError, 5, 0xd1, req);
+}
+
+/* This function send the status request to the phone. */
+/* Seems to be ignored in N3210 */
+GSM_Error N6110_SendStatusRequest(void)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01};
+
+ Protocol->SendMessage(4, 0x04, req);
+
+ return (GE_NONE);
+}
+
+void N6110_ReplyGetAuthentication(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#if defined WIN32 || !defined HAVE_SNPRINTF
+ sprintf(Current_IMEI, "%s", MessageBuffer+9);
+ sprintf(Current_Model, "%s", MessageBuffer+25);
+ sprintf(Current_Revision, "SW%s, HW%s", MessageBuffer+44, MessageBuffer+39);
+#else
+ snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+9);
+ snprintf(Current_Model, GSM_MAX_MODEL_LENGTH, "%s", MessageBuffer+25);
+ snprintf(Current_Revision, GSM_MAX_REVISION_LENGTH, "SW%s, HW%s", MessageBuffer+44, MessageBuffer+39);
+#endif
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Mobile phone identification received:\n"));
+ fprintf(stdout, _(" IMEI: %s\n"), Current_IMEI);
+ fprintf(stdout, _(" Model: %s\n"), Current_Model);
+ fprintf(stdout, _(" Production Code: %s\n"), MessageBuffer+31);
+ fprintf(stdout, _(" HW: %s\n"), MessageBuffer+39);
+ fprintf(stdout, _(" Firmware: %s\n"), MessageBuffer+44);
+
+ /* These bytes are probably the source of the "Accessory not connected"
+ messages on the phone when trying to emulate NCDS... I hope....
+ UPDATE: of course, now we have the authentication algorithm. */
+ fprintf(stdout, _(" Magic bytes: %02x %02x %02x %02x\n"), MessageBuffer[50], MessageBuffer[51], MessageBuffer[52], MessageBuffer[53]);
+#endif /* DEBUG */
+
+ MagicBytes[0]=MessageBuffer[50];
+ MagicBytes[1]=MessageBuffer[51];
+ MagicBytes[2]=MessageBuffer[52];
+ MagicBytes[3]=MessageBuffer[53];
+
+ CurrentMagicError=GE_NONE;
+}
+
+/* This function provides Nokia authentication protocol.
+
+ This code is written specially for gnokii project by Odinokov Serge.
+ If you have some special requests for Serge just write him to
+ apskaita@post.omnitel.net or serge@takas.lt
+
+ Reimplemented in C by Pavel JanÃk ml.
+
+ Nokia authentication protocol is used in the communication between Nokia
+ mobile phones (e.g. Nokia 6110) and Nokia Cellular Data Suite software,
+ commercially sold by Nokia Corp.
+
+ The authentication scheme is based on the token send by the phone to the
+ software. The software does it's magic (see the function
+ FB61_GetNokiaAuth()) and returns the result back to the phone. If the
+ result is correct the phone responds with the message "Accessory
+ connected!" displayed on the LCD. Otherwise it will display "Accessory not
+ supported" and some functions will not be available for use.
+
+ The specification of the protocol is not publicly available, no comment. */
+void N6110_GetNokiaAuth(unsigned char *Imei, unsigned char *MagicBytes, unsigned char *MagicResponse)
+{
+
+ int i, j, CRC=0;
+
+ /* This is our temporary working area. */
+
+ unsigned char Temp[16];
+
+ /* Here we put FAC (Final Assembly Code) and serial number into our area. */
+
+ Temp[0] = Imei[6];
+ Temp[1] = Imei[7];
+ Temp[2] = Imei[8];
+ Temp[3] = Imei[9];
+ Temp[4] = Imei[10];
+ Temp[5] = Imei[11];
+ Temp[6] = Imei[12];
+ Temp[7] = Imei[13];
+
+ /* And now the TAC (Type Approval Code). */
+
+ Temp[8] = Imei[2];
+ Temp[9] = Imei[3];
+ Temp[10] = Imei[4];
+ Temp[11] = Imei[5];
+
+ /* And now we pack magic bytes from the phone. */
+
+ Temp[12] = MagicBytes[0];
+ Temp[13] = MagicBytes[1];
+ Temp[14] = MagicBytes[2];
+ Temp[15] = MagicBytes[3];
+
+ for (i=0; i<=11; i++)
+ if (Temp[i + 1]& 1)
+ Temp[i]<<=1;
+
+ switch (Temp[15] & 0x03) {
+
+ case 1:
+ case 2:
+ j = Temp[13] & 0x07;
+
+ for (i=0; i<=3; i++)
+ Temp[i+j] ^= Temp[i+12];
+
+ break;
+
+ default:
+ j = Temp[14] & 0x07;
+
+ for (i=0; i<=3; i++)
+ Temp[i + j] |= Temp[i + 12];
+ }
+
+ for (i=0; i<=15; i++)
+ CRC ^= Temp[i];
+
+ for (i=0; i<=15; i++) {
+
+ switch (Temp[15 - i] & 0x06) {
+
+ case 0:
+ j = Temp[i] | CRC;
+ break;
+
+ case 2:
+ case 4:
+ j = Temp[i] ^ CRC;
+ break;
+
+ case 6:
+ j = Temp[i] & CRC;
+ break;
+ }
+
+ if (j == CRC)
+ j = 0x2c;
+
+ if (Temp[i] == 0)
+ j = 0;
+
+ MagicResponse[i] = j;
+
+ }
+}
+
+GSM_Error N6110_Authentication()
+{
+ unsigned char connect1[] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x02};
+ unsigned char connect2[] = {N6110_FRAME_HEADER, 0x20, 0x02};
+ unsigned char connect3[] = {N6110_FRAME_HEADER, 0x0d, 0x01, 0x00, 0x02};
+ unsigned char connect4[] = {N6110_FRAME_HEADER, 0x10};
+
+ unsigned char magic_connect[] = {N6110_FRAME_HEADER,
+ 0x12,
+
+ /* The real magic goes here ... These bytes are filled in with the
+ function N6110_GetNokiaAuth(). */
+
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+
+ /* NOKIA&GNOKII Accessory */
+
+ 0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x26, 0x4e, 0x4f, 0x4b, 0x49, 0x41, 0x20,
+ 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x6f, 0x72, 0x79,
+
+ 0x00, 0x00, 0x00, 0x00};
+
+#ifdef DEBUG
+ fprintf(stdout,_("Making authentication!\n"));
+#endif
+
+ usleep(100); Protocol->SendMessage(7, 0x02, connect1);
+ usleep(100); Protocol->SendMessage(5, 0x02, connect2);
+ usleep(100); Protocol->SendMessage(7, 0x02, connect3);
+
+ CurrentMagicError = GE_BUSY;
+
+ usleep(100); Protocol->SendMessage(4, 0x64, connect4);
+ if (NULL_WaitUntil(50,&CurrentMagicError)!=GE_NONE) return GE_TIMEOUT;
+
+ N6110_GetNokiaAuth(Current_IMEI, MagicBytes, magic_connect+4);
+
+ Protocol->SendMessage(45, 0x64, magic_connect);
+
+#ifdef DEBUG
+ fprintf(stdout,_("End of authentication!\n"));
+#endif
+
+ return GE_NONE;
+}
+
+/* Initialise variables and state machine. */
+GSM_Error N6110_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+ unsigned char init_char = N6110_SYNC_BYTE;
+ unsigned char end_init_char = N6110_IR_END_SYNC_BYTE;
+
+ int count;
+ int InitLength;
+
+ if (Protocol->Initialise(port_device,initlength,connection,rlp_callback)!=GE_NONE)
+ {
+ return GE_NOTSUPPORTED;
+ }
+
+ switch (CurrentConnectionType) {
+ case GCT_Irda:
+ case GCT_MBUS:
+ /* We don't think about authentication in Irda, because
+ AFAIK there are no phones working over sockets
+ and having authentication. In MBUS it doesn't work */
+ usleep(100);
+
+ if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ CurrentLinkOK = true;
+ break;
+
+ case GCT_FBUS:
+ case GCT_Infrared:
+ case GCT_Tekram:
+ InitLength = atoi(initlength);
+
+ if ((strcmp(initlength, "default") == 0) || (InitLength == 0)) {
+ InitLength = 250; /* This is the usual value, lower may work. */
+ }
+
+ if (CurrentConnectionType==GCT_Infrared ||
+ CurrentConnectionType==GCT_Tekram) {
+#ifdef DEBUG
+ fprintf(stdout,_("Setting infrared for FBUS communication...\n"));
+#endif
+ device_changespeed(9600);
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("Writing init chars...."));
+#endif
+
+ /* Initialise link with phone or what have you */
+ /* Send init string to phone, this is a bunch of 0x55 characters. Timing is
+ empirical. */
+ for (count = 0; count < InitLength; count ++) {
+ if (CurrentConnectionType!=GCT_Infrared &&
+ CurrentConnectionType!=GCT_Tekram) usleep(100);
+ Protocol->WritePhone(1,&init_char);
+ }
+
+ if (CurrentConnectionType==GCT_Infrared ||
+ CurrentConnectionType==GCT_Tekram) {
+ Protocol->WritePhone(1,&end_init_char);
+ usleep(200000);
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("Done\n"));
+#endif
+
+ if (CurrentConnectionType==GCT_Infrared ||
+ CurrentConnectionType==GCT_Tekram) {
+ device_changespeed(115200);
+ }
+
+ N6110_SendStatusRequest();
+
+ usleep(100);
+
+ if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ /* N51xx/61xx have something called authentication.
+ After making it phone display "Accessory connected"
+ and probably give access to some function (I'm not too sure about it !)
+ Anyway, I make it now for N51xx/61xx */
+ if (GetModelFeature (FN_AUTHENTICATION)!=0) {
+ if (N6110_Authentication()!=GE_NONE) return GE_TIMEOUT;
+ } else { /* No authentication */
+ if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;
+ }
+
+ break;
+ default:
+#ifdef DEBUG
+ fprintf(stdout,_("Unknown connection type in n6110.c!\n"));
+#endif
+ break;
+ }
+
+ return (GE_NONE);
+}
+
+/* This function translates GMT_MemoryType to N6110_MEMORY_xx */
+int N6110_GetMemoryType(GSM_MemoryType memory_type)
+{
+
+ int result;
+
+ switch (memory_type) {
+
+ case GMT_MT: result = N6110_MEMORY_MT; break;
+ case GMT_ME: result = N6110_MEMORY_ME; break;
+ case GMT_SM: result = N6110_MEMORY_SM; break;
+ case GMT_FD: result = N6110_MEMORY_FD; break;
+ case GMT_ON: result = N6110_MEMORY_ON; break;
+ case GMT_EN: result = N6110_MEMORY_EN; break;
+ case GMT_DC: result = N6110_MEMORY_DC; break;
+ case GMT_RC: result = N6110_MEMORY_RC; break;
+ case GMT_MC: result = N6110_MEMORY_MC; break;
+ default : result = N6110_MEMORY_XX;
+
+ }
+
+ return (result);
+}
+
+void N6110_ReplyCallDivert(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x02:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call divert status received\n"));
+ fprintf(stdout, _(" Divert type: "));
+ switch (MessageBuffer[6]) {
+ case 0x43: fprintf(stdout, _("when busy"));break;
+ case 0x3d: fprintf(stdout, _("when not answered"));break;
+ case 0x3e: fprintf(stdout, _("when phone off or no coverage"));break;
+ case 0x15: fprintf(stdout, _("all types of diverts"));break; //?
+ case 0x02: fprintf(stdout, _("all types of diverts"));break; //?
+ default: fprintf(stdout, _("unknown %i"),MessageBuffer[6]);break;
+ }
+ fprintf(stdout, _("\n Calls type : "));
+ if (MessageBuffer[6]==0x02)
+ fprintf(stdout, _("voice, fax & data")); //?
+ else {
+ switch (MessageBuffer[8]) {
+ case 0x0b: fprintf(stdout, _("voice"));break;
+ case 0x0d: fprintf(stdout, _("fax"));break;
+ case 0x19: fprintf(stdout, _("data"));break;
+ default: fprintf(stdout, _("unknown %i"),MessageBuffer[8]);break;
+ }
+ }
+ fprintf(stdout, _("\n"));
+ if (MessageBuffer[10]==0x01) {
+ fprintf(stdout, _(" Status : active\n"));
+ fprintf(stdout, _(" Timeout : %i seconds\n"),MessageBuffer[45]);
+ fprintf(stdout, _(" Number : %s\n"),GSM_UnpackSemiOctetNumber(MessageBuffer+12,true));
+ } else {
+ fprintf(stdout, _(" Status : deactivated\n"));
+ }
+#endif /* DEBUG */
+
+ if (CurrentCallDivert!=NULL) {
+ switch (MessageBuffer[6]) {
+ case 0x43: CurrentCallDivert->DType=GSM_CDV_Busy;break;
+ case 0x3d: CurrentCallDivert->DType=GSM_CDV_NoAnswer;break;
+ case 0x3e: CurrentCallDivert->DType=GSM_CDV_OutOfReach;break;
+ case 0x15: CurrentCallDivert->DType=GSM_CDV_AllTypes;break; //?
+ case 0x02: CurrentCallDivert->DType=GSM_CDV_AllTypes;break; //?
+ }
+
+ if (MessageBuffer[6]==0x02) //?
+ CurrentCallDivert->CType=GSM_CDV_AllCalls;
+ else {
+ switch (MessageBuffer[8]) {
+ case 0x0b: CurrentCallDivert->CType=GSM_CDV_VoiceCalls;break;
+ case 0x0d: CurrentCallDivert->CType=GSM_CDV_FaxCalls; break;
+ case 0x19: CurrentCallDivert->CType=GSM_CDV_DataCalls; break;
+ }
+ }
+
+ if (MessageBuffer[10]==0x01) {
+ CurrentCallDivert->Enabled=true;
+ CurrentCallDivert->Timeout=MessageBuffer[45];
+ strcpy(CurrentCallDivert->Number,GSM_UnpackSemiOctetNumber(MessageBuffer+12,true));
+ } else {
+ CurrentCallDivert->Enabled=false;
+ }
+ CurrentCallDivertError=GE_NONE;
+ }
+ break;
+
+ case 0x03:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call divert status receiving error ?\n"));
+#endif
+ CurrentCallDivertError=GE_UNKNOWN;
+ break;
+ }
+}
+
+GSM_Error N6110_CallDivert(GSM_CallDivert *cd)
+{
+ char req[55] = { N6110_FRAME_HEADER, 0x01,
+ 0x00, /* operation */
+ 0x00,
+ 0x00, /* divert type */
+ 0x00, /* call type */
+ 0x00 };
+ GSM_Error error;
+
+ int length = 0x09;
+
+ switch (cd->Operation) {
+ case GSM_CDV_Register:
+ case GSM_CDV_Enable:
+ req[4] = 0x03;
+ req[8] = 0x01;
+ req[29]= GSM_PackSemiOctetNumber(cd->Number, req + 9, false);
+ req[52]= cd->Timeout;
+ length = 55;
+ break;
+ case GSM_CDV_Erasure:
+ case GSM_CDV_Disable:
+ req[4] = 0x04;
+ break;
+ case GSM_CDV_Query:
+ req[4] = 0x05;
+ break;
+ default:
+ return GE_NOTIMPLEMENTED;
+ }
+
+ switch (cd->DType) {
+ case GSM_CDV_AllTypes : req[6] = 0x15; break;
+ case GSM_CDV_Busy : req[6] = 0x43; break;
+ case GSM_CDV_NoAnswer : req[6] = 0x3d; break;
+ case GSM_CDV_OutOfReach: req[6] = 0x3e; break;
+ default: return GE_NOTIMPLEMENTED;
+ }
+
+ if ((cd->DType == GSM_CDV_AllTypes) &&
+ (cd->CType == GSM_CDV_AllCalls))
+ req[6] = 0x02;
+
+ switch (cd->CType) {
+ case GSM_CDV_AllCalls : break;
+ case GSM_CDV_VoiceCalls: req[7] = 0x0b; break;
+ case GSM_CDV_FaxCalls : req[7] = 0x0d; break;
+ case GSM_CDV_DataCalls : req[7] = 0x19; break;
+ default: return GE_NOTIMPLEMENTED;
+ }
+
+ CurrentCallDivert = cd;
+
+ error=NULL_SendMessageSequence
+ (100, &CurrentCallDivertError, length, 0x06, req);
+
+ CurrentCallDivert = NULL;
+
+ return error;
+}
+
+GSM_Error N6110_Tests()
+{
+ unsigned char buffer[3]={0x00,0x01,0xcf};
+ unsigned char buffer3[8]={0x00,0x01,0xce,0x1d,0xfe,0x23,0x00,0x00};
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ //make almost all tests
+ Protocol->SendMessage(8, 0x40, buffer3);
+
+ while (GSM->Initialise(PortDevice, "50", CurrentConnectionType, CurrentRLP_RXCallback)!=GE_NONE) {};
+
+ sleep(2);
+
+ return NULL_SendMessageSequence
+ (200, &CurrentNetworkInfoError, 3, 0x40, buffer);
+}
+
+void N6110_DisplayTestsInfo(u8 *MessageBuffer) {
+
+ int i;
+
+ CurrentNetworkInfoError=GE_NONE;
+
+ for (i=0;i<MessageBuffer[3];i++) {
+ switch (i) {
+ case 0: fprintf(stdout,_("Unknown(%i) "),i);break;
+ case 1: fprintf(stdout,_("MCU ROM checksum "));break;
+ case 2: fprintf(stdout,_("MCU RAM interface "));break;
+ case 3: fprintf(stdout,_("MCU RAM component "));break;
+ case 4: fprintf(stdout,_("MCU EEPROM interface "));break;
+ case 5: fprintf(stdout,_("MCU EEPROM component "));break;
+ case 6: fprintf(stdout,_("Real Time Clock battery "));break;
+ case 7: fprintf(stdout,_("CCONT interface "));break;
+ case 8: fprintf(stdout,_("AD converter "));break;
+ case 9: fprintf(stdout,_("SW Reset "));break;
+ case 10:fprintf(stdout,_("Power Off "));break;
+ case 11:fprintf(stdout,_("Security Data "));break;
+ case 12:fprintf(stdout,_("EEPROM Tune checksum "));break;
+ case 13:fprintf(stdout,_("PPM checksum "));break;
+ case 14:fprintf(stdout,_("MCU download DSP "));break;
+ case 15:fprintf(stdout,_("DSP alive "));break;
+ case 16:fprintf(stdout,_("COBBA serial "));break;
+ case 17:fprintf(stdout,_("COBBA paraller "));break;
+ case 18:fprintf(stdout,_("EEPROM security checksum"));break;
+ case 19:fprintf(stdout,_("PPM validity "));break;
+ case 20:fprintf(stdout,_("Warranty state "));break;
+ case 21:fprintf(stdout,_("Simlock check "));break;
+ case 22:fprintf(stdout,_("IMEI check? "));break;//from PC-Locals.is OK?
+ default:fprintf(stdout,_("Unknown(%i) "),i);break;
+ }
+ switch (MessageBuffer[4+i]) {
+ case 0: fprintf(stdout,_(" : done, result OK"));break;
+ case 0xff:fprintf(stdout,_(" : not done, result unknown"));break;
+ case 254: fprintf(stdout,_(" : done, result NOT OK"));break;
+ default: fprintf(stdout,_(" : result unknown(%i)"),MessageBuffer[4+i]);break;
+ }
+ fprintf(stdout,_("\n"));
+ }
+}
+
+void N6110_ReplySimlockInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i, j;
+
+ char uni[100];
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Simlock info received\n"));
+
+ j=0;
+ for (i=0; i < 12; i++)
+ {
+ if (j<24) {
+ fprintf(stdout,_("%c"), ('0' + (MessageBuffer[9+i] >> 4)));
+ j++;
+ }
+ if (j==5 || j==15) fprintf(stdout, _("\n"));
+ if (j!=15) {
+ if (j<24) {
+ fprintf(stdout,_("%c"), ('0' + (MessageBuffer[9+i] & 0x0f)));
+ j++;
+ }
+ } else j++;
+ if (j==20 || j==24) fprintf(stdout, _("\n"));
+ }
+
+ if ((MessageBuffer[6] & 1) == 1) fprintf(stdout,_("lock 1 closed\n"));
+ if ((MessageBuffer[6] & 2) == 2) fprintf(stdout,_("lock 2 closed\n"));
+ if ((MessageBuffer[6] & 4) == 4) fprintf(stdout,_("lock 3 closed\n"));
+ if ((MessageBuffer[6] & 8) == 8) fprintf(stdout,_("lock 4 closed\n"));
+
+ /* I'm not sure here at all */
+ if ((MessageBuffer[5] & 1) == 1) fprintf(stdout,_("lock 1 - user\n"));
+ if ((MessageBuffer[5] & 2) == 2) fprintf(stdout,_("lock 2 - user\n"));
+ if ((MessageBuffer[5] & 4) == 4) fprintf(stdout,_("lock 3 - user\n"));
+ if ((MessageBuffer[5] & 8) == 8) fprintf(stdout,_("lock 4 - user\n"));
+
+ fprintf(stdout,_("counter for lock1: %i\n"),MessageBuffer[21]);
+ fprintf(stdout,_("counter for lock2: %i\n"),MessageBuffer[22]);
+ fprintf(stdout,_("counter for lock3: %i\n"),MessageBuffer[23]);
+ fprintf(stdout,_("counter for lock4: %i\n"),MessageBuffer[24]);
+
+#endif
+
+ j=0;
+ for (i=0; i < 12; i++)
+ {
+ if (j<24) {
+ uni[j]='0' + (MessageBuffer[9+i] >> 4);
+ j++;
+ }
+ if (j!=15) {
+ if (j<24) {
+ uni[j]='0' + (MessageBuffer[9+i] & 0x0f);
+ j++;
+ }
+ } else j++;
+ }
+
+ strncpy(CurrentSimLock->simlocks[0].data,uni,5);
+ CurrentSimLock->simlocks[0].data[5]=0;
+ strncpy(CurrentSimLock->simlocks[3].data,uni+5,10);
+ CurrentSimLock->simlocks[3].data[10]=0;
+ strncpy(CurrentSimLock->simlocks[1].data,uni+16,4);
+ CurrentSimLock->simlocks[1].data[4]=0;
+ strncpy(CurrentSimLock->simlocks[2].data,uni+20,4);
+ CurrentSimLock->simlocks[2].data[4]=0;
+
+ CurrentSimLock->simlocks[0].enabled=((MessageBuffer[6] & 1) == 1);
+ CurrentSimLock->simlocks[1].enabled=((MessageBuffer[6] & 2) == 2);
+ CurrentSimLock->simlocks[2].enabled=((MessageBuffer[6] & 4) == 4);
+ CurrentSimLock->simlocks[3].enabled=((MessageBuffer[6] & 8) == 8);
+
+ CurrentSimLock->simlocks[0].factory=((MessageBuffer[5] & 1) != 1);
+ CurrentSimLock->simlocks[1].factory=((MessageBuffer[5] & 2) != 2);
+ CurrentSimLock->simlocks[2].factory=((MessageBuffer[5] & 4) != 4);
+ CurrentSimLock->simlocks[3].factory=((MessageBuffer[5] & 8) != 8);
+
+ CurrentSimLock->simlocks[0].counter=MessageBuffer[21];
+ CurrentSimLock->simlocks[1].counter=MessageBuffer[22];
+ CurrentSimLock->simlocks[2].counter=MessageBuffer[23];
+ CurrentSimLock->simlocks[3].counter=MessageBuffer[24];
+
+ CurrentSimlockInfoError=GE_NONE;
+}
+
+GSM_Error N6110_SimlockInfo(GSM_AllSimlocks *siml)
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00,0x01,0x8a,0x00};
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ CurrentSimLock=siml;
+
+ return NULL_SendMessageSequence (50, &CurrentSimlockInfoError, 4, 0x40, req);
+}
+
+void N6110_ReplyResetPhoneSettings(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Resetting phone settings\n"));
+#endif /* DEBUG */
+
+ CurrentResetPhoneSettingsError=GE_NONE;
+}
+
+GSM_Error N6110_ResetPhoneSettings()
+{
+ GSM_Error error;
+ unsigned char req[] = {0x00,0x01,0x65,0x08,0x00};
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentResetPhoneSettingsError, 5, 0x40, req);
+}
+GSM_Error N6110_GetManufacturer(char *manufacturer)
+{
+ strcpy (manufacturer, "Nokia");
+ return (GE_NONE);
+}
+
+GSM_Error N6110_GetVoiceMailbox ( GSM_PhonebookEntry *entry)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01, 0x00, 0x00, 0x00};
+
+ GSM_Error error;
+
+ CurrentPhonebookEntry = entry;
+
+ req[4] = N6110_MEMORY_VOICE;
+ req[5] = 0x00; /* Location - isn't important, but... */
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentPhonebookError, 7, 0x03, req);
+
+ CurrentPhonebookEntry = NULL;
+
+ return error;
+}
+
+void N6110_ReplyGetOperatorName(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i, count;
+
+ GSM_Bitmap NullBitmap;
+
+ DecodeNetworkCode(MessageBuffer+5, NullBitmap.netcode);
+
+ count=8;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Info about downloaded operator name received: %s network (for gnokii \"%s\", for phone \""),
+ NullBitmap.netcode,
+ GSM_GetNetworkName(NullBitmap.netcode));
+#endif
+
+ i=count;
+ while (MessageBuffer[count]!=0) {
+#ifdef DEBUG
+ fprintf(stdout,_("%c"),MessageBuffer[count]);
+#endif
+ count++;
+ }
+
+ strcpy(CurrentGetOperatorNameNetwork->Code, NullBitmap.netcode);
+ strncpy(CurrentGetOperatorNameNetwork->Name, MessageBuffer+i,count-i+1);
+
+#ifdef DEBUG
+ fprintf(stdout,_("\")\n"));
+#endif
+
+ CurrentGetOperatorNameError=GE_NONE;
+}
+
+GSM_Error N6110_GetOperatorName (GSM_Network *operator)
+{
+ unsigned char req[] = { 0x00,0x01,0x8c,0x00};
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ CurrentGetOperatorNameNetwork = operator;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentGetOperatorNameError, 4, 0x40, req);
+
+ CurrentGetOperatorNameNetwork = NULL;
+
+ return error;
+}
+
+void N6110_ReplySetOperatorName(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Downloaded operator name changed\n"));
+#endif
+
+ CurrentSetOperatorNameError=GE_NONE;
+}
+
+GSM_Error N6110_SetOperatorName (GSM_Network *operator)
+{
+ unsigned char req[256] = { 0x00,0x01,0x8b,0x00,
+ 0x00,0x00, /* MCC */
+ 0x00}; /* MNC */
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ EncodeNetworkCode(req+4,operator->Code);
+
+ strncpy(req+7,operator->Name,200);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSetOperatorNameError, 8+strlen(operator->Name), 0x40, req);
+}
+
+void N6110_ReplyGetMemoryStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x08:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Memory status received:\n"));
+
+ fprintf(stdout, _(" Memory Type: %s\n"), N6110_MemoryType_String[MessageBuffer[4]]);
+ fprintf(stdout, _(" Used: %d\n"), MessageBuffer[6]);
+ fprintf(stdout, _(" Free: %d\n"), MessageBuffer[5]);
+#endif /* DEBUG */
+
+ CurrentMemoryStatus->Used = MessageBuffer[6];
+ CurrentMemoryStatus->Free = MessageBuffer[5];
+ CurrentMemoryStatusError = GE_NONE;
+
+ break;
+
+ case 0x09:
+
+#ifdef DEBUG
+ switch (MessageBuffer[4]) {
+ case 0x6f:
+ fprintf(stdout, _("Message: Memory status error, phone is probably powered off.\n"));break;
+ case 0x7d:
+ fprintf(stdout, _("Message: Memory status error, memory type not supported by phone model.\n"));break;
+ case 0x8d:
+ fprintf(stdout, _("Message: Memory status error, waiting for security code.\n"));break;
+ default:
+ fprintf(stdout, _("Message: Unknown Memory status error, subtype (MessageBuffer[4]) = %02x\n"),MessageBuffer[4]);break;
+ }
+#endif
+
+ switch (MessageBuffer[4]) {
+ case 0x6f:CurrentMemoryStatusError = GE_TIMEOUT;break;
+ case 0x7d:CurrentMemoryStatusError = GE_INTERNALERROR;break;
+ case 0x8d:CurrentMemoryStatusError = GE_INVALIDSECURITYCODE;break;
+ default:break;
+ }
+
+ break;
+
+ }
+}
+
+/* This function is used to get storage status from the phone. It currently
+ supports two different memory areas - internal and SIM. */
+GSM_Error N6110_GetMemoryStatus(GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x07, /* MemoryStatus request */
+ 0x00 /* MemoryType */
+ };
+
+ GSM_Error error;
+
+ CurrentMemoryStatus = Status;
+
+ req[4] = N6110_GetMemoryType(Status->MemoryType);
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentMemoryStatusError, 5, 0x03, req);
+
+ CurrentMemoryStatus = NULL;
+
+ return error;
+}
+
+void N6110_ReplyGetNetworkInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ GSM_NetworkInfo NullNetworkInfo;
+
+ /* Make sure we are expecting NetworkInfo frame */
+ if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Network informations:\n"));
+#endif
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Network informations not requested, but received:\n"));
+#endif
+ }
+
+ sprintf(NullNetworkInfo.NetworkCode, "%x%x%x %x%x", MessageBuffer[14] & 0x0f, MessageBuffer[14] >>4, MessageBuffer[15] & 0x0f, MessageBuffer[16] & 0x0f, MessageBuffer[16] >>4);
+
+ sprintf(NullNetworkInfo.CellID, "%02x%02x", MessageBuffer[10], MessageBuffer[11]);
+
+ sprintf(NullNetworkInfo.LAC, "%02x%02x", MessageBuffer[12], MessageBuffer[13]);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" CellID: %s\n"), NullNetworkInfo.CellID);
+ fprintf(stdout, _(" LAC: %s\n"), NullNetworkInfo.LAC);
+ fprintf(stdout, _(" Network code: %s\n"), NullNetworkInfo.NetworkCode);
+ fprintf(stdout, _(" Network name: %s (%s)\n"),
+ GSM_GetNetworkName(NullNetworkInfo.NetworkCode),
+ GSM_GetCountryName(NullNetworkInfo.NetworkCode));
+ fprintf(stdout, _(" Status: "));
+
+ switch (MessageBuffer[8]) {
+ case 0x01: fprintf(stdout, _("home network selected")); break;
+ case 0x02: fprintf(stdout, _("roaming network")); break;
+ case 0x03: fprintf(stdout, _("requesting network")); break;
+ case 0x04: fprintf(stdout, _("not registered in the network")); break;
+ default: fprintf(stdout, _("unknown"));
+ }
+
+ fprintf(stdout, "\n");
+
+ fprintf(stdout, _(" Network selection: %s\n"), MessageBuffer[9]==1?_("manual"):_("automatic"));
+#endif /* DEBUG */
+
+ /* Make sure we are expecting NetworkInfo frame */
+ if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY)
+ *CurrentNetworkInfo=NullNetworkInfo;
+
+ CurrentNetworkInfoError = GE_NONE;
+}
+
+GSM_Error N6110_GetNetworkInfo(GSM_NetworkInfo *NetworkInfo)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x70
+ };
+
+ GSM_Error error;
+
+ CurrentNetworkInfo = NetworkInfo;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentNetworkInfoError, 4, 0x0a, req);
+
+ CurrentNetworkInfo = NULL;
+
+ return error;
+}
+
+void N6110_ReplyGetProductProfileSetting(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Product Profile Settings received -"));
+ for (i=0;i<4;i++) fprintf(stdout, _(" %02x"),MessageBuffer[3+i]);
+ fprintf(stdout, _("\n"));
+#endif
+
+ for (i=0;i<4;i++) CurrentPPS[i]=MessageBuffer[3+i];
+
+ CurrentProductProfileSettingsError=GE_NONE;
+}
+
+GSM_Error N6110_GetProductProfileSetting (GSM_PPS *PPS)
+{
+ unsigned char req[] = { 0x00, 0x01,0x6a };
+
+ int i,j;
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentProductProfileSettingsError, 3, 0x40, req);
+ if (error!=GE_NONE) return error;
+
+ switch (PPS->Name) {
+ case PPS_ALS : PPS->bool_value=(CurrentPPS[1]&32); break;
+ case PPS_GamesMenu: PPS->bool_value=(CurrentPPS[3]&64); break;
+ case PPS_HRData : PPS->bool_value=(CurrentPPS[0]&64); break;
+ case PPS_14400Data: PPS->bool_value=(CurrentPPS[0]&128);break;
+ case PPS_EFR : PPS->int_value =(CurrentPPS[0]&1) +(CurrentPPS[0]&2); break;
+ case PPS_FR : PPS->int_value =(CurrentPPS[0]&16)/16+(CurrentPPS[0]&32)/16;break;
+ case PPS_HR : PPS->int_value =(CurrentPPS[0]&4)/4 +(CurrentPPS[0]&8)/4; break;
+ case PPS_VibraMenu: PPS->bool_value=(CurrentPPS[4]&64); break;
+ case PPS_LCDContrast:
+ PPS->int_value=0;
+ j=1;
+ for (i=0;i<5;i++) {
+ if (CurrentPPS[3]&j) PPS->int_value=PPS->int_value+j;
+ j=j*2;
+ }
+ PPS->int_value=PPS->int_value*100/32;
+ break;
+
+ }
+
+ return (GE_NONE);
+}
+
+void N6110_ReplySetProductProfileSetting(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ int i;
+
+ fprintf(stdout, _("Message: Product Profile Settings set to"));
+ for (i=0;i<4;i++) fprintf(stdout, _(" %02x"),CurrentPPS[i]);
+ fprintf(stdout, _("\n"));
+#endif
+
+ CurrentProductProfileSettingsError=GE_NONE;
+}
+
+GSM_Error N6110_SetProductProfileSetting (GSM_PPS *PPS)
+{
+ unsigned char req[] = { 0x00, 0x01,0x6b,
+ 0x00, 0x00, 0x00, 0x00 }; /* bytes with Product Profile Setings */
+ unsigned char settings[32];
+
+ GSM_PPS OldPPS;
+
+ int i,j,z;
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ OldPPS.Name=PPS_ALS;
+ error=N6110_GetProductProfileSetting(&OldPPS);
+ if (error!=GE_NONE) return error;
+
+ j=128;z=0;
+ for (i=0;i<32;i++) {
+ if (CurrentPPS[z]&j)
+ settings[i]='1';
+ else
+ settings[i]='0';
+ if (j==1) {
+ j=128;
+ z++;
+ } else j=j/2;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("Current settings: "));
+ for (i=0;i<32;i++) {
+ fprintf(stdout,_("%c"),settings[i]);
+ }
+ fprintf(stdout,_("\n"));
+#endif
+
+ switch (PPS->Name) {
+ case PPS_ALS :settings[10]=PPS->bool_value?'1':'0';break;
+ case PPS_HRData :settings[ 5]=PPS->bool_value?'1':'0';break;
+ case PPS_14400Data:settings[ 6]=PPS->bool_value?'1':'0';break;
+ default :break;
+ }
+
+ j=128;z=0;
+ for (i=0;i<32;i++) {
+ if (settings[i]=='1') req[z+3]=req[z+3]+j;
+ if (j==1) {
+ j=128;
+ z++;
+ } else j=j/2;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("Current settings: "));
+ for (i=0;i<4;i++) {
+ fprintf(stdout,_("%i "),req[i+3]);
+ }
+ fprintf(stdout,_("\n"));
+#endif
+
+ for (i=0;i<4;i++) {
+ CurrentPPS[i]=req[i+3];
+ }
+
+ return NULL_SendMessageSequence
+ (20, &CurrentProductProfileSettingsError, 7, 0x40, req);
+}
+
+void N6110_ReplyPressKey(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ if (MessageBuffer[4]==CurrentPressKeyEvent) CurrentPressKeyError=GE_NONE;
+ else CurrentPressKeyError=GE_UNKNOWN; /* MessageBuffer[4] = 0x05 */
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Result of key "));
+ switch (MessageBuffer[4])
+ {
+ case PRESSPHONEKEY: fprintf(stdout, _("press OK\n"));break;
+ case RELEASEPHONEKEY: fprintf(stdout, _("release OK\n"));break;
+ default: fprintf(stdout, _("press or release - error\n"));break;
+ }
+#endif /* DEBUG */
+}
+
+GSM_Error N6110_PressKey(int key, int event)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x42, 0x01, 0x00, 0x01};
+
+ req[4]=event; /* if we press or release key */
+ req[5]=key;
+
+ CurrentPressKeyEvent=event;
+
+ return NULL_SendMessageSequence
+ (10, &CurrentPressKeyError, 7, 0x0c, req);
+}
+
+void N6110_ReplyDisplayOutput(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ /* Hopefully is 64 larger as FB38_MAX* / N6110_MAX* */
+ char model[64];
+
+ int i, j;
+
+ char uni[100];
+
+ switch(MessageBuffer[3]) {
+
+ /* Phone sends displayed texts */
+ case 0x50:
+ NewX=MessageBuffer[6];
+ NewY=MessageBuffer[5];
+
+ DecodeUnicode (uni, MessageBuffer+8, MessageBuffer[7]);
+
+#ifdef DEBUG
+ fprintf(stdout, _("New displayed text (%i %i): \"%s\"\n"),NewX,NewY,uni);
+#endif /* DEBUG */
+
+ while (N6110_GetModel(model) != GE_NONE)
+ sleep(1);
+
+ /* With these rules it works almost excellent with my N5110 */
+ /* I don't have general rule :-(, that's why you must experiment */
+ /* with your phone. Nokia could make it better. MW */
+ /* It's almost OK for N5110*/
+ /* FIX ME: it will be the same for N5130 and 3210 too*/
+ if (!strcmp(model,"NSE-1"))
+ {
+ /* OldX==1000 means - it's first time */
+ if (OldX==1000) {
+
+ /* Clean table */
+ for (i=0;i<5+1;i++) {
+ for (j=0;j<27+1;j++) {PhoneScreen[i][j]=' ';}
+ }
+ OldX=0;
+ }
+
+ if ((OldX==0 && OldY==31 && NewX==29 && NewY==46) ||
+ (OldX==0 && OldY==13 && NewX==23 && NewY==46)) {
+ /* Clean the line with current text */
+ for (j=0;j<27+1;j++) {PhoneScreen[NewY/(47/5)][j]=' ';}
+
+ /* Inserts text into table */
+ for (i=0; i<MessageBuffer[7];i++) {
+ PhoneScreen[NewY/(47/5)][NewX/(84/27)+i]=uni[i];
+ }
+
+ }
+
+ if ((OldX==0 && OldY==21 && NewX==0 && NewY==10) ||
+ (OldX==0 && OldY==10 && NewX==35 && NewY==46)) {
+ } else {
+ if ((OldX!=0 && NewX==0 && NewY!=6) ||
+ (OldX==0 && NewX!=0 && OldY!=13 && OldY!=22) ||
+ (OldX==0 && NewX==0 && NewY<OldY && (NewY!=13 || OldY!=26)) ||
+ (OldY==5 && NewY!=5) ||
+ (OldX==0 && OldY==13 && NewX==23 && NewY==46)) {
+
+ /* Writes "old" screen */
+ for (i=0;i<5+1;i++) {
+ for (j=0;j<27+1;j++) {fprintf(stdout,_("%c"),PhoneScreen[i][j]);}
+ fprintf(stdout,_("\n"));
+ }
+
+ /* Clean table */
+ for (i=0;i<5+1;i++) {
+ for (j=0;j<27+1;j++) {PhoneScreen[i][j]=' ';}
+ }
+ }
+ }
+
+ /* Clean the line with current text */
+ for (j=0;j<27+1;j++) {PhoneScreen[NewY/(47/5)][j]=' ';}
+
+ /* Inserts text into table */
+ for (i=0; i<MessageBuffer[7];i++) {
+ PhoneScreen[NewY/(47/5)][NewX/(84/27)+i]=uni[i];
+ }
+
+ OldY=NewY;
+ OldX=NewX;
+ } else {
+#ifndef DEBUG
+ fprintf(stdout, _("%s\n"),uni);
+#endif
+ }
+
+ break;
+
+ case 0x54:
+
+ if (MessageBuffer[4]==1)
+ {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Display output successfully disabled/enabled.\n"));
+#endif /* DEBUG */
+
+ CurrentDisplayOutputError=GE_NONE;
+ }
+
+ break;
+ }
+}
+
+GSM_Error SetDisplayOutput(unsigned char state)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x53, 0x00};
+
+ req[4]=state;
+
+ return NULL_SendMessageSequence
+ (30, &CurrentDisplayOutputError, 5, 0x0d, req);
+}
+
+GSM_Error N6110_EnableDisplayOutput()
+{
+ return SetDisplayOutput(0x01);
+}
+
+GSM_Error N6110_DisableDisplayOutput()
+{
+ return SetDisplayOutput(0x02);
+}
+
+/* If it is interesting for somebody: we can use 0x40 msg for it
+ and it will work for all phones. See n6110.txt for details */
+GSM_Error N6110_AnswerCall(char s)
+{
+ unsigned char req0[] = { N6110_FRAME_HEADER, 0x42,0x05,0x01,0x07, 0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80};
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x06, 0x00, 0x00};
+
+ req[4]=s;
+
+#ifdef DEBUG
+ fprintf(stdout,_("Answering call %d\n\r"),s);
+#endif
+
+ Protocol->SendMessage(sizeof(req0), 0x01, req0);
+ sleep(1);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentMagicError, sizeof(req) , 0x01, req);
+}
+
+void N6110_ReplyGetProfile(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ /* Profile feature */
+ case 0x14:
+
+ switch(GetModelFeature (FN_PROFILES)) {
+ case F_PROF33:
+ switch (MessageBuffer[6]) {
+ case 0x00: CurrentProfile->KeypadTone = MessageBuffer[8]; break;
+ case 0x01: CurrentProfile->CallAlert = MessageBuffer[8]; break;
+ case 0x02: CurrentProfile->Ringtone = MessageBuffer[8]; break;
+ case 0x03: CurrentProfile->Volume = MessageBuffer[8]; break;
+ case 0x04: CurrentProfile->MessageTone = MessageBuffer[8]; break;
+ case 0x05: CurrentProfile->Vibration = MessageBuffer[8]; break;
+ case 0x06: CurrentProfile->WarningTone = MessageBuffer[8]; break;
+ case 0x07: CurrentProfile->ScreenSaver = MessageBuffer[8]; break;
+ default:
+#ifdef DEBUG
+ fprintf(stdout,_("feature %i = value %i\n\n"),MessageBuffer[6],MessageBuffer[8]);
+#endif
+ break;
+ }
+ break;
+ default:
+ switch (MessageBuffer[6]) {
+ case 0x00: CurrentProfile->KeypadTone = MessageBuffer[8];break;
+ case 0x01: CurrentProfile->Lights = MessageBuffer[8];break;
+ case 0x02: CurrentProfile->CallAlert = MessageBuffer[8];break;
+ case 0x03: CurrentProfile->Ringtone = MessageBuffer[8];break;
+ case 0x04: CurrentProfile->Volume = MessageBuffer[8];break;
+ case 0x05: CurrentProfile->MessageTone = MessageBuffer[8];break;
+ case 0x06: CurrentProfile->Vibration = MessageBuffer[8];break;
+ case 0x07: CurrentProfile->WarningTone = MessageBuffer[8];break;
+ case 0x08: CurrentProfile->CallerGroups = MessageBuffer[8];break;
+ case 0x09: CurrentProfile->AutomaticAnswer = MessageBuffer[8];break;
+ default:
+#ifdef DEBUG
+ fprintf(stdout,_("feature %i = value %i\n\n"),MessageBuffer[6],MessageBuffer[8]);
+#endif
+ break;
+ }
+ break;
+ }
+
+ CurrentProfileError = GE_NONE;
+ break;
+
+ /* Incoming profile name */
+ case 0x1b:
+
+ if (MessageBuffer[9] == 0x00) {
+ CurrentProfile->DefaultName=MessageBuffer[8];
+ } else {
+ CurrentProfile->DefaultName=-1;
+
+ /* Here name is in Unicode */
+ if (GetModelFeature (FN_PROFILES)==F_PROF33) {
+ DecodeUnicode (CurrentProfile->Name, MessageBuffer+10, MessageBuffer[9]/2);
+ } else {
+ /* ...here not */
+ sprintf(CurrentProfile->Name, MessageBuffer + 10, MessageBuffer[9]);
+ CurrentProfile->Name[MessageBuffer[9]] = '\0';
+ }
+ }
+
+ CurrentProfileError = GE_NONE;
+ break;
+
+ }
+}
+
+/* Needs SIM card with PIN in phone */
+GSM_Error N6110_GetProfile(GSM_Profile *Profile)
+{
+ int i;
+
+ unsigned char name_req[] = { N6110_FRAME_HEADER, 0x1a, 0x00};
+ unsigned char feat_req[] = { N6110_FRAME_HEADER, 0x13, 0x01, 0x00, 0x00};
+
+ GSM_Error error;
+
+ CurrentProfile = Profile;
+
+ /* When after sending all frames feature==253, it means, that it is not
+ supported */
+ CurrentProfile->KeypadTone=253;
+ CurrentProfile->Lights=253;
+ CurrentProfile->CallAlert=253;
+ CurrentProfile->Ringtone=253;
+ CurrentProfile->Volume=253;
+ CurrentProfile->MessageTone=253;
+ CurrentProfile->WarningTone=253;
+ CurrentProfile->Vibration=253;
+ CurrentProfile->CallerGroups=253;
+ CurrentProfile->ScreenSaver=253;
+ CurrentProfile->AutomaticAnswer=253;
+
+ name_req[4] = Profile->Number;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentProfileError, 5, 0x05, name_req);
+ if (error!=GE_NONE) return error;
+
+ for (i = 0x00; i <= 0x09; i++) {
+
+ feat_req[5] = Profile->Number;
+
+ feat_req[6] = i;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentProfileError, 7, 0x05, feat_req);
+ if (error!=GE_NONE) return error;
+ }
+
+ if (Profile->DefaultName > -1)
+ {
+ switch(GetModelFeature (FN_PROFILES)) {
+ case F_PROF33:
+ switch (Profile->DefaultName) {
+ case 0x00: sprintf(Profile->Name, "General");break;
+ case 0x01: sprintf(Profile->Name, "Silent");break;
+ case 0x02: sprintf(Profile->Name, "Descreet");break;
+ case 0x03: sprintf(Profile->Name, "Loud");break;
+ case 0x04: sprintf(Profile->Name, "My style");break;
+ case 0x05: Profile->Name[0]=0;break;
+ default : sprintf(Profile->Name, "Unknown (%i)", Profile->DefaultName);break;
+ }
+ break;
+ case F_PROF51:
+ switch (Profile->DefaultName) {
+ case 0x00: sprintf(Profile->Name, "Personal");break;
+ case 0x01: sprintf(Profile->Name, "Car");break;
+ case 0x02: sprintf(Profile->Name, "Headset");break;
+ default : sprintf(Profile->Name, "Unknown (%i)", Profile->DefaultName);break;
+ }
+ break;
+ case F_PROF61:
+ switch (Profile->DefaultName) {
+ case 0x00: sprintf(Profile->Name, "General");break;
+ case 0x01: sprintf(Profile->Name, "Silent");break;
+ case 0x02: sprintf(Profile->Name, "Meeting");break;
+ case 0x03: sprintf(Profile->Name, "Outdoor");break;
+ case 0x04: sprintf(Profile->Name, "Pager");break;
+ case 0x05: sprintf(Profile->Name, "Car");break;
+ case 0x06: sprintf(Profile->Name, "Headset");break;
+ default : sprintf(Profile->Name, "Unknown (%i)", Profile->DefaultName);break;
+ }
+ break;
+ }
+ }
+
+ return (GE_NONE);
+
+}
+
+void N6110_ReplySetProfile(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ /* Profile feature change result */
+ case 0x11:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Profile feature change result.\n"));
+#endif /* DEBUG */
+ CurrentProfileError = GE_NONE;
+ break;
+
+ /* Profile name set result */
+ case 0x1d:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Profile name change result.\n"));
+#endif /* DEBUG */
+ CurrentProfileError = GE_NONE;
+ break;
+
+ }
+}
+
+GSM_Error N6110_SetProfileFeature(u8 profile, u8 feature, u8 value)
+{
+ unsigned char feat_req[] = { N6110_FRAME_HEADER, 0x10, 0x01,
+ 0x00, 0x00, 0x00};
+
+ feat_req[5]=profile;
+ feat_req[6]=feature;
+ feat_req[7]=value;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentProfileError, 8, 0x05, feat_req);
+}
+
+GSM_Error N6110_SetProfile(GSM_Profile *Profile)
+{
+ int i,value;
+
+ unsigned char name_req[40] = { N6110_FRAME_HEADER, 0x1c, 0x01, 0x03,
+ 0x00, 0x00, 0x00};
+
+ GSM_Error error;
+
+ name_req[7] = Profile->Number;
+ name_req[8] = strlen(Profile->Name);
+ name_req[6] = name_req[8] + 2;
+
+ for (i = 0; i < name_req[8]; i++)
+ name_req[9 + i] = Profile->Name[i];
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentProfileError, name_req[8] + 9, 0x05, name_req);
+ if (error!=GE_NONE) return error;
+
+ for (i = 0x00; i <= 0x09; i++) {
+
+ switch (i) {
+ case 0x00: value = Profile->KeypadTone; break;
+ case 0x01: value = Profile->Lights; break;
+ case 0x02: value = Profile->CallAlert; break;
+ case 0x03: value = Profile->Ringtone; break;
+ case 0x04: value = Profile->Volume; break;
+ case 0x05: value = Profile->MessageTone; break;
+ case 0x06: value = Profile->Vibration; break;
+ case 0x07: value = Profile->WarningTone; break;
+ case 0x08: value = Profile->CallerGroups; break;
+ case 0x09: value = Profile->AutomaticAnswer; break;
+ default : value = 0; break;
+ }
+
+ error=N6110_SetProfileFeature(Profile->Number,i,value);
+ if (error!=GE_NONE) return error;
+ }
+
+ return (GE_NONE);
+}
+
+bool N6110_SendRLPFrame(RLP_F96Frame *frame, bool out_dtx)
+{
+ u8 req[60] = { 0x00, 0xd9 };
+
+ /* Discontinuos transmission (DTX). See section 5.6 of GSM 04.22 version
+ 7.0.1. */
+
+ if (out_dtx)
+ req[1]=0x01;
+
+ memcpy(req+2, (u8 *) frame, 32);
+
+ return (Protocol->SendFrame(32, 0xf0, req));
+}
+
+void N6110_ReplyGetCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i, j;
+
+ u8 mychar1;
+
+ wchar_t wc;
+
+ switch (MessageBuffer[4]) {
+
+ case 0x01:
+
+ CurrentCalendarNote->Type=MessageBuffer[8];
+
+ DecodeDateTime(MessageBuffer+9, &CurrentCalendarNote->Time);
+
+ DecodeDateTime(MessageBuffer+16, &CurrentCalendarNote->Alarm);
+
+ CurrentCalendarNote->Text[0]=0;
+
+ if (GetModelFeature (FN_CALENDAR)==F_CAL33) {
+ i=0;
+ if (CurrentCalendarNote->Type == GCN_REMINDER) i=1; //first char is subset
+ switch (MessageBuffer[24]) {
+ case 3:
+#ifdef DEBUG
+ fprintf(stdout,_("Subset 3 in reminder note !\n"));
+#endif
+ while (i!=MessageBuffer[23]) {
+ j=0;
+ if (i!=MessageBuffer[23]-1) {
+ if (MessageBuffer[24+i]>=0xc2) {
+ DecodeWithUTF8Alphabet(MessageBuffer[24+i], MessageBuffer[24+i+1], &mychar1);
+ CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)+1]=0;
+ CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)]=mychar1;
+ j=-1;
+ i++;
+ }
+ }
+ if (j!=-1) {
+ CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)+1]=0;
+ CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)]=MessageBuffer[24+i];
+ }
+ i++;
+ }
+ break;
+ case 2:
+#ifdef DEBUG
+ fprintf(stdout,_("Subset 2 in reminder note !\n"));
+#endif
+ while (i!=MessageBuffer[23]) {
+ wc = MessageBuffer[24+i] | (0x00 << 8);
+ CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)+1]=0;
+ CurrentCalendarNote->Text[strlen(CurrentCalendarNote->Text)]=
+ DecodeWithUnicodeAlphabet(wc);
+ i++;
+ }
+ break;
+ case 1:
+#ifdef DEBUG
+ fprintf(stdout,_("Subset 1 in reminder note !\n"));
+#endif
+ memcpy(CurrentCalendarNote->Text,MessageBuffer+24+i,MessageBuffer[23]-i);
+ CurrentCalendarNote->Text[MessageBuffer[23]-i]=0;
+ break;
+ default:
+#ifdef DEBUG
+ fprintf(stdout,_("Unknown subset in reminder note !\n"));
+#endif
+ memcpy(CurrentCalendarNote->Text,MessageBuffer+24+i,MessageBuffer[23]-i);
+ CurrentCalendarNote->Text[MessageBuffer[23]-i]=0;
+ break;
+ }
+ } else {
+ memcpy(CurrentCalendarNote->Text,MessageBuffer+24,MessageBuffer[23]);
+ CurrentCalendarNote->Text[MessageBuffer[23]]=0;
+ }
+
+ if (CurrentCalendarNote->Type == GCN_CALL) {
+ memcpy(CurrentCalendarNote->Phone,MessageBuffer+24+MessageBuffer[23]+1,MessageBuffer[24+MessageBuffer[23]]);
+ CurrentCalendarNote->Phone[MessageBuffer[24+MessageBuffer[23]]]=0;
+ }
+
+ CurrentCalendarNote->Recurrance=0;
+
+ CurrentCalendarNote->AlarmType=0;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Calendar note received.\n"));
+
+ fprintf(stdout, _(" Date: %d-%02d-%02d\n"), CurrentCalendarNote->Time.Year,
+ CurrentCalendarNote->Time.Month,
+ CurrentCalendarNote->Time.Day);
+
+ fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CurrentCalendarNote->Time.Hour,
+ CurrentCalendarNote->Time.Minute,
+ CurrentCalendarNote->Time.Second);
+
+ /* Some messages do not have alarm set up */
+ if (CurrentCalendarNote->Alarm.Year != 0) {
+ fprintf(stdout, _(" Alarm date: %d-%02d-%02d\n"), CurrentCalendarNote->Alarm.Year,
+ CurrentCalendarNote->Alarm.Month,
+ CurrentCalendarNote->Alarm.Day);
+
+ fprintf(stdout, _(" Alarm time: %02d:%02d:%02d\n"), CurrentCalendarNote->Alarm.Hour,
+ CurrentCalendarNote->Alarm.Minute,
+ CurrentCalendarNote->Alarm.Second);
+ }
+
+ fprintf(stdout, _(" Type: %d\n"), CurrentCalendarNote->Type);
+ fprintf(stdout, _(" Text: %s\n"), CurrentCalendarNote->Text);
+
+ if (CurrentCalendarNote->Type == GCN_CALL)
+ fprintf(stdout, _(" Phone: %s\n"), CurrentCalendarNote->Phone);
+#endif /* DEBUG */
+
+ CurrentCalendarNoteError=GE_NONE;
+ break;
+
+ case 0x93:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Calendar note not available\n"));
+#endif /* DEBUG */
+
+ CurrentCalendarNoteError=GE_INVALIDCALNOTELOCATION;
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Calendar note error\n"));
+#endif /* DEBUG */
+
+ CurrentCalendarNoteError=GE_INTERNALERROR;
+ break;
+
+ }
+}
+
+GSM_Error N6110_GetCalendarNote(GSM_CalendarNote *CalendarNote)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x66, 0x00
+ };
+ GSM_Error error;
+
+ req[4]=CalendarNote->Location;
+
+ CurrentCalendarNote = CalendarNote;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentCalendarNoteError, 5, 0x13, req);
+
+ CurrentCalendarNote = NULL;
+
+ return error;
+}
+
+void N6110_ReplyWriteCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ switch(MessageBuffer[4]) {
+ /* This message is also sent when the user enters the new entry on keypad */
+ case 0x01:
+ fprintf(stdout, _("Message: Calendar note write succesfull!\n"));break;
+ case 0x73:
+ fprintf(stdout, _("Message: Calendar note write failed!\n"));break;
+ case 0x7d:
+ fprintf(stdout, _("Message: Calendar note write failed!\n"));break;
+ default:
+ fprintf(stdout, _("Unknown message of type 0x13 and subtype 0x65\n"));break;
+ }
+#endif
+
+ switch(MessageBuffer[4]) {
+ case 0x01: CurrentCalendarNoteError=GE_NONE; break;
+ case 0x73: CurrentCalendarNoteError=GE_INTERNALERROR; break;
+ case 0x7d: CurrentCalendarNoteError=GE_INTERNALERROR; break;
+ default : AppendLogText("Unknown msg\n",false); break;
+ }
+}
+
+GSM_Error N6110_WriteCalendarNote(GSM_CalendarNote *CalendarNote)
+{
+
+ unsigned char req[200] = { N6110_FRAME_HEADER,
+ 0x64, 0x01, 0x10,
+ 0x00, /* Length of the rest of the frame. */
+ 0x00, /* The type of calendar note */
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+ };
+
+ typedef struct {
+ char *model;
+ unsigned char call;
+ unsigned char meeting;
+ unsigned char birthday;
+ unsigned char reminder;
+ } calendar_model_length;
+
+ /* Length of entries */
+ calendar_model_length calendar_lengths[] =
+ {
+ /*model,CallTo,Meeting,Birthday,Reminder*/
+ {"NHM-5",0x24,0x24,0x24,0x24}, //Reminder from phone, other quesses
+ {"NHM-6",0x24,0x24,0x24,0x24}, //Reminder from phone, other quesses
+ {"NSE-3",0x1e,0x14,0x14,0x1e}, //from NCDS3 [HKEY_LOCAL_MACHINE\Software\Nokia\Data Suite\3.0\Calendar]
+ {"NSM-1",0x1e,0x18,0x18,0x24}, //from NCDS3
+ {"NSK-3",0x1e,0x14,0x14,0x1e}, //from NCDS3
+ {"NSB-3",0x20,0x14,0x14,0x1e}, //from NCDS3
+ {"", 0, 0, 0, 0 } //end of table
+ };
+
+ int i, j, current;
+
+ u8 mychar;
+
+ u8 mychar1,mychar2;
+
+ GSM_Error error;
+
+ /* Hopefully is 64 larger as FB38_MAX* / N6110_MAX* */
+ char model[64];
+
+ req[7]=CalendarNote->Type;
+
+ EncodeDateTime(req+8, &CalendarNote->Time);
+ req[14] = CalendarNote->Time.Timezone;
+
+ if (CalendarNote->Alarm.Year) {
+ EncodeDateTime(req+15, &CalendarNote->Alarm);
+ req[21] = CalendarNote->Alarm.Timezone;
+ }
+
+ req[22]=strlen(CalendarNote->Text);
+
+ current=23;
+
+ if (GetModelFeature (FN_CALENDAR)==F_CAL33 && CalendarNote->Type==GCN_REMINDER) {
+ req[22]++; // one additional char
+ req[current++]=0x01; //we use now subset 1
+ }
+
+ for (i=0; i<strlen(CalendarNote->Text); i++) {
+ j=0;
+ mychar=CalendarNote->Text[i];
+ if (GetModelFeature (FN_CALENDAR)==F_CAL33 && CalendarNote->Type==GCN_REMINDER) {
+ if (EncodeWithUTF8Alphabet(mychar,&mychar1,&mychar2)) {
+ req[current++]=mychar1;
+ req[current++]=mychar2;
+ req[23]=0x03; //use subset 3
+ req[22]++; // one additional char
+ j=-1;
+ }
+ }
+ if (j!=-1) {
+ /* Enables/disables blinking */
+ if (mychar=='~') req[current++]=0x01;
+ else req[current++]=mychar;
+ }
+ }
+
+ req[current++]=strlen(CalendarNote->Phone);
+
+ for (i=0; i<strlen(CalendarNote->Phone); i++)
+ req[current++]=CalendarNote->Phone[i];
+
+ while (N6110_GetModel(model) != GE_NONE)
+ sleep(1);
+
+ /* Checking maximal length */
+ i=0;
+ while (strcmp(calendar_lengths[i].model,"")) {
+ if (!strcmp(calendar_lengths[i].model,model)) {
+ switch (CalendarNote->Type) {
+ case GCN_REMINDER:if (req[22]>calendar_lengths[i].reminder) return GE_TOOLONG;break;
+ case GCN_MEETING :if (req[22]>calendar_lengths[i].meeting) return GE_TOOLONG;break;
+ case GCN_BIRTHDAY:if (req[22]>calendar_lengths[i].birthday) return GE_TOOLONG;break;
+ case GCN_CALL :if (strlen(CalendarNote->Phone)>calendar_lengths[i].call) return GE_TOOLONG;break;
+ }
+ break;
+ }
+ i++;
+ }
+
+ CurrentCalendarNote = CalendarNote;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentCalendarNoteError, current, 0x13, req);
+
+ CurrentCalendarNote = NULL;
+
+ return error;
+}
+
+void N6110_ReplyDeleteCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ switch (MessageBuffer[4]) {
+ /* This message is also sent when the user deletes an old entry on
+ keypad or moves an old entry somewhere (there is also `write'
+ message). */
+ case 0x01:fprintf(stdout, _("Message: Calendar note deleted\n"));break;
+ case 0x93:fprintf(stdout, _("Message: Calendar note can't be deleted\n"));break;
+ default :fprintf(stdout, _("Message: Calendar note deleting error\n"));break;
+ }
+#endif
+
+ switch (MessageBuffer[4]) {
+ case 0x01:CurrentCalendarNoteError=GE_NONE;break;
+ case 0x93:CurrentCalendarNoteError=GE_INVALIDCALNOTELOCATION;break;
+ default :CurrentCalendarNoteError=GE_INTERNALERROR;break;
+ }
+}
+
+GSM_Error N6110_DeleteCalendarNote(GSM_CalendarNote *CalendarNote)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x68, 0x00
+ };
+
+ req[4]=CalendarNote->Location;
+
+ return NULL_SendMessageSequence (20, &CurrentCalendarNoteError, 5, 0x13, req);
+}
+
+void N6110_ReplyRFBatteryLevel(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phone status received:\n"));
+ fprintf(stdout, _(" Mode: "));
+
+ switch (MessageBuffer[4]) {
+
+ case 0x01:
+
+ fprintf(stdout, _("registered within the network\n"));
+ break;
+
+ /* I was really amazing why is there a hole in the type of 0x02, now I
+ know... */
+ case 0x02: fprintf(stdout, _("call in progress\n")); break; /* ringing or already answered call */
+ case 0x03: fprintf(stdout, _("waiting for security code\n")); break;
+ case 0x04: fprintf(stdout, _("powered off\n")); break;
+ default : fprintf(stdout, _("unknown\n"));
+
+ }
+
+ fprintf(stdout, _(" Power source: "));
+
+ switch (MessageBuffer[7]) {
+
+ case 0x01: fprintf(stdout, _("AC/DC\n")); break;
+ case 0x02: fprintf(stdout, _("battery\n")); break;
+ default : fprintf(stdout, _("unknown\n"));
+
+ }
+
+ fprintf(stdout, _(" Battery Level: %d\n"), MessageBuffer[8]);
+ fprintf(stdout, _(" Signal strength: %d\n"), MessageBuffer[5]);
+#endif /* DEBUG */
+
+ CurrentRFLevel=MessageBuffer[5];
+ CurrentBatteryLevel=MessageBuffer[8];
+ CurrentPowerSource=MessageBuffer[7];
+}
+
+
+GSM_Error N6110_GetRFLevel(GSM_RFUnits *units, float *level)
+{
+
+ /* FIXME - these values are from 3810 code, may be incorrect. Map from
+ values returned in status packet to the the values returned by the AT+CSQ
+ command. */
+ float csq_map[5] = {0, 8, 16, 24, 31};
+
+ int timeout=10;
+ int rf_level;
+
+ char screen[NM_MAX_SCREEN_WIDTH];
+
+ CurrentRFLevel=-1;
+
+ if (GetModelFeature (FN_NOPOWERFRAME)==F_NOPOWER) {
+
+ if (N6110_NetMonitor(1, screen)!=GE_NONE)
+ return GE_INTERNALERROR;
+
+ rf_level=4;
+
+ if (screen[4]!='-') {
+ if (screen[5]=='9' && screen[6]>'4') rf_level=1;
+ if (screen[5]=='9' && screen[6]<'5') rf_level=2;
+ if (screen[5]=='8' && screen[6]>'4') rf_level=3;
+ } else rf_level=0;
+
+ /* Arbitrary units. */
+ if (*units == GRF_Arbitrary) {
+ *level = rf_level;
+ return (GE_NONE);
+ }
+
+ } else {
+ N6110_SendStatusRequest();
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentRFLevel == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ /* Make copy in case it changes. */
+ rf_level = CurrentRFLevel;
+
+ if (rf_level == -1)
+ return (GE_NOLINK);
+
+ /* Now convert between the different units we support. */
+
+ /* Arbitrary units. */
+ if (*units == GRF_Arbitrary) {
+ *level = rf_level;
+ return (GE_NONE);
+ }
+
+ /* CSQ units. */
+ if (*units == GRF_CSQ) {
+
+ if (rf_level <=4)
+ *level = csq_map[rf_level];
+ else
+ *level = 99; /* Unknown/undefined */
+
+ return (GE_NONE);
+ }
+ }
+
+ /* Unit type is one we don't handle so return error */
+ return (GE_INTERNALERROR);
+}
+
+
+GSM_Error N6110_GetBatteryLevel(GSM_BatteryUnits *units, float *level)
+{
+ int timeout=10;
+ int batt_level;
+
+ char screen[NM_MAX_SCREEN_WIDTH];
+
+ CurrentBatteryLevel=-1;
+
+ if (GetModelFeature (FN_NOPOWERFRAME)==F_NOPOWER) {
+
+ if (N6110_NetMonitor(23, screen)!=GE_NONE)
+ return GE_NOLINK;
+
+ batt_level=4;
+
+ if (screen[29]=='7') batt_level=3;
+ if (screen[29]=='5') batt_level=2;
+ if (screen[29]=='2') batt_level=1;
+
+ /* Only units we handle at present are GBU_Arbitrary */
+ if (*units == GBU_Arbitrary) {
+ *level = batt_level;
+ return (GE_NONE);
+ }
+
+ return (GE_INTERNALERROR);
+
+ } else {
+ N6110_SendStatusRequest();
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentBatteryLevel == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ /* Take copy in case it changes. */
+ batt_level = CurrentBatteryLevel;
+
+ if (batt_level != -1) {
+
+ /* Only units we handle at present are GBU_Arbitrary */
+ if (*units == GBU_Arbitrary) {
+ *level = batt_level;
+ return (GE_NONE);
+ }
+
+ return (GE_INTERNALERROR);
+ }
+ else
+ return (GE_NOLINK);
+ }
+}
+
+GSM_Error N6110_GetPowerSource(GSM_PowerSource *source)
+{
+
+ int timeout=10;
+
+ char screen[NM_MAX_SCREEN_WIDTH];
+
+ CurrentPowerSource=-1;
+
+ if (GetModelFeature (FN_NOPOWERFRAME)==F_NOPOWER) {
+
+ if (N6110_NetMonitor(20, screen)!=GE_NONE)
+ return GE_NOLINK;
+
+ CurrentPowerSource=GPS_ACDC;
+
+ if (screen[6]=='x') CurrentPowerSource=GPS_BATTERY;
+
+ *source=CurrentPowerSource;
+
+ return GE_NONE;
+ } else {
+ N6110_SendStatusRequest();
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentPowerSource == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ if (CurrentPowerSource != -1) {
+ *source=CurrentPowerSource;
+ return (GE_NONE);
+ }
+ else
+ return (GE_NOLINK);
+ }
+}
+
+void N6110_ReplyGetDisplayStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i;
+
+ for (i=0; i<MessageBuffer[4];i++)
+ if (MessageBuffer[2*i+6]==2)
+ CurrentDisplayStatus|=1<<(MessageBuffer[2*i+5]-1);
+ else
+ CurrentDisplayStatus&= (0xff - (1<<(MessageBuffer[2*i+5]-1)));
+
+#ifdef DEBUG
+ fprintf(stdout, _("Call in progress: %s\n"), CurrentDisplayStatus & (1<<DS_Call_In_Progress)?"on":"off");
+ fprintf(stdout, _("Unknown: %s\n"), CurrentDisplayStatus & (1<<DS_Unknown)?"on":"off");
+ fprintf(stdout, _("Unread SMS: %s\n"), CurrentDisplayStatus & (1<<DS_Unread_SMS)?"on":"off");
+ fprintf(stdout, _("Voice call: %s\n"), CurrentDisplayStatus & (1<<DS_Voice_Call)?"on":"off");
+ fprintf(stdout, _("Fax call active: %s\n"), CurrentDisplayStatus & (1<<DS_Fax_Call)?"on":"off");
+ fprintf(stdout, _("Data call active: %s\n"), CurrentDisplayStatus & (1<<DS_Data_Call)?"on":"off");
+ fprintf(stdout, _("Keyboard lock: %s\n"), CurrentDisplayStatus & (1<<DS_Keyboard_Lock)?"on":"off");
+ fprintf(stdout, _("SMS storage full: %s\n"), CurrentDisplayStatus & (1<<DS_SMS_Storage_Full)?"on":"off");
+#endif /* DEBUG */
+
+ CurrentDisplayStatusError=GE_NONE;
+}
+
+GSM_Error N6110_GetDisplayStatus(int *Status) {
+
+ unsigned char req[4]={ N6110_FRAME_HEADER, 0x51 };
+
+ GSM_Error error;
+
+ error=NULL_SendMessageSequence
+ (10, &CurrentDisplayStatusError, 4, 0x0d, req);
+ if (error!=GE_NONE) return error;
+
+ *Status=CurrentDisplayStatus;
+
+ return GE_NONE;
+}
+
+GSM_Error N6110_DialVoice(char *Number) {
+/* This commented sequence doesn't work on N3210/3310/6210/7110 */
+// unsigned char req[64]={N6110_FRAME_HEADER, 0x01};
+// unsigned char req_end[]={0x05, 0x01, 0x01, 0x05, 0x81, 0x01, 0x00, 0x00, 0x01};
+// int i=0;
+// req[4]=strlen(Number);
+// for(i=0; i < strlen(Number) ; i++)
+// req[5+i]=Number[i];
+// memcpy(req+5+strlen(Number), req_end, 10);
+// return NULL_SendMessageSequence
+// (20, &CurrentDialVoiceError, 13+strlen(Number), 0x01, req);
+
+ unsigned char req[64]={0x00,0x01,0x7c,
+ 0x01}; //call command
+
+ int i=0;
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ for(i=0; i < strlen(Number) ; i++) req[4+i]=Number[i];
+
+ req[4+i+1]=0;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentDialVoiceError, 4+strlen(Number)+1, 0x40, req);
+}
+
+/* Dial a data call - type specifies request to use:
+ type 0 should normally be used
+ type 1 should be used when calling a digital line - corresponds to ats35=0
+ Maybe one day we'll know what they mean!
+*/
+GSM_Error N6110_DialData(char *Number, char type, void (* callpassup)(char c))
+{
+ unsigned char req[100] = { N6110_FRAME_HEADER, 0x01 };
+ unsigned char *req_end;
+ unsigned char req_end0[] = { 0x01, /* make a data call = type 0x01 */
+ 0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
+ 0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00 };
+ unsigned char req_end1[] = { 0x01,
+ 0x02,0x01,0x05,0x81,0x01,0x00,0x00,0x01,0x02,0x0a,
+ 0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
+ 0x88,0x90,0x21,0x48,0x40,0xbb };
+ unsigned char req2[] = { N6110_FRAME_HEADER, 0x42,0x05,0x01,
+ 0x07,0xa2,0xc8,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80,0x01,0x60 };
+ unsigned char req3[] = { N6110_FRAME_HEADER, 0x42,0x05,0x01,
+ 0x07,0xa2,0x88,0x81,0x21,0x15,0x63,0xa8,0x00,0x00,
+ 0x07,0xa3,0xb8,0x81,0x20,0x15,0x63,0x80 };
+ unsigned char req4[] = { N6110_FRAME_HEADER, 0x42,0x05,0x81,
+ 0x07,0xa1,0x88,0x89,0x21,0x15,0x63,0xa0,0x00,0x06,
+ 0x88,0x90,0x21,0x48,0x40,0xbb,0x07,0xa3,0xb8,0x81,
+ 0x20,0x15,0x63,0x80 };
+
+ int i = 0;
+ u8 size;
+
+ CurrentCallPassup=callpassup;
+
+ switch (type) {
+ case 0:
+ req_end = req_end0;
+ size = sizeof(req_end0);
+ break;
+ case 1:
+ Protocol->SendMessage(sizeof(req3), 0x01, req3);
+ usleep(1000000);
+ Protocol->SendMessage(sizeof(req4), 0x01, req4);
+ usleep(1000000);
+ req_end = req_end1;
+ size = sizeof(req_end1);
+ break;
+ case -1: /* Just used to set the call passup */
+ return GE_NONE;
+ break;
+ default:
+ req_end = req_end0;
+ size = sizeof(req_end0);
+ break;
+ }
+
+ req[4] = strlen(Number);
+
+ for(i = 0; i < strlen(Number) ; i++)
+ req[5+i] = Number[i];
+
+ memcpy(req + 5 + strlen(Number), req_end, size);
+
+ Protocol->SendMessage(5 + size + strlen(Number), 0x01, req);
+ usleep(1000000);
+
+ if (type != 1) {
+ Protocol->SendMessage(26, 0x01, req2);
+ usleep(1000000);
+ }
+
+ return (GE_NONE);
+}
+
+GSM_Error N6110_GetIncomingCallNr(char *Number)
+{
+
+ if (*CurrentIncomingCall != ' ') {
+ strcpy(Number, CurrentIncomingCall);
+ return GE_NONE;
+ }
+ else
+ return GE_BUSY;
+}
+
+GSM_Error N6110_CancelCall(void)
+{
+// This frame & method works only on 61xx/51xx
+// unsigned char req[] = { N6110_FRAME_HEADER, 0x08, 0x00, 0x85};
+// req[4]=CurrentCallSequenceNumber;
+// Protocol->SendMessage(6, 0x01, req);
+// return GE_NONE;
+
+ GSM_Error error;
+
+ unsigned char req[]={0x00,0x01,0x7c,0x03};
+
+ /* Checking */
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ return NULL_SendMessageSequence (20, &CurrentDialVoiceError, 4, 0x40, req);
+}
+
+void N6110_ReplyEnterSecurityCode(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch(MessageBuffer[3]) {
+
+ case 0x0b:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Security code accepted.\n"));
+#endif /* DEBUG */
+ CurrentSecurityCodeError = GE_NONE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Security code is wrong. You're not my big owner :-)\n"));
+#endif /* DEBUG */
+ CurrentSecurityCodeError = GE_INVALIDSECURITYCODE;
+ }
+}
+
+GSM_Error N6110_EnterSecurityCode(GSM_SecurityCode SecurityCode)
+{
+
+ unsigned char req[15] = { N6110_FRAME_HEADER,
+ 0x0a, /* Enter code request. */
+ 0x00 /* Type of the entered code. */
+ };
+ int i=0;
+
+ req[4]=SecurityCode.Type;
+
+ for (i=0; i<strlen(SecurityCode.Code);i++)
+ req[5+i]=SecurityCode.Code[i];
+
+ req[5+strlen(SecurityCode.Code)]=0x00;
+ req[6+strlen(SecurityCode.Code)]=0x00;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSecurityCodeError, 7+strlen(SecurityCode.Code), 0x08, req);
+}
+
+void N6110_ReplyGetSecurityCodeStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ *CurrentSecurityCodeStatus = MessageBuffer[4];
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Security Code status received: "));
+
+ switch(*CurrentSecurityCodeStatus) {
+
+ case GSCT_SecurityCode: fprintf(stdout, _("waiting for Security Code.\n")); break;
+ case GSCT_Pin : fprintf(stdout, _("waiting for PIN.\n")); break;
+ case GSCT_Pin2 : fprintf(stdout, _("waiting for PIN2.\n")); break;
+ case GSCT_Puk : fprintf(stdout, _("waiting for PUK.\n")); break;
+ case GSCT_Puk2 : fprintf(stdout, _("waiting for PUK2.\n")); break;
+ case GSCT_None : fprintf(stdout, _("nothing to enter.\n")); break;
+ default : fprintf(stdout, _("Unknown!\n"));
+ }
+
+#endif /* DEBUG */
+
+ CurrentSecurityCodeError = GE_NONE;
+}
+
+GSM_Error N6110_GetSecurityCodeStatus(int *Status)
+{
+
+ unsigned char req[4] = { N6110_FRAME_HEADER,
+ 0x07
+ };
+
+ CurrentSecurityCodeStatus=Status;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSecurityCodeError, 4, 0x08, req);
+}
+
+void N6110_ReplyGetSecurityCode(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Security code received: "));
+ switch (MessageBuffer[3]) {
+ case GSCT_SecurityCode: fprintf(stdout, _("Security code"));break;
+ case GSCT_Pin: fprintf(stdout, _("PIN"));break;
+ case GSCT_Pin2: fprintf(stdout, _("PIN2"));break;
+ case GSCT_Puk: fprintf(stdout, _("PUK"));break;
+ case GSCT_Puk2: fprintf(stdout, _("PUK2"));break;
+ default: fprintf(stdout, _("unknown !"));break;
+ }
+ if (MessageBuffer[4]==1) {
+ fprintf(stdout, _(" allowed, value \""));
+ if (MessageBuffer[3]==GSCT_SecurityCode) {
+ for (i=0;i<5;i++) {fprintf(stdout, _("%c"), MessageBuffer[5+i]);}
+ }
+ if (MessageBuffer[3]==GSCT_Pin || MessageBuffer[3]==GSCT_Pin2 ||
+ MessageBuffer[3]==GSCT_Puk || MessageBuffer[3]==GSCT_Puk2) {
+ for (i=0;i<4;i++) {fprintf(stdout, _("%c"), MessageBuffer[5+i]);}
+ }
+ fprintf(stdout, _("\""));
+ } else {
+ fprintf(stdout, _(" not allowed"));
+ }
+ fprintf(stdout, _("\n"));
+#endif /* DEBUG */
+
+ if (CurrentSecurityCode->Type==MessageBuffer[3] /* We wanted this code */
+ && MessageBuffer[4]==1) { /* It's allowed */
+ if (MessageBuffer[3]==GSCT_SecurityCode) {
+ for (i=0;i<5;i++) {CurrentSecurityCode->Code[i]=MessageBuffer[5+i];}
+ CurrentSecurityCode->Code[5]=0;
+ }
+ if (MessageBuffer[3]==GSCT_Pin || MessageBuffer[3]==GSCT_Pin2 ||
+ MessageBuffer[3]==GSCT_Puk || MessageBuffer[3]==GSCT_Puk2) {
+ for (i=0;i<4;i++) {CurrentSecurityCode->Code[i]=MessageBuffer[5+i];}
+ CurrentSecurityCode->Code[4]=0;
+ }
+ CurrentSecurityCodeError=GE_NONE;
+ } else
+ CurrentSecurityCodeError=GE_INVALIDSECURITYCODE;
+}
+
+GSM_Error N6110_GetSecurityCode(GSM_SecurityCode *SecurityCode)
+{
+
+ unsigned char req[4] = { 0x00,
+ 0x01,0x6e, /* Get code request. */
+ 0x00 }; /* Type of the requested code. */
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ req[3]=SecurityCode->Type;
+
+ CurrentSecurityCode=SecurityCode;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSecurityCodeError, 4, 0x40, req);
+}
+
+void N6110_ReplyPlayTone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: answer for PlayTone frame\n"));
+#endif
+
+ CurrentPlayToneError=GE_NONE;
+}
+
+GSM_Error N6110_PlayTone(int Herz, u8 Volume)
+{
+ unsigned char req[6] = { 0x00,0x01,0x8f,
+ 0x00, /* Volume */
+ 0x00, /* HerzLo */
+ 0x00 }; /* HerzHi */
+
+ GSM_Error error;
+
+ /* PlayTone wasn't used earlier */
+ if (CurrentPlayToneError==GE_UNKNOWN) {
+ if (CurrentConnectionType!=GCT_MBUS)
+ CurrentDisableKeepAlive=true;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+ }
+
+ /* For Herz==255*255 we have silent */
+ if (Herz!=255*255) {
+ req[3]=Volume;
+
+ req[5]=Herz%256;
+ req[4]=Herz/256;
+ } else {
+ req[3]=0;
+
+ req[5]=0;
+ req[4]=0;
+ }
+
+#ifdef WIN32
+ /* For Herz==255*255 we have silent and additionaly
+ we wait for phone answer - it's important for MBUS */
+ if (Herz==255*255) {
+ error=NULL_SendMessageSequence
+ (20, &CurrentPlayToneError, 6, 0x40, req);
+
+ CurrentPlayToneError=GE_UNKNOWN;
+ CurrentDisableKeepAlive=false;
+
+ if (error!=GE_NONE) return error;
+ } else {
+ Protocol->SendMessage(6,0x40,req);
+ }
+#else
+ error=NULL_SendMessageSequence
+ (20, &CurrentPlayToneError, 6, 0x40, req);
+
+ /* For Herz==255*255 we wait for phone answer - it's important for MBUS */
+ if (Herz==255*255) {
+ CurrentPlayToneError=GE_UNKNOWN;
+ CurrentDisableKeepAlive=false;
+ }
+
+ if (error!=GE_NONE) return error;
+
+#endif
+
+ return(GE_NONE);
+}
+
+void N6110_ReplyGetDateTime(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ if (MessageBuffer[4]==0x01) {
+ DecodeDateTime(MessageBuffer+8, CurrentDateTime);
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Date and time\n"));
+ fprintf(stdout, _(" Time: %02d:%02d:%02d\n"), CurrentDateTime->Hour, CurrentDateTime->Minute, CurrentDateTime->Second);
+ fprintf(stdout, _(" Date: %4d/%02d/%02d\n"), CurrentDateTime->Year, CurrentDateTime->Month, CurrentDateTime->Day);
+#endif /* DEBUG */
+
+ CurrentDateTime->IsSet=true;
+ } else {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Date and time not set in phone\n"));
+#endif
+
+ CurrentDateTime->IsSet=false;
+ }
+
+ CurrentDateTimeError=GE_NONE;
+}
+
+GSM_Error N6110_GetDateTime(GSM_DateTime *date_time)
+{
+ return N6110_PrivGetDateTime(date_time,0x11);
+}
+
+GSM_Error N6110_PrivGetDateTime(GSM_DateTime *date_time, int msgtype)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x62};
+
+ CurrentDateTime=date_time;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentDateTimeError, 4, msgtype, req);
+}
+
+void N6110_ReplyGetAlarm(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Alarm\n"));
+ fprintf(stdout, _(" Alarm: %02d:%02d\n"), MessageBuffer[9], MessageBuffer[10]);
+ fprintf(stdout, _(" Alarm is %s\n"), (MessageBuffer[8]==2) ? _("on"):_("off"));
+#endif /* DEBUG */
+
+ CurrentAlarm->Hour=MessageBuffer[9];
+ CurrentAlarm->Minute=MessageBuffer[10];
+ CurrentAlarm->Second=0;
+
+ CurrentAlarm->IsSet=(MessageBuffer[8]==2);
+
+ CurrentAlarmError=GE_NONE;
+}
+
+GSM_Error N6110_GetAlarm(int alarm_number, GSM_DateTime *date_time)
+{
+ return N6110_PrivGetAlarm(alarm_number,date_time,0x11);
+}
+
+GSM_Error N6110_PrivGetAlarm(int alarm_number, GSM_DateTime *date_time, int msgtype)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x6d};
+
+ CurrentAlarm=date_time;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentAlarmError, 4, msgtype, req);
+}
+
+void N6110_ReplyGetSMSCenter(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x34:
+
+ CurrentMessageCenter->No=MessageBuffer[4];
+ CurrentMessageCenter->Format=MessageBuffer[6];
+ CurrentMessageCenter->Validity=MessageBuffer[8];
+ sprintf(CurrentMessageCenter->Name, "%s", MessageBuffer+33);
+
+ sprintf(CurrentMessageCenter->DefaultRecipient, "%s", GSM_UnpackSemiOctetNumber(MessageBuffer+9,false));
+
+ sprintf(CurrentMessageCenter->Number, "%s", GSM_UnpackSemiOctetNumber(MessageBuffer+21,false));
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Center received:\n"));
+ fprintf(stdout, _(" %d. SMS Center name is %s\n"), CurrentMessageCenter->No, CurrentMessageCenter->Name);
+ fprintf(stdout, _(" SMS Center number is %s\n"), CurrentMessageCenter->Number);
+ fprintf(stdout, _(" Default recipient number is %s\n"), CurrentMessageCenter->DefaultRecipient);
+
+ fprintf(stdout, _(" SMS Center message format is "));
+
+ switch (CurrentMessageCenter->Format) {
+
+ case GSMF_Text : fprintf(stdout, _("Text")); break;
+ case GSMF_Paging: fprintf(stdout, _("Paging")); break;
+ case GSMF_Fax : fprintf(stdout, _("Fax")); break;
+ case GSMF_Email : fprintf(stdout, _("Email")); break;
+ default : fprintf(stdout, _("Unknown"));
+ }
+
+ fprintf(stdout, "\n");
+
+ fprintf(stdout, _(" SMS Center message validity is "));
+
+ switch (CurrentMessageCenter->Validity) {
+
+ case GSMV_1_Hour : fprintf(stdout, _("1 hour")); break;
+ case GSMV_6_Hours : fprintf(stdout, _("6 hours")); break;
+ case GSMV_24_Hours: fprintf(stdout, _("24 hours")); break;
+ case GSMV_72_Hours: fprintf(stdout, _("72 hours")); break;
+ case GSMV_1_Week : fprintf(stdout, _("1 week")); break;
+ case GSMV_Max_Time: fprintf(stdout, _("Maximum time"));break;
+ default : fprintf(stdout, _("Unknown"));
+ }
+
+ fprintf(stdout, "\n");
+
+#endif /* DEBUG */
+
+ CurrentMessageCenterError=GE_NONE;
+
+ break;
+
+ case 0x35:
+
+ /* Number of entries depends on SIM card */
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Center error received:\n"));
+ fprintf(stdout, _(" The request for SMS Center failed.\n"));
+#endif /* DEBUG */
+
+ /* FIXME: appropriate error. */
+ CurrentMessageCenterError=GE_INTERNALERROR;
+
+ break;
+
+ }
+}
+
+/* This function sends to the mobile phone a request for the SMS Center */
+GSM_Error N6110_GetSMSCenter(GSM_MessageCenter *MessageCenter)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x33, 0x64,
+ 0x00 /* SMS Center Number. */
+ };
+
+ req[5]=MessageCenter->No;
+
+ CurrentMessageCenter=MessageCenter;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMessageCenterError, 6, 0x02, req);
+}
+
+void N6110_ReplySetSMSCenter(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Center correctly set.\n"));
+#endif
+ CurrentMessageCenterError=GE_NONE;
+}
+
+/* This function set the SMS Center profile on the phone. */
+GSM_Error N6110_SetSMSCenter(GSM_MessageCenter *MessageCenter)
+{
+ unsigned char req[64] = { N6110_FRAME_HEADER, 0x30, 0x64,
+ 0x00, /* SMS Center Number. */
+ 0x00, /* Unknown. */
+ 0x00, /* SMS Message Format. */
+ 0x00, /* Unknown. */
+ 0x00, /* Validity. */
+ 0,0,0,0,0,0,0,0,0,0,0,0, /* Default recipient number */
+ 0,0,0,0,0,0,0,0,0,0,0,0 /* Message Center Number. */
+ /* Message Center Name. */
+ };
+
+ req[5]=MessageCenter->No;
+ req[7]=MessageCenter->Format;
+ req[9]=MessageCenter->Validity;
+
+ req[10]=GSM_PackSemiOctetNumber(MessageCenter->DefaultRecipient, req+11, false);
+
+ req[22]=GSM_PackSemiOctetNumber(MessageCenter->Number, req+23, false);
+
+ sprintf(req+34, "%s", MessageCenter->Name);
+
+ CurrentMessageCenter=MessageCenter;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMessageCenterError, 35+strlen(MessageCenter->Name), 0x02, req);
+}
+
+void N6110_ReplyGetSMSStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x37:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Status Received\n"));
+ fprintf(stdout, _(" The number of messages: %d\n"), MessageBuffer[10]);
+ fprintf(stdout, _(" Unread messages: %d\n"), MessageBuffer[11]);
+#endif /* DEBUG */
+
+ CurrentSMSStatus->UnRead = MessageBuffer[11];
+ CurrentSMSStatus->Number = MessageBuffer[10];
+
+ CurrentSMSStatusError = GE_NONE;
+ break;
+
+ case 0x38:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Status error, probably not authorized by PIN\n"));
+#endif /* DEBUG */
+
+ CurrentSMSStatusError = GE_INTERNALERROR;
+ break;
+
+ }
+}
+
+GSM_Error N6110_GetSMSStatus(GSM_SMSStatus *Status)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x36, 0x64};
+
+ CurrentSMSStatus = Status;
+
+ return NULL_SendMessageSequence
+ (10, &CurrentSMSStatusError, 5, 0x14, req);
+}
+
+GSM_Error N6110_GetSMSFolders ( GSM_SMSFolders *folders)
+{
+ folders->number=2;
+
+ strcpy(folders->Folder[0].Name,"Inbox");
+ strcpy(folders->Folder[1].Name,"Outbox");
+
+ return GE_NONE;
+}
+
+GSM_Error N6110_GetIMEI(char *imei)
+{
+ if (strlen(Current_IMEI)>0) {
+ strncpy (imei, Current_IMEI, GSM_MAX_IMEI_LENGTH);
+ return (GE_NONE);
+ }
+ else
+ return (GE_TRYAGAIN);
+}
+
+GSM_Error N6110_GetRevision(char *revision)
+{
+
+ if (strlen(Current_Revision)>0) {
+ strncpy (revision, Current_Revision, GSM_MAX_REVISION_LENGTH);
+ return (GE_NONE);
+ }
+ else
+ return (GE_TRYAGAIN);
+}
+
+GSM_Error N6110_GetModel(char *model)
+{
+ if (strlen(Current_Model)>0) {
+ strncpy (model, Current_Model, GSM_MAX_MODEL_LENGTH);
+ return (GE_NONE);
+ }
+ else
+ return (GE_TRYAGAIN);
+}
+
+void N6110_ReplySetDateTime(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[4]) {
+
+ case 0x01:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Date and time set correctly\n"));
+#endif /* DEBUG */
+ CurrentSetDateTimeError=GE_NONE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Date and time setting error\n"));
+#endif /* DEBUG */
+ CurrentSetDateTimeError=GE_INVALIDDATETIME;
+
+ }
+}
+
+/* Needs SIM card with PIN in phone */
+GSM_Error N6110_SetDateTime(GSM_DateTime *date_time)
+{
+ return N6110_PrivSetDateTime(date_time,0x11);
+}
+
+/* Needs SIM card with PIN in phone */
+GSM_Error N6110_PrivSetDateTime(GSM_DateTime *date_time, int msgtype)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x60, /* set-time subtype */
+ 0x01, 0x01, 0x07, /* unknown */
+ 0x00, 0x00, /* Year (0x07cf = 1999) */
+ 0x00, 0x00, /* Month Day */
+ 0x00, 0x00, /* Hours Minutes */
+ 0x00 /* Unknown, but not seconds - try 59 and wait 1 sec. */
+ };
+
+ EncodeDateTime(req+7, date_time);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSetDateTimeError, 14, msgtype, req);
+}
+
+void N6110_ReplySetAlarm(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[4]) {
+
+ case 0x01:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Alarm set correctly\n"));
+#endif /* DEBUG */
+ CurrentSetAlarmError=GE_NONE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Alarm setting error\n"));
+#endif /* DEBUG */
+ CurrentSetAlarmError=GE_INVALIDDATETIME;
+
+ }
+}
+
+/* FIXME: we should also allow to set the alarm off :-) */
+GSM_Error N6110_SetAlarm(int alarm_number, GSM_DateTime *date_time)
+{
+ return N6110_PrivSetAlarm(alarm_number,date_time, 0x11);
+}
+
+/* FIXME: we should also allow to set the alarm off :-) */
+GSM_Error N6110_PrivSetAlarm(int alarm_number, GSM_DateTime *date_time, int msgtype)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x6b, /* set-alarm subtype */
+ 0x01, 0x20, 0x03, /* unknown */
+ 0x02, /* should be alarm on/off, but it don't works */
+ 0x00, 0x00, /* Hours Minutes */
+ 0x00 /* Unknown, but not seconds - try 59 and wait 1 sec. */
+ };
+
+ req[8] = date_time->Hour;
+ req[9] = date_time->Minute;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSetAlarmError, 11, msgtype, req);
+}
+
+void N6110_ReplyGetMemoryLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ /* Hopefully is 64 larger as FB38_MAX* / N6110_MAX* */
+ char model[64];
+
+ int i, tmp, count;
+
+ switch (MessageBuffer[3]) {
+
+ case 0x02:
+
+ CurrentPhonebookEntry->Empty = true;
+
+ count=MessageBuffer[5];
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook entry received:\n"));
+ fprintf(stdout, _(" Name: "));
+
+ for (tmp=0; tmp <count; tmp++)
+ {
+ if (MessageBuffer[6+tmp]==1) fprintf(stdout, "%c", '~'); else //enables/disables blinking
+ if (MessageBuffer[6+tmp]==0) fprintf(stdout, "%c", '`'); else //hides rest ot contents
+ fprintf(stdout, "%c", MessageBuffer[6+tmp]);
+ }
+
+ fprintf(stdout, "\n");
+#endif /* DEBUG */
+
+ while (N6110_GetModel(model) != GE_NONE)
+ sleep(1);
+
+ if (GetModelFeature (FN_PHONEBOOK)==F_PBK33SIM ||
+ GetModelFeature (FN_PHONEBOOK)==F_PBK33INT) {//pbk with Unicode
+ DecodeUnicode (CurrentPhonebookEntry->Name, MessageBuffer+6, count/2);
+ CurrentPhonebookEntry->Name[count/2] = 0x00;
+ } else {
+ memcpy(CurrentPhonebookEntry->Name, MessageBuffer + 6, count);
+ CurrentPhonebookEntry->Name[count] = 0x00;
+ }
+
+ CurrentPhonebookEntry->Empty = false;
+
+ for (tmp=0; tmp <count; tmp++)
+ {
+ if (GetModelFeature (FN_PHONEBOOK)==F_PBK33INT ||
+ GetModelFeature (FN_PHONEBOOK)==F_PBK33SIM) {//pbk with Unicode
+ /* We check only 1'st, 3'rd, ... char */
+ if (tmp%2!=0 && MessageBuffer[6+tmp]==1) CurrentPhonebookEntry->Name[tmp/2]='~'; //enables/disables blinking
+ if (tmp%2!=0 && MessageBuffer[6+tmp]==0) CurrentPhonebookEntry->Name[tmp/2]='`'; //hides rest ot contents
+ } else {
+ if (MessageBuffer[6+tmp]==1) CurrentPhonebookEntry->Name[tmp]='~'; //enables/disables blinking
+ if (MessageBuffer[6+tmp]==0) CurrentPhonebookEntry->Name[tmp]='`'; //hides rest ot contents
+ }
+ }
+
+ i=7+count;
+ count=MessageBuffer[6+count];
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Number: "));
+
+ for (tmp=0; tmp <count; tmp++)
+ fprintf(stdout, "%c", MessageBuffer[i+tmp]);
+
+ fprintf(stdout, "\n");
+#endif /* DEBUG */
+
+ memcpy(CurrentPhonebookEntry->Number, MessageBuffer + i, count);
+ CurrentPhonebookEntry->Number[count] = 0x00;
+ CurrentPhonebookEntry->Group = MessageBuffer[i+count];
+
+ /* Phone doesn't have entended phonebook */
+ CurrentPhonebookEntry->SubEntriesCount = 0;
+
+ /* But for these memories data is saved and we can save it using 7110/6210 style */
+ if (CurrentPhonebookEntry->MemoryType==GMT_DC ||
+ CurrentPhonebookEntry->MemoryType==GMT_RC ||
+ CurrentPhonebookEntry->MemoryType==GMT_MC) {
+ CurrentPhonebookEntry->SubEntriesCount = 1;
+ CurrentPhonebookEntry->SubEntries[0].EntryType=N7110_ENTRYTYPE_DATE;
+ CurrentPhonebookEntry->SubEntries[0].NumberType=0;
+ CurrentPhonebookEntry->SubEntries[0].BlockNumber=1;
+ DecodeDateTime(MessageBuffer+(i+count+2),&CurrentPhonebookEntry->SubEntries[0].data.Date);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Date: "));
+ fprintf(stdout, "%02u.%02u.%04u\n",
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Day,
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Month,
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Year);
+ fprintf(stdout, _(" Time: "));
+ fprintf(stdout, "%02u:%02u:%02u\n",
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Hour,
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Minute,
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Second);
+#endif /* DEBUG */
+
+ /* These values are set, when date and time unavailable in phone.
+ Values from 3310 - in other can be different */
+ if (CurrentPhonebookEntry->SubEntries[0].data.Date.Day==20 &&
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Month==1 &&
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Year==2118 &&
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Hour==3 &&
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Minute==14 &&
+ CurrentPhonebookEntry->SubEntries[0].data.Date.Second==7)
+ CurrentPhonebookEntry->SubEntriesCount = 0;
+ }
+
+ /* Signal no error to calling code. */
+ CurrentPhonebookError = GE_NONE;
+
+ break;
+
+ case 0x03:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook read entry error received:\n"));
+#endif /* DEBUG */
+
+ switch (MessageBuffer[4]) {
+
+ case 0x7d:
+#ifdef DEBUG
+ fprintf(stdout, _(" Invalid memory type!\n"));
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_INVALIDMEMORYTYPE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _(" Unknown error!\n"));
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_INTERNALERROR;
+ }
+
+ break;
+
+ }
+}
+
+/* Routine to get specifed phone book location. Designed to be called by
+ application. Will block until location is retrieved or a timeout/error
+ occurs. */
+GSM_Error N6110_GetMemoryLocation(GSM_PhonebookEntry *entry)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x01, 0x00, 0x00, 0x00};
+
+ CurrentPhonebookEntry = entry;
+
+ req[4] = N6110_GetMemoryType(entry->MemoryType);
+ req[5] = entry->Location;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, 7, 0x03, req);
+}
+
+void N6110_ReplyWritePhonebookLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x05:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook written correctly.\n"));
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_NONE;
+ break;
+
+ case 0x06:
+
+ switch (MessageBuffer[4]) {
+ /* FIXME: other errors? When I send the phonebook with index of 350 it
+ still report error 0x7d :-( */
+ case 0x7d:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook not written - name is too long.\n"));
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_PHBOOKNAMETOOLONG;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _(" Unknown error!\n"));
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_INTERNALERROR;
+ }
+ }
+}
+
+/* Routine to write phonebook location in phone. Designed to be called by
+ application code. Will block until location is written or timeout
+ occurs. */
+GSM_Error N6110_WritePhonebookLocation(GSM_PhonebookEntry *entry)
+{
+ unsigned char req[128] = { N6110_FRAME_HEADER, 0x04, 0x00, 0x00 };
+ int i=0, current=0;
+
+ req[4] = N6110_GetMemoryType(entry->MemoryType);
+ req[5] = entry->Location;
+
+ current=7;
+
+ if (GetModelFeature (FN_PHONEBOOK)==F_PBK33INT ||
+ GetModelFeature (FN_PHONEBOOK)==F_PBK33SIM) {
+
+ req[6] = strlen(entry->Name)*2;
+
+ EncodeUnicode (req+current,entry->Name ,strlen(entry->Name));
+
+ for (i=0; i<strlen(entry->Name); i++)
+ {
+ /* here we encode "special" chars */
+ if (entry->Name[i]=='~') req[current+i*2]=1; //enables/disables blinking
+ if (entry->Name[i]=='`') req[current+i*2]=0; //hides rest ot contents
+ }
+
+ current+=strlen(entry->Name)*2;
+ } else {
+
+ req[6] = strlen(entry->Name);
+
+ for (i=0; i<strlen(entry->Name); i++)
+ {
+ req[current+i] = entry->Name[i];
+
+ /* here we encode "special" chars */
+ if (entry->Name[i]=='~') req[current+i]=1; //enables/disables blinking
+ if (entry->Name[i]=='`') req[current+i]=0; //hides rest ot contents
+ }
+
+ current+=strlen(entry->Name);
+ }
+
+ req[current++]=strlen(entry->Number);
+
+ for (i=0; i<strlen(entry->Number); i++)
+ req[current+i] = entry->Number[i];
+
+ current+=strlen(entry->Number);
+
+ /* Jano: This allow to save 14 characters name into SIM memory, when
+ No Group is selected. */
+ if (entry->Group == 5)
+ req[current++]=0xff;
+ else
+ req[current++]=entry->Group;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, current, 0x03, req);
+}
+
+void N6110_ReplyNetmonitor(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch(MessageBuffer[3]) {
+
+ case 0x00:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Netmonitor correctly set.\n"));
+#endif /* DEBUG */
+ CurrentNetmonitorError=GE_NONE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Netmonitor menu %d received:\n"), MessageBuffer[3]);
+ fprintf(stdout, "%s\n", MessageBuffer+4);
+#endif /* DEBUG */
+
+ strcpy(CurrentNetmonitor, MessageBuffer+4);
+
+ CurrentNetmonitorError=GE_NONE;
+ }
+}
+
+GSM_Error N6110_NetMonitor(unsigned char mode, char *Screen)
+{
+ unsigned char req[] = { 0x00, 0x01, 0x7e, 0x00 };
+
+ GSM_Error error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ CurrentNetmonitor=Screen;
+
+ req[3]=mode;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentNetmonitorError, 4, 0x40, req);
+}
+
+/* Doesn't work in N3210. */
+/* In other allow to access phone menu without SIM card (just send any sequence) */
+GSM_Error N6110_SendDTMF(char *String)
+{
+ unsigned char req[64] = { N6110_FRAME_HEADER, 0x50,
+ 0x00 /* Length of DTMF string. */
+ };
+
+ u8 length=strlen(String);
+
+ if (length>59) length=59;
+
+ req[4] = length;
+
+ memcpy(req+5,String,length);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSendDTMFError, 5+length, 0x01, req);
+}
+
+void N6110_ReplyGetSpeedDial(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x17:
+
+ switch (MessageBuffer[4]) {
+ case 0x02: CurrentSpeedDialEntry->MemoryType = GMT_ME;
+ default : CurrentSpeedDialEntry->MemoryType = GMT_SM;
+ }
+
+ CurrentSpeedDialEntry->Location = MessageBuffer[5];
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Speed dial entry received:\n"));
+ fprintf(stdout, _(" Location: %d\n"), CurrentSpeedDialEntry->Location);
+ fprintf(stdout, _(" MemoryType: %s\n"), N6110_MemoryType_String[CurrentSpeedDialEntry->MemoryType]);
+ fprintf(stdout, _(" Number: %d\n"), CurrentSpeedDialEntry->Number);
+#endif /* DEBUG */
+
+ CurrentSpeedDialError=GE_NONE;
+ break;
+
+ case 0x18:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Speed dial entry error\n"));
+#endif /* DEBUG */
+ CurrentSpeedDialError=GE_INVALIDSPEEDDIALLOCATION;
+ break;
+
+ }
+}
+
+GSM_Error N6110_GetSpeedDial(GSM_SpeedDial *entry)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x16,
+ 0x00 /* The number of speed dial. */
+ };
+
+ CurrentSpeedDialEntry = entry;
+
+ req[4] = entry->Number;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSpeedDialError, 5, 0x03, req);
+}
+
+void N6110_ReplySetSpeedDial(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x1a:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Speed dial entry set.\n"));
+#endif /* DEBUG */
+ CurrentSpeedDialError=GE_NONE;
+ break;
+
+ case 0x1b:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Speed dial entry setting error.\n"));
+#endif /* DEBUG */
+ CurrentSpeedDialError=GE_INVALIDSPEEDDIALLOCATION;
+ break;
+
+ }
+}
+
+GSM_Error N6110_SetSpeedDial(GSM_SpeedDial *entry)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x19,
+ 0x00, /* Number */
+ 0x00, /* Memory Type */
+ 0x00 /* Location */
+ };
+
+ req[4] = entry->Number;
+
+ switch (entry->MemoryType) {
+ case GMT_ME: req[5] = 0x02;
+ default : req[5] = 0x03;
+ }
+
+ req[6] = entry->Location;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSpeedDialError, 7, 0x03, req);
+}
+
+/* This function finds parts of SMS in frame used in new Nokia phones
+ in internal protocols (they're coded according to GSM 03.40), copies them
+ to GSM_ETSISMSMessage and calls GSM_DecodeETSISMS to decode
+ GSM_ETSISMSMessage to GSM_SMSMessage structure */
+GSM_Error GSM_DecodeNokiaSMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int length)
+{
+ SMS_MessageType PDU=SMS_Deliver;
+ GSM_ETSISMSMessage ETSI;
+ int offset=0,i;
+
+ ETSI.firstbyte=req[12];
+
+ /* See GSM 03.40 section 9.2.3.1 */
+ if ((ETSI.firstbyte & 0x03) == 0x01) PDU=SMS_Submit;
+ if ((ETSI.firstbyte & 0x03) == 0x02) PDU=SMS_Status_Report;
+
+ switch (PDU) {
+ case SMS_Submit : offset=5;break;
+ case SMS_Deliver : offset=4;break;
+ case SMS_Status_Report: offset=3;break;
+ default: break;
+ }
+
+ for (i=0;i<req[0]+1;i++)
+ ETSI.SMSCNumber[i]=req[i];
+
+ for (i=0;i<((req[12+offset]+1)/2+1)+1;i++)
+ ETSI.Number[i]=req[i+12+offset];
+
+ switch (PDU) {
+ case SMS_Submit:
+ ETSI.TPDCS=req[10+offset];
+ ETSI.TPUDL=req[11+offset];
+ ETSI.TPVP=0; //no support for now
+ ETSI.TPPID=0; //no support for now
+ for(i=31+offset;i<length;i++)
+ ETSI.MessageText[i-31-offset]=req[i];
+ break;
+ case SMS_Deliver:
+ ETSI.TPDCS=req[10+offset];
+ ETSI.TPUDL=req[11+offset];
+ ETSI.TPPID=0; //no support for now
+ for(i=31+offset;i<length;i++)
+ ETSI.MessageText[i-31-offset]=req[i];
+ for(i=0;i<7;i++)
+ ETSI.DeliveryDateTime[i]=req[i+24+offset];
+ break;
+ case SMS_Status_Report:
+ for(i=0;i<7;i++)
+ ETSI.DeliveryDateTime[i]=req[i+24+offset];
+ ETSI.TPStatus=req[14];
+ for(i=0;i<7;i++)
+ ETSI.SMSCDateTime[i]=req[i+34];
+ break;
+ default:
+ break;
+ }
+
+ GSM_DecodeETSISMS(SMS, &ETSI);
+
+ SMS->Name[0]=0;
+
+ return GE_NONE;
+}
+
+void N6110_ReplyGetSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int offset;
+
+ switch (MessageBuffer[3]) {
+
+ case 0x08:
+
+ switch (MessageBuffer[7]) {
+
+ case 0x00:
+ CurrentSMSMessage->Type = GST_SMS;
+ CurrentSMSMessage->folder=GST_INBOX;
+ offset=4;
+ break;
+
+ case 0x01:
+ CurrentSMSMessage->Type = GST_DR;
+ CurrentSMSMessage->folder=GST_INBOX;
+ offset=3;
+ break;
+
+ case 0x02:
+ CurrentSMSMessage->Type = GST_SMS;
+ CurrentSMSMessage->folder=GST_OUTBOX;
+ offset=5;
+ break;
+
+ default:
+ CurrentSMSMessage->Type = GST_UN;
+ offset=4;
+ break;
+
+ }
+
+ /* Field Short Message Status - MessageBuffer[4] seems not to be
+ compliant with GSM 07.05 spec.
+ Meaning Nokia protocol GMS spec
+ ----------------------------------------------------
+ MO Sent 0x05 0x07 or 0x01
+ MO Not sent 0x07 0x06 or 0x00
+ MT Read 0x01 0x05 or 0x01
+ MT Not read 0x03 0x04 or 0x00
+ ----------------------------------------------------
+ See GSM 07.05 section 2.5.2.6 and correct me if I'm wrong.
+
+ Pawel Kot */
+
+ if (MessageBuffer[4] & 0x02) CurrentSMSMessage->Status = GSS_NOTSENTREAD;
+ else CurrentSMSMessage->Status = GSS_SENTREAD;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Number: %d\n"), MessageBuffer[6]);
+
+ if (CurrentSMSMessage->folder!=1) { //GST_OUTBOX
+ fprintf(stdout, _("Message: Received SMS (mobile terminated)\n"));
+ } else {
+ fprintf(stdout, _("Message: Outbox message (mobile originated)\n"));
+ }
+
+ if (CurrentSMSMessage->Type == GST_DR) fprintf(stdout, _(" Delivery Report\n"));
+ if (CurrentSMSMessage->Type == GST_UN) fprintf(stdout, _(" Unknown type\n"));
+
+ if (CurrentSMSMessage->folder==1) { //GST_OUTBOX
+ if (CurrentSMSMessage->Status) fprintf(stdout, _(" Sent\n"));
+ else fprintf(stdout, _(" Not sent\n"));
+ } else {
+ if (CurrentSMSMessage->Status) fprintf(stdout, _(" Read\n"));
+ else fprintf(stdout, _(" Not read\n"));
+ }
+#endif
+
+ CurrentSMSPointer=GSM_DecodeNokiaSMSFrame(CurrentSMSMessage, MessageBuffer+8, MessageLength-8);
+
+ CurrentSMSMessage->MemoryType = MessageBuffer[5];
+ CurrentSMSMessage->MessageNumber = MessageBuffer[6];
+
+ /* Signal no error to calling code. */
+ CurrentSMSMessageError = GE_NONE;
+
+#ifdef DEBUG
+ fprintf(stdout, "\n");
+#endif
+
+ break;
+
+ case 0x09:
+
+ /* We have requested invalid or empty location. */
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS reading failed\n"));
+
+ switch (MessageBuffer[4]) {
+ case 0x02:
+ fprintf(stdout, _(" Invalid location!\n"));break;
+ case 0x07:
+ fprintf(stdout, _(" Empty SMS location.\n"));break;
+ case 0x0c:
+ fprintf(stdout, _(" No access to memory (no PIN on card ?)\n"));break;
+ default:
+ fprintf(stdout, _(" Error code %i - please report it \n"),MessageBuffer[4]);break;
+ }
+#endif /* DEBUG */
+
+ switch (MessageBuffer[4]) {
+ case 0x02:CurrentSMSMessageError = GE_INVALIDSMSLOCATION;break;
+ case 0x07:CurrentSMSMessageError = GE_EMPTYSMSLOCATION;break;
+ case 0x0c:CurrentSMSMessageError = GE_NOACCESS;break;
+ default :CurrentSMSMessageError = GE_UNKNOWN;break;
+ }
+
+ break;
+
+ }
+}
+
+GSM_Error N6110_GetSMSMessage(GSM_SMSMessage *message)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x07,
+ 0x02, /* Unknown */
+ 0x00, /* Location */
+ 0x01, 0x64};
+
+ int timeout = 60;
+
+ /* State machine code writes data to these variables when it comes in. */
+
+ CurrentSMSMessage = message;
+ CurrentSMSMessageError = GE_BUSY;
+
+ req[5] = message->Location;
+
+ /* Send request */
+ Protocol->SendMessage(8, 0x02, req);
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && (CurrentSMSMessageError == GE_BUSY || CurrentSMSMessageError == GE_SMSWAITING)) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ return (CurrentSMSMessageError);
+}
+
+void N6110_ReplyDeleteSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS deleted successfully.\n"));
+#endif /* DEBUG */
+
+ CurrentSMSMessageError = GE_NONE;
+}
+
+GSM_Error N6110_DeleteSMSMessage(GSM_SMSMessage *message)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0a, 0x02, 0x00};
+
+ req[5] = message->Location;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSMSMessageError, 6, 0x14, req);
+}
+
+/* FIXME: do we need more than SMS_Submit and SMS_Deliver ? */
+GSM_Error GSM_EncodeNokiaSMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int *length, SMS_MessageType PDU)
+{
+ GSM_ETSISMSMessage ETSI;
+ int i,offset=0;
+
+ GSM_EncodeETSISMS(SMS, &ETSI, PDU, length);
+
+ /* Cleaning */
+ for (i=0;i<36;i++) req[i]=0;
+
+ req[12]=ETSI.firstbyte;
+
+ for (i=0;i<ETSI.SMSCNumber[0]+1;i++)
+ req[i]=ETSI.SMSCNumber[i];
+
+ switch (PDU) {
+ case SMS_Submit:
+ offset=5;
+ for (i=0;i<((ETSI.Number[0]+1)/2+1)+1;i++)
+ req[i+12+offset]=ETSI.Number[i];
+ req[10+offset]=ETSI.TPDCS;
+ req[11+offset]=ETSI.TPUDL;
+ req[24+offset]=ETSI.TPVP;
+#ifdef DEBUG
+// fprintf(stdout,_(" First byte: %02x\n"),ETSI.firstbyte);
+// fprintf(stdout,_(" TP-VP: %02x\n"),ETSI.TPVP);
+// fprintf(stdout,_(" TP-DCS: %02x\n"),ETSI.TPDCS);
+#endif
+// req[]=ETSI.TPPID;
+ for(i=0;i<*length;i++)
+ req[i+31+offset]=ETSI.MessageText[i];
+ break;
+
+ case SMS_Deliver:
+ offset=4;
+ for (i=0;i<((ETSI.Number[0]+1)/2+1)+1;i++)
+ req[i+12+offset]=ETSI.Number[i];
+ req[10+offset]=ETSI.TPDCS;
+ req[11+offset]=ETSI.TPUDL;
+// req[]=ETSI.TPPID;
+ for(i=0;i<*length;i++)
+ req[i+31+offset]=ETSI.MessageText[i];
+ for (i=0;i<7;i++)
+ req[24+offset+i]=ETSI.DeliveryDateTime[i];
+ break;
+ default:
+ break;
+ }
+
+ *length=*length+offset;
+
+ return GE_NONE;
+}
+
+void N6110_ReplySendSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ /* SMS message correctly sent to the network */
+ case 0x02:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message correctly sent.\n"));
+#endif /* DEBUG */
+ CurrentSMSMessageError = GE_SMSSENDOK;
+ break;
+
+ /* SMS message send to the network failed */
+ case 0x03:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Sending SMS Message failed, error: %i"),MessageBuffer[6]);
+
+ switch (MessageBuffer[6]) {
+ case 1: fprintf(stdout,_(" (info \"Number not in use\")"));break;
+ case 21: fprintf(stdout,_(" (info \"Message not sent this time\")"));break;
+ case 28: fprintf(stdout,_(" (info \"Number not in use\")"));break;
+ case 38: fprintf(stdout,_(" (info \"Message not sent this time\")"));break; case 50: fprintf(stdout,_(" (info \"Check operator services\")"));break;
+ case 96: fprintf(stdout,_(" (info \"Message sending failed\")"));break;
+ case 111: fprintf(stdout,_(" (info \"Message sending failed\")"));break;
+ case 166: fprintf(stdout,_(" (info \"Message sending failed\")"));break;
+ case 178: fprintf(stdout,_(" (info \"Message sending failed\")"));break;
+ case 252: fprintf(stdout,_(" (info \"Message sending failed\")"));break; case 253: fprintf(stdout,_(" (info \"Message sending failed\")"));break;
+ }
+
+ fprintf(stdout,_("\n For more details with errors see netmonitor manual (test 65) on www.marcin-wiacek.topnet.pl"));
+ fprintf(stdout,_("\n If know their meaning, GSM specs decribing them, contact with me on marcin-wiacek@topnet.pl. THX\n"));
+#endif /* DEBUG */
+
+ CurrentSMSMessageError = GE_SMSSENDFAILED;
+ break;
+
+ }
+}
+
+GSM_Error N6110_SendSMSMessage(GSM_SMSMessage *SMS)
+{
+ GSM_Error error;
+
+ unsigned char req[256] = {
+ N6110_FRAME_HEADER,
+ 0x01, 0x02, 0x00, /* SMS send request*/
+ };
+
+ int length;
+
+ error=GSM_EncodeNokiaSMSFrame(SMS, req+6, &length, SMS_Submit);
+ if (error != GE_NONE) return error;
+
+ return NULL_SendMessageSequence
+ (200, &CurrentSMSMessageError, 42+length, 0x02, req);
+}
+
+void N6110_ReplySaveSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x05:
+
+#ifdef DEBUG
+ fprintf(stdout, _("SMS Message stored at %d\n"), MessageBuffer[5]);
+#endif
+
+ CurrentSMSMessage->MessageNumber=MessageBuffer[5];
+
+ CurrentSMSMessageError = GE_NONE;
+ break;
+
+ case 0x06:
+#ifdef DEBUG
+ fprintf(stdout, _("SMS saving failed\n"));
+ switch (MessageBuffer[4]) {
+ case 0x02:fprintf(stdout, _(" All locations busy.\n"));break;
+ case 0x03:fprintf(stdout, _(" Invalid location!\n"));break;
+ default :fprintf(stdout, _(" Unknown error.\n"));break;
+ }
+#endif
+
+ switch (MessageBuffer[4]) {
+ case 0x02:CurrentSMSMessageError = GE_MEMORYFULL;break;
+ case 0x03:CurrentSMSMessageError = GE_INVALIDSMSLOCATION;break;
+ default :CurrentSMSMessageError = GE_UNKNOWN;break;
+ }
+ }
+}
+
+/* GST_DR and GST_UN not supported ! */
+GSM_Error N6110_SaveSMSMessage(GSM_SMSMessage *SMS)
+{
+ unsigned char req[256] = {
+ N6110_FRAME_HEADER, 0x04, /* SMS save request*/
+ 0x00, /* SMS Status. Different for Inbox and Outbox */
+ 0x02, /* ?? */
+ 0x00, /* SMS Location */
+ 0x02, /* SMS Type */
+ };
+
+ int length;
+ SMS_MessageType PDU;
+ GSM_Error error;
+
+ if (SMS->Location) req[6] = SMS->Location;
+
+ if (SMS->folder==0) { /*Inbox*/
+ req[4]=1; /* SMS Status */
+ req[7] = 0x00; /* SMS Type */
+ PDU=SMS_Deliver;
+ } else {
+ req[4]=5; /* SMS Status */
+ req[7] = 0x02; /* SMS Type */
+ PDU=SMS_Submit;
+ }
+
+ if (SMS->Status == GSS_NOTSENTREAD) req[4] |= 0x02;
+
+ error=GSM_EncodeNokiaSMSFrame(SMS, req+8, &length, PDU);
+ if (error != GE_NONE) return error;
+
+ CurrentSMSMessage = SMS;
+
+ return NULL_SendMessageSequence
+ (70, &CurrentSMSMessageError, 39+length, 0x14, req);
+}
+
+void N6110_ReplySetCellBroadcast(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Cell Broadcast enabled/disabled successfully.\n")); fflush (stdout);
+#endif
+
+ CurrentCBError = GE_NONE;
+}
+
+/* Enable and disable Cell Broadcasting */
+GSM_Error N6110_EnableCellBroadcast(void)
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x20,
+ 0x01, 0x01, 0x00, 0x00, 0x01, 0x01};
+
+#ifdef DEBUG
+ fprintf (stdout,"Enabling CB\n");
+#endif
+
+ CurrentCBMessage = (GSM_CBMessage *)malloc(sizeof (GSM_CBMessage));
+ CurrentCBMessage->Channel = 0;
+ CurrentCBMessage->New = false;
+ strcpy (CurrentCBMessage->Message,"");
+
+ return NULL_SendMessageSequence
+ (10, &CurrentCBError, 10, 0x02, req);
+}
+
+
+GSM_Error N6110_DisableCellBroadcast(void)
+{
+ /* Should work, but not tested fully */
+
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x20,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; /*VERIFY*/
+
+ return NULL_SendMessageSequence
+ (10, &CurrentCBError, 10, 0x02, req);
+}
+
+void N6110_ReplyReadCellBroadcast(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i, tmp;
+ unsigned char output[160];
+
+ CurrentCBMessage->Channel = MessageBuffer[7];
+ CurrentCBMessage->New = true;
+ tmp=GSM_UnpackEightBitsToSeven(0, MessageBuffer[9], MessageBuffer[9], MessageBuffer+10, output);
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: CB received.\n")); fflush (stdout);
+
+ fprintf(stdout, _("Message: channel number %i\n"),MessageBuffer[7]);
+
+ fflush (stdout);
+
+ for (i=0; i<tmp;i++) {
+ fprintf(stdout, "%c", DecodeWithDefaultAlphabet(output[i]));
+ }
+
+ fprintf(stdout, "\n");
+#endif
+
+ for (i=0; i<tmp; i++) {
+ CurrentCBMessage->Message[i] = DecodeWithDefaultAlphabet(output[i]);
+ }
+ CurrentCBMessage->Message[i]=0;
+}
+
+GSM_Error N6110_ReadCellBroadcast(GSM_CBMessage *Message)
+{
+#ifdef DEBUG
+ fprintf(stdout,"Reading CB\n");
+#endif
+
+ if (CurrentCBMessage != NULL)
+ {
+ if (CurrentCBMessage->New == true)
+ {
+#ifdef DEBUG
+ fprintf(stdout,"New CB received\n");
+#endif
+ Message->Channel = CurrentCBMessage->Channel;
+ strcpy(Message->Message,CurrentCBMessage->Message);
+ CurrentCBMessage->New = false;
+ return (GE_NONE);
+ }
+ }
+ return (GE_NONEWCBRECEIVED);
+}
+
+int N6110_MakeCallerGroupFrame(unsigned char *req,GSM_Bitmap Bitmap)
+{
+ int count=0;
+
+ req[count++]=Bitmap.number;
+ req[count++]=strlen(Bitmap.text);
+ memcpy(req+count,Bitmap.text,req[count-1]);
+ count+=req[count-1];
+ req[count++]=Bitmap.ringtone;
+
+ /* Setting for graphic:
+ 0x00 - Off
+ 0x01 - On
+ 0x02 - View Graphics
+ 0x03 - Send Graphics
+ 0x04 - Send via IR
+ You can even set it higher but Nokia phones (my
+ 6110 at least) will not show you the name of this
+ item in menu ;-)) Nokia is really joking here. */
+ if (Bitmap.enabled) req[count++]=0x01;
+ else req[count++]=0x00;
+
+ req[count++]=(Bitmap.size+4)>>8;
+ req[count++]=(Bitmap.size+4)%0xff;
+ req[count++]=0x00; /* Future extensions! */
+ req[count++]=Bitmap.width;
+ req[count++]=Bitmap.height;
+ req[count++]=0x01; /* Just BW */
+ memcpy(req+count,Bitmap.bitmap,Bitmap.size);
+
+ return count+Bitmap.size;
+}
+
+int N6110_MakeOperatorLogoFrame(unsigned char *req,GSM_Bitmap Bitmap)
+{
+ int count=0;
+
+ EncodeNetworkCode(req+count, Bitmap.netcode);
+ count=count+3;
+
+ req[count++]=(Bitmap.size+4)>>8;
+ req[count++]=(Bitmap.size+4)%0xff;
+ req[count++]=0x00; /* Infofield */
+ req[count++]=Bitmap.width;
+ req[count++]=Bitmap.height;
+ req[count++]=0x01; /* Just BW */
+ memcpy(req+count,Bitmap.bitmap,Bitmap.size);
+
+ return count+Bitmap.size;
+}
+
+int N6110_MakeStartupLogoFrame(unsigned char *req,GSM_Bitmap Bitmap)
+{
+ int count=0;
+
+ req[count++]=0x01;
+ req[count++]=Bitmap.height;
+ req[count++]=Bitmap.width;
+ memcpy(req+count,Bitmap.bitmap,Bitmap.size);
+
+ return count+Bitmap.size;
+}
+
+/* Set a bitmap or welcome-note */
+GSM_Error N6110_SetBitmap(GSM_Bitmap *Bitmap) {
+
+ unsigned char req[600] = { N6110_FRAME_HEADER };
+ u16 count=3;
+ u8 textlen;
+
+ int timeout=50;
+
+ /* Direct uploading variables */
+ GSM_MultiSMSMessage SMS;
+ unsigned char buffer[1000] = {0x0c,0x01};
+ GSM_NetworkInfo NetworkInfo;
+
+ GSM_Error error;
+
+ /* Uploading with preview */
+ if (Bitmap->number==255 &&
+ (Bitmap->type==GSM_OperatorLogo || Bitmap->type==GSM_CallerLogo)) {
+ GSM_SaveBitmapToSMS(&SMS,Bitmap,false,false);
+ memcpy(buffer+2,SMS.SMS[0].UDH,SMS.SMS[0].UDH[0]+1);
+
+ memcpy(buffer+2+SMS.SMS[0].UDH[0]+1,SMS.SMS[0].MessageText,SMS.SMS[0].Length);
+
+ buffer[2+SMS.SMS[0].UDH[0]+1+SMS.SMS[0].Length]=0x00;
+
+ Protocol->SendMessage(2+SMS.SMS[0].UDH[0]+1+SMS.SMS[0].Length+1, 0x12, buffer);
+
+ GSM->GetNetworkInfo(&NetworkInfo); //need to make something
+ return GE_NONE; //no answer from phone
+ }
+
+ CurrentSetBitmapError = GE_BUSY;
+
+ switch (Bitmap->type) {
+ case GSM_WelcomeNoteText:
+ case GSM_DealerNoteText:
+ req[count++]=0x18;
+ req[count++]=0x01; /* Only one block */
+
+ if (Bitmap->type==GSM_WelcomeNoteText)
+ req[count++]=0x02; /* Welcome text */
+ else
+ req[count++]=0x03; /* Dealer Welcome Note */
+
+ textlen=strlen(Bitmap->text);
+ req[count++]=textlen;
+ memcpy(req+count,Bitmap->text,textlen);
+
+ count+=textlen;
+
+ Protocol->SendMessage(count, 0x05, req);
+
+ break;
+
+ case GSM_StartupLogo:
+ if (Bitmap->number==0) {
+
+ /* For 33xx we first set animated logo to default */
+ if (GetModelFeature (FN_STARTUP)==F_STANIM) {
+ error=N6110_SetProfileFeature(0, 0x29, Bitmap->number);
+ if (error!=GE_NONE) return error;
+ }
+
+ req[count++]=0x18;
+ req[count++]=0x01; /* Only one block */
+ count=count+N6110_MakeStartupLogoFrame(req+5,*Bitmap);
+ Protocol->SendMessage(count, 0x05, req);
+ } else {
+ return N6110_SetProfileFeature(0, 0x29, Bitmap->number);
+ }
+ break;
+
+ case GSM_OperatorLogo:
+ req[count++]=0x30; /* Store Op Logo */
+ req[count++]=0x01; /* Location */
+ count=count+N6110_MakeOperatorLogoFrame(req+5,*Bitmap);
+ Protocol->SendMessage(count, 0x05, req);
+ break;
+
+ case GSM_CallerLogo:
+ req[count++]=0x13;
+ count=count+N6110_MakeCallerGroupFrame(req+4,*Bitmap);
+ Protocol->SendMessage(count, 0x03, req);
+ break;
+
+ case GSM_PictureImage:
+ req[count++]=0x03;
+ req[count++]=Bitmap->number;
+ if (strcmp(Bitmap->Sender,"")) {
+ req[count]=GSM_PackSemiOctetNumber(Bitmap->Sender, req+count+1,true);
+
+ /* Convert number of semioctets to number of chars and add count */
+ textlen=req[count];
+ if (textlen % 2) textlen++;
+ count+=textlen / 2 + 1;
+
+ count++;
+ } else {
+ req[count++]=0x00;
+ req[count++]=0x00;
+ }
+ req[count++]=0x00;
+ req[count++]=strlen(Bitmap->text);
+ memcpy(req+count,Bitmap->text,strlen(Bitmap->text));
+ count+=strlen(Bitmap->text);
+ req[count++]=0x00;
+ req[count++]=Bitmap->width;
+ req[count++]=Bitmap->height;
+ req[count++]=0x01;
+ memcpy(req+count,Bitmap->bitmap,Bitmap->size);
+ Protocol->SendMessage(count+Bitmap->size, 0x47, req);
+ break;
+
+ case GSM_7110OperatorLogo:
+ case GSM_7110StartupLogo:
+ case GSM_6210StartupLogo:
+ return GE_NOTSUPPORTED;
+
+ case GSM_None:
+ return GE_NONE;
+ }
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentSetBitmapError == GE_BUSY ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ return CurrentSetBitmapError;
+}
+
+/* Get a bitmap from the phone */
+GSM_Error N6110_GetBitmap(GSM_Bitmap *Bitmap) {
+
+ unsigned char req[10] = { N6110_FRAME_HEADER };
+ u8 count=3;
+
+ int timeout=100;
+
+ CurrentGetBitmap=Bitmap;
+ CurrentGetBitmapError = GE_BUSY;
+
+ switch (CurrentGetBitmap->type) {
+ case GSM_StartupLogo:
+ case GSM_WelcomeNoteText:
+ case GSM_DealerNoteText:
+ req[count++]=0x16;
+ Protocol->SendMessage(count, 0x05, req);
+ break;
+ case GSM_OperatorLogo:
+ req[count++]=0x33;
+ req[count++]=0x01; /* Location 1 */
+ Protocol->SendMessage(count, 0x05, req);
+ break;
+ case GSM_CallerLogo:
+ req[count++]=0x10;
+ req[count++]=Bitmap->number;
+ Protocol->SendMessage(count, 0x03, req);
+ break;
+ case GSM_PictureImage:
+ req[count++]=0x01;
+ req[count++]=Bitmap->number;
+ Protocol->SendMessage(count, 0x47, req);
+ break;
+ case GSM_7110OperatorLogo:
+ case GSM_7110StartupLogo:
+ case GSM_6210StartupLogo:
+ default:
+ return GE_NOTSUPPORTED;
+ }
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentGetBitmapError == GE_BUSY ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ CurrentGetBitmap=NULL;
+
+ return CurrentGetBitmapError;
+}
+
+void N6110_ReplySetRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ /* Set ringtone OK */
+ case 0x37:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Ringtone set OK!\n"));
+#endif
+ CurrentRingtoneError=GE_NONE;
+ break;
+
+ /* Set ringtone error */
+ case 0x38:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Ringtone setting error !\n"));
+#endif
+ CurrentRingtoneError=GE_NOTSUPPORTED;
+ break;
+ }
+}
+
+GSM_Error N6110_SetRingTone(GSM_Ringtone *ringtone, int *maxlength)
+{
+
+ char req[FB61_MAX_RINGTONE_FRAME_LENGTH+10] =
+ {N6110_FRAME_HEADER,
+ 0x36,
+ 0x00, /* Location */
+ 0x00,0x78};
+
+ int size=FB61_MAX_RINGTONE_FRAME_LENGTH;
+
+ /* Variables for preview uploading */
+ unsigned char buffer[FB61_MAX_RINGTONE_FRAME_LENGTH+50];
+ unsigned char buffer2[20];
+ GSM_NetworkInfo NetworkInfo;
+
+ /* Setting ringtone with preview */
+ if (ringtone->location==255) {
+ buffer[0]=0x0c;
+ buffer[1]=0x01;
+ EncodeUDHHeader(buffer2, GSM_RingtoneUDH);
+ memcpy(buffer+2,buffer2,buffer2[0]+1); //copying UDH
+ *maxlength=GSM_PackRingtone(ringtone, buffer+2+buffer2[0]+1, &size); //packing ringtone
+ Protocol->SendMessage(2+buffer2[0]+1+size, 0x12, buffer); //sending frame
+ GSM->GetNetworkInfo(&NetworkInfo); //need to make something
+ sleep(1);
+ return GE_NONE; //no answer from phone
+ }
+
+ *maxlength=GSM_PackRingtone(ringtone, req+7, &size);
+
+ req[4]=ringtone->location-1;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentRingtoneError, (size+7), 0x05, req);
+}
+
+void N6110_ReplyGetBinRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i;
+
+ switch (MessageBuffer[4]) {
+ case 0x00: /* location supported. We have ringtone */
+
+ /* Binary format used in N6150 */
+ if (MessageBuffer[5]==0x0c && MessageBuffer[6]==0x01 && MessageBuffer[7]==0x2c) {
+#ifdef DEBUG
+ fprintf(stdout,_("Message: ringtone \""));
+#endif
+
+ /* Copying name */
+ i=8;
+ while (true) {
+#ifdef DEBUG
+ if (MessageBuffer[i]!=0)
+ fprintf(stdout,_("%c"),MessageBuffer[i]);
+#endif
+ CurrentGetBinRingtone->name[i-8]=MessageBuffer[i];
+ if (MessageBuffer[i]==0) break;
+ i++;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("\" received from location %i\n"),MessageBuffer[3]+1);
+#endif
+
+ /* Looking for end */
+ i=0;
+ while (true) {
+ if (MessageBuffer[i]==0x07 && MessageBuffer[i+1]==0x0b) {
+ i=i+2;break;
+ }
+ if (MessageBuffer[i]==0x0e && MessageBuffer[i+1]==0x0b) {
+ i=i+2;break;
+ }
+ i++;
+ if (i==MessageLength) break;
+ }
+
+ /* Copying frame */
+ memcpy(CurrentGetBinRingtone->frame,MessageBuffer+3,i-3);
+ CurrentGetBinRingtone->length=i-3;
+
+ CurrentBinRingtoneError=GE_NONE;
+ break;
+ }
+
+ /* Binary format used in N3210 */
+ if (MessageBuffer[5]==0x10 && MessageBuffer[6]==0x01 && MessageBuffer[7]==0x2c) {
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: ringtone \""));
+#endif
+
+ /* Copying name */
+ i=8;
+ while (true) {
+#ifdef DEBUG
+ if (MessageBuffer[i]!=0)
+ fprintf(stdout,_("%c"),MessageBuffer[i]);
+#endif
+ CurrentGetBinRingtone->name[i-8]=MessageBuffer[i];
+ if (MessageBuffer[i]==0) break;
+ i++;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("\" received from location %i\n"),MessageBuffer[3]+1);
+#endif
+
+ /* Here changes to get full compatibility with binary format used in N6150 */
+ MessageBuffer[3]=0;
+ MessageBuffer[4]=0;
+ MessageBuffer[5]=0x0c;
+ MessageBuffer[6]=0x01;
+ MessageBuffer[7]=0x2c;
+
+ /* Looking for end */
+ i=0;
+ while (true) {
+ if (MessageBuffer[i]==0x07 && MessageBuffer[i+1]==0x0b) {
+ i=i+2;break;
+ }
+ if (MessageBuffer[i]==0x0e && MessageBuffer[i+1]==0x0b) {
+ i=i+2;break;
+ }
+ i++;
+ if (i==MessageLength) break;
+ }
+
+ /* Copying frame */
+ memcpy(CurrentGetBinRingtone->frame,MessageBuffer+3,i-3);
+
+ CurrentGetBinRingtone->length=i-3;
+
+ CurrentBinRingtoneError=GE_NONE;
+ break;
+ }
+
+ /* Copying frame */
+ memcpy(CurrentGetBinRingtone->frame,MessageBuffer,MessageLength);
+
+ CurrentGetBinRingtone->length=MessageLength;
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: unknown binary format for ringtone received from location %i\n"),MessageBuffer[3]+1);
+#endif
+ CurrentBinRingtoneError=GE_UNKNOWNMODEL;
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: Phone doesn't support downloaded ringtones at location %i\n"),MessageBuffer[3]+1);
+#endif
+
+ CurrentBinRingtoneError=GE_INVALIDRINGLOCATION;
+ }
+}
+
+GSM_Error N6110_GetBinRingTone(GSM_BinRingtone *ringtone)
+{
+ unsigned char req[] = { 0x00,0x01,0x9e,
+ 0x00 }; //location
+
+ GSM_Error error;
+
+ CurrentGetBinRingtone=ringtone;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ req[3]=ringtone->location-1;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentBinRingtoneError, 4, 0x40, req);
+}
+
+void N6110_ReplySetBinRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[4]) {
+ case 0x00: /* location supported. We set ringtone */
+#ifdef DEBUG
+ fprintf(stdout,_("Message: downloaded ringtone set at location %i\n"),MessageBuffer[3]+1);
+#endif
+ CurrentBinRingtoneError=GE_NONE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout,_("Message: Phone doesn't support downloaded ringtones at location %i\n"),MessageBuffer[3]+1);
+#endif
+ CurrentBinRingtoneError=GE_NOTSUPPORTED;
+ break;
+ }
+}
+
+GSM_Error N6110_SetBinRingTone(GSM_BinRingtone *ringtone)
+{
+ unsigned char req[1000] = { 0x00,0x01,0xa0};
+
+ GSM_Error error;
+
+ GSM_BinRingtone ring;
+
+ /* Must be sure, that can upload ringtone to this phone */
+ ring.location=ringtone->location;
+ error=N6110_GetBinRingTone(&ring);
+ if (error!=GE_NONE) return error;
+
+ error=N6110_EnableExtendedCommands(0x01);
+ if (error!=GE_NONE) return error;
+
+ memcpy(req+3,ringtone->frame,ringtone->length);
+
+ req[3]=ringtone->location-1;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentBinRingtoneError, ringtone->length+3, 0x40, req);
+}
+
+GSM_Error N6110_Reset(unsigned char type)
+{
+ return N6110_EnableExtendedCommands(type);
+}
+
+void N6110_Dispatch0x01Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int tmp, count;
+
+ switch (MessageBuffer[3]) {
+
+ /* Unknown message - it has been seen after the 0x07 message (call
+ answered). Probably it has similar meaning. If you can solve
+ this - just mail me. Pavel JanÃk ml.
+
+ The message looks like this:
+
+ Msg Destination: PC
+ Msg Source: Phone
+ Msg Type: 01
+ Msg Unknown: 00
+ Msg Len: 0e
+
+ Phone: [01 ][08 ][00 ] is the header of the frame
+
+ [03 ] is the call message subtype
+
+ [05 ] is the call sequence number
+
+ [05 ] unknown
+
+ [00 ][01 ][03 ][02 ][91][00] are unknown but has been
+ seen in the Incoming call message (just after the
+ caller's name from the phonebook). But never change
+ between phone calls :-(
+ */
+
+ /* This may mean sequence number of 'just made' call - CK */
+ case 0x02:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call message, type 0x02:"));
+ fprintf(stdout, _(" Exact meaning not known yet, sorry :-(\n"));
+#endif /* DEBUG */
+
+ break;
+
+ /* Possibly call OK */
+ /* JD: I think that this means "call in progress" (incomming or outgoing) */
+ case 0x03:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call message, type 0x03:"));
+ fprintf(stdout, _(" Sequence nr. of the call: %d\n"), MessageBuffer[4]);
+ fprintf(stdout, _(" Exact meaning not known yet, sorry :-(\n"));
+#endif /* DEBUG */
+
+ CurrentCallSequenceNumber=MessageBuffer[4];
+ CurrentIncomingCall[0]='D';
+ if (CurrentCallPassup) CurrentCallPassup('D');
+
+ break;
+
+ /* Remote end has gone away before you answer the call. Probably your
+ mother-in-law or banker (which is worse?) ... */
+ case 0x04:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Remote end hang up.\n"));
+ fprintf(stdout, _(" Sequence nr. of the call: %d, error: %i"), MessageBuffer[4],MessageBuffer[6]);
+
+ switch (MessageBuffer[6]) {
+ case 28: fprintf(stdout,_(" (info \"Invalid phone number\")"));break;
+ case 34: fprintf(stdout,_(" (info \"Network busy\")"));break;
+ case 42: fprintf(stdout,_(" (info \"Network busy\")"));break;
+ case 47: fprintf(stdout,_(" (info \"Error in connection\")"));break;
+ case 50: fprintf(stdout,_(" (info \"Check operator services\")"));break; case 76: fprintf(stdout,_(" (info \"Check operator services\")"));break;
+ case 111: fprintf(stdout,_(" (info \"Error in connection\")"));break;
+ }
+
+ fprintf(stdout,_("\n For more details with errors see netmonitor manual (test 39) on www.marcin-wiacek.topnet.pl"));
+ fprintf(stdout,_("\n If know their meaning, GSM specs decribing them, contact with me on marcin-wiacek@topnet.pl. THX\n"));
+#endif /* DEBUG */
+
+ CurrentIncomingCall[0] = ' ';
+ if (CurrentCallPassup) CurrentCallPassup(' ');
+
+ break;
+
+ /* Incoming call alert */
+ case 0x05:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Incoming call alert:\n"));
+
+ /* We can have more then one call ringing - we can distinguish between
+ them */
+
+ fprintf(stdout, _(" Sequence nr. of the call: %d\n"), MessageBuffer[4]);
+ fprintf(stdout, _(" Number: "));
+
+ count=MessageBuffer[6];
+
+ for (tmp=0; tmp <count; tmp++)
+ fprintf(stdout, "%c", MessageBuffer[7+tmp]);
+
+ fprintf(stdout, "\n");
+
+ fprintf(stdout, _(" Name: "));
+
+ for (tmp=0; tmp <MessageBuffer[7+count]; tmp++)
+ fprintf(stdout, "%c", MessageBuffer[8+count+tmp]);
+
+ fprintf(stdout, "\n");
+#endif /* DEBUG */
+
+ count=MessageBuffer[6];
+
+ CurrentIncomingCall[0] = 0;
+ for (tmp=0; tmp <count; tmp++)
+ sprintf(CurrentIncomingCall, "%s%c", CurrentIncomingCall, MessageBuffer[7+tmp]);
+
+ break;
+
+ /* Call answered. Probably your girlfriend...*/
+ case 0x07:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call answered.\n"));
+ fprintf(stdout, _(" Sequence nr. of the call: %d\n"), MessageBuffer[4]);
+#endif /* DEBUG */
+
+ break;
+
+ /* Call ended. Girlfriend is girlfriend, but time is money :-) */
+ case 0x09:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call ended by your phone.\n"));
+ fprintf(stdout, _(" Sequence nr. of the call: %d\n"), MessageBuffer[4]);
+#endif /* DEBUG */
+
+ break;
+
+ /* This message has been seen with the message of subtype 0x09
+ after I hang the call.
+
+ Msg Destination: PC
+ Msg Source: Phone
+ Msg Type: 01
+ Msg Unknown: 00
+ Msg Len: 08
+ Phone: [01 ][08 ][00 ][0a ][04 ][87 ][01 ][42B][1a ][c2 ]
+
+ What is the meaning of 87? Can you spell some magic light into
+ this issue?
+
+ */
+
+ /* Probably means call over - CK */
+ case 0x0a:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Call message, type 0x0a:"));
+ fprintf(stdout, _(" Sequence nr. of the call: %d\n"), MessageBuffer[4]);
+ fprintf(stdout, _(" Exact meaning not known yet, sorry :-(\n"));
+#endif /* DEBUG */
+
+ CurrentIncomingCall[0] = ' ';
+ if (CurrentCallPassup) CurrentCallPassup(' ');
+
+ break;
+
+ case 0x40:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Answer for send DTMF or dial voice command\n"));
+#endif
+
+ if (CurrentSendDTMFError!=GE_NONE) CurrentSendDTMFError=GE_NONE;
+
+ if (CurrentDialVoiceError!=GE_NONE) CurrentDialVoiceError=GE_NONE;
+
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x01\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N6110_Dispatch0x03Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int tmp, count;
+
+ switch (MessageBuffer[3]) {
+
+ case 0x04:
+
+ /* AFAIK, this frame isn't used anywhere - it's rather for testing :-) */
+ /* If you want see, if it works with your phone make something like that: */
+
+ /* unsigned char connect5[] = {N6110_FRAME_HEADER, 0x03}; */
+ /* Protocol->SendMessage(4, 0x04, connect5); */
+
+ /* Marcin-Wiacek@TopNet.PL */
+
+#ifdef WIN32
+ sprintf(Current_IMEI, "%s", MessageBuffer+5);
+ sprintf(Current_Model, "%s", MessageBuffer+21);
+ sprintf(Current_Revision, "SW%s, HW%s", MessageBuffer+41, MessageBuffer+35);
+#else
+ snprintf(Current_IMEI, GSM_MAX_IMEI_LENGTH, "%s", MessageBuffer+5);
+ snprintf(Current_Model, GSM_MAX_MODEL_LENGTH, "%s", MessageBuffer+21);
+ snprintf(Current_Revision, GSM_MAX_REVISION_LENGTH, "SW%s, HW%s", MessageBuffer+41, MessageBuffer+35);
+#endif
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Mobile phone identification received:\n"));
+ fprintf(stdout, _(" IMEI: %s\n"), Current_IMEI);
+ fprintf(stdout, _(" Model: %s\n"), Current_Model);
+ fprintf(stdout, _(" Production Code: %s\n"), MessageBuffer+27);
+ fprintf(stdout, _(" HW: %s\n"), MessageBuffer+35);
+ fprintf(stdout, _(" Firmware: %s\n"), MessageBuffer+41);
+#endif /* DEBUG */
+
+ break;
+
+ /* Get group data */
+ /* [ID],[name_len],[name].,[ringtone],[graphicon],[lenhi],[lenlo],[bitmap] */
+ case 0x11:
+
+ if (CurrentGetBitmap!=NULL) {
+ if (CurrentGetBitmap->number==MessageBuffer[4]) {
+ count=MessageBuffer[5];
+ memcpy(CurrentGetBitmap->text,MessageBuffer+6,count);
+ CurrentGetBitmap->text[count]=0;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Caller group datas\n"));
+ fprintf(stdout, _("Caller group name: %s\n"),CurrentGetBitmap->text);
+#endif /* DEBUG */
+
+ count+=6;
+
+ CurrentGetBitmap->ringtone=MessageBuffer[count++];
+#ifdef DEBUG
+ fprintf(stdout, _("Caller group ringtone ID: %i"),CurrentGetBitmap->ringtone);
+ if (CurrentGetBitmap->ringtone==16) fprintf(stdout,_(" (default)"));
+ fprintf(stdout,_("\n"));
+#endif /* DEBUG */
+
+ CurrentGetBitmap->enabled=(MessageBuffer[count++]==1);
+#ifdef DEBUG
+ fprintf(stdout, _("Caller group logo "));
+ if (CurrentGetBitmap->enabled)
+ fprintf(stdout, _("enabled \n"));
+ else
+ fprintf(stdout, _("disabled \n"));
+#endif /* DEBUG */
+
+ CurrentGetBitmap->size=MessageBuffer[count++]<<8;
+ CurrentGetBitmap->size+=MessageBuffer[count++];
+#ifdef DEBUG
+ fprintf(stdout, _("Bitmap size=%i\n"),CurrentGetBitmap->size);
+#endif /* DEBUG */
+
+ count++;
+ CurrentGetBitmap->width=MessageBuffer[count++];
+ CurrentGetBitmap->height=MessageBuffer[count++];
+ count++;
+ tmp=GSM_GetBitmapSize(CurrentGetBitmap);
+ if (CurrentGetBitmap->size>tmp) CurrentGetBitmap->size=tmp;
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,CurrentGetBitmap->size);
+ CurrentGetBitmapError=GE_NONE;
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Caller group datas received, but group number does not match (%i is not %i)\n"),MessageBuffer[4],CurrentGetBitmap->number);
+#endif
+ }
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Caller group data received but not requested!\n"));
+#endif
+ }
+ break;
+
+ /* Get group data error */
+ case 0x12:
+
+ CurrentGetBitmapError=GE_UNKNOWN;
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Error attempting to get caller group data.\n"));
+#endif
+ break;
+
+ /* Set group data OK */
+ case 0x14:
+
+ CurrentSetBitmapError=GE_NONE;
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Caller group data set correctly.\n"));
+#endif
+ break;
+
+ /* Set group data error */
+ case 0x15:
+
+ CurrentSetBitmapError=GE_UNKNOWN;
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Error attempting to set caller group data\n"));
+#endif
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x03\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N6110_Dispatch0x05Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int tmp, count, length;
+ bool issupported;
+
+#ifdef DEBUG
+ int i;
+#endif
+
+ switch (MessageBuffer[3]) {
+
+ /* Startup Logo */
+ case 0x17:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Startup Logo, welcome note and dealer welcome note received.\n"));
+#endif
+
+ if (CurrentGetBitmap!=NULL) {
+
+ issupported=false;
+
+ count=5;
+
+ for (tmp=0;tmp<MessageBuffer[4];tmp++){
+ switch (MessageBuffer[count++]) {
+ case 0x01:
+ if (CurrentGetBitmap->type==GSM_StartupLogo) {
+ CurrentGetBitmap->height=MessageBuffer[count++];
+ CurrentGetBitmap->width=MessageBuffer[count++];
+ CurrentGetBitmap->size=GSM_GetBitmapSize(CurrentGetBitmap);
+ length=CurrentGetBitmap->size;
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,length);
+ } else {
+ //bitmap size
+ length=MessageBuffer[count++];
+ length=length*MessageBuffer[count++]/8;
+ }
+ count+=length;
+#ifdef DEBUG
+ fprintf(stdout, _("Startup logo supported - "));
+ if (length!=0) { fprintf(stdout, _("currently set\n")); }
+ else { fprintf(stdout, _("currently empty\n")); }
+#endif
+ if (CurrentGetBitmap->type==GSM_StartupLogo) issupported=true;
+ break;
+ case 0x02:
+ length=MessageBuffer[count];
+ if (CurrentGetBitmap->type==GSM_WelcomeNoteText) {
+ memcpy(CurrentGetBitmap->text,MessageBuffer+count+1,length);
+ CurrentGetBitmap->text[length]=0;
+ }
+#ifdef DEBUG
+ fprintf(stdout, _("Startup Text supported - "));
+ if (length!=0)
+ {
+ fprintf(stdout, _("currently set to \""));
+ for (i=0;i<length;i++) fprintf(stdout, _("%c"),MessageBuffer[count+1+i]);
+ fprintf(stdout, _("\"\n"));
+ } else {
+ fprintf(stdout, _("currently empty\n"));
+ }
+#endif
+ count+=length+1;
+ if (CurrentGetBitmap->type==GSM_WelcomeNoteText) issupported=true;
+ break;
+ case 0x03:
+ length=MessageBuffer[count];
+ if (CurrentGetBitmap->type==GSM_DealerNoteText) {
+ memcpy(CurrentGetBitmap->text,MessageBuffer+count+1,length);
+ CurrentGetBitmap->text[length]=0;
+ }
+#ifdef DEBUG
+ fprintf(stdout, _("Dealer Welcome supported - "));
+ if (length!=0)
+ {
+ fprintf(stdout, _("currently set to \""));
+ for (i=0;i<length;i++) fprintf(stdout, _("%c"),MessageBuffer[count+1+i]);
+ fprintf(stdout, _("\"\n"));
+ } else {
+ fprintf(stdout, _("currently empty\n"));
+ }
+#endif
+ count+=length+1;
+ if (CurrentGetBitmap->type==GSM_DealerNoteText) issupported=true;
+ break;
+ }
+ }
+ if (issupported) CurrentGetBitmapError=GE_NONE;
+ else CurrentGetBitmapError=GE_NOTSUPPORTED;
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Startup logo received but not requested!\n"));
+#endif
+ }
+ break;
+
+ /* Set startup OK */
+ case 0x19:
+
+ CurrentSetBitmapError=GE_NONE;
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Startup logo, welcome note or dealer welcome note correctly set.\n"));
+#endif
+ break;
+
+ /* Set Operator Logo OK */
+ case 0x31:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Operator logo correctly set.\n"));
+#endif
+
+ CurrentSetBitmapError=GE_NONE;
+ break;
+
+ /* Set Operator Logo Error */
+ case 0x32:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Error setting operator logo!\n"));
+#endif
+
+ CurrentSetBitmapError=GE_UNKNOWN;
+ break;
+
+ /* Operator Logo */
+ /* [location],[netcode x 3],[lenhi],[lenlo],[bitmap] */
+ case 0x34:
+
+ if (CurrentGetBitmap!=NULL) {
+
+ count=5; /* Location ignored. */
+
+ DecodeNetworkCode(MessageBuffer+count, CurrentGetBitmap->netcode);
+ count=count+3;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Operator Logo for %s (%s) network received.\n"),
+ CurrentGetBitmap->netcode,
+ GSM_GetNetworkName(CurrentGetBitmap->netcode));
+#endif
+
+ CurrentGetBitmap->size=MessageBuffer[count++]<<8;
+ CurrentGetBitmap->size+=MessageBuffer[count++];
+ count++;
+ CurrentGetBitmap->width=MessageBuffer[count++];
+ CurrentGetBitmap->height=MessageBuffer[count++];
+ count++;
+ tmp=GSM_GetBitmapSize(CurrentGetBitmap);
+ if (CurrentGetBitmap->size>tmp) CurrentGetBitmap->size=tmp;
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,CurrentGetBitmap->size);
+ CurrentGetBitmapError=GE_NONE;
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Operator logo received but not requested!\n"));
+#endif
+ }
+
+ break;
+
+ /* Get op logo error */
+ case 0x35:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Error getting operator logo!\n"));
+#endif
+ CurrentGetBitmapError=GE_UNKNOWN;
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x05\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+
+ break;
+ }
+}
+
+void N6110_Dispatch0x06Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int tmp;
+ unsigned char output[160];
+
+#ifdef DEBUG
+ int i;
+#endif
+
+ switch (MessageBuffer[3]) {
+
+ case 0x05:
+
+ /* MessageBuffer[3] = 0x05
+ MessageBuffer[4] = 0x00
+ MessageBuffer[5] = 0x0f
+ MessageBuffer[6] = 0x03
+ MessageBuffer[7] = length of packed message
+
+ This is all I have seen - Gerry Anderson */
+
+ tmp=GSM_UnpackEightBitsToSeven(0, 82, 82, MessageBuffer+8, output);
+
+#ifdef DEBUG
+
+ fprintf(stdout, _("Message from Network operator: "));
+
+ for (i=0; i<tmp; i++)
+ fprintf(stdout, "%c", DecodeWithDefaultAlphabet(output[i]));
+
+ fprintf(stdout, "\n");
+
+#endif /* DEBUG */
+
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x06\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+
+ break;
+ }
+}
+
+void N6110_Dispatch0x09Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch (MessageBuffer[3]) {
+
+ case 0x80:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SIM card login\n"));
+#endif
+ break;
+
+ case 0x81:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SIM card logout\n"));
+#endif
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type 0x09.\n"));
+#endif
+ AppendLogText("Unknown msg\n",false);
+ break;
+ }
+}
+
+void N6110_Dispatch0x13Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ switch(MessageBuffer[3]) {
+
+ case 0x6a:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Calendar Alarm active\n"));
+ fprintf(stdout, _(" Item number: %d\n"), MessageBuffer[4]);
+#endif /* DEBUG */
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type 0x13.\n"));
+#endif
+ AppendLogText("Unknown msg\n",false);
+ break;
+ }
+}
+
+void N6110_Dispatch0x40Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i;
+
+ switch(MessageBuffer[2]) {
+
+ case 0x02:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: ACK for simlock opening part 1\n"));
+#endif /* DEBUG */
+
+ CurrentMagicError=GE_NONE;
+ break;
+
+ case 0x7c:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Answer for call commands.\n"));
+#endif
+
+ CurrentDialVoiceError=GE_NONE;
+ break;
+
+ case 0x81:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: ACK for simlock opening part 2\n"));
+#endif /* DEBUG */
+
+ CurrentMagicError=GE_NONE;
+ break;
+
+ case 0x82:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: ACK for simlock closing\n"));
+#endif /* DEBUG */
+
+ CurrentMagicError=GE_NONE;
+ break;
+
+ case 0xd4:
+
+ switch (MessageBuffer[5]) {
+ case 0xa0:
+#ifdef DEBUG
+ fprintf(stdout,_("Message: EEPROM contest received\n"));
+#endif
+
+ if (MessageBuffer[8]!=0x00) {
+ for (i=9;i<MessageLength;i++) {
+ fprintf(stdout,_("%c"), MessageBuffer[i]);
+ }
+
+ CurrentMagicError=GE_NONE;
+ }
+
+ break;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type 0x40.\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break;
+
+ case 0xcf:
+
+ N6110_DisplayTestsInfo(MessageBuffer);
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type 0x40.\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N6110_Dispatch0x47Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int count;
+
+ switch(MessageBuffer[3]) {
+
+ case 0x02:
+
+ count=5;
+
+ if (MessageBuffer[5]!=0) {
+ strcpy(CurrentGetBitmap->Sender,GSM_UnpackSemiOctetNumber(MessageBuffer+5,true));
+
+ while (MessageBuffer[count]!=0) {
+ count++;
+ }
+
+ count++;
+ } else {
+ strcpy(CurrentGetBitmap->Sender,"\0");
+
+ count+=3;
+ }
+
+ memcpy(CurrentGetBitmap->text,MessageBuffer+count+1,MessageBuffer[count]);
+ CurrentGetBitmap->text[MessageBuffer[count]]=0;
+
+ if (MessageBuffer[count]!=0)
+ count+=MessageBuffer[count];
+
+ count++;
+
+#ifdef DEBUG
+ fprintf(stdout,_("Picture Image received, text \"%s\", sender %s\n"),CurrentGetBitmap->text,CurrentGetBitmap->Sender);
+#endif
+
+ CurrentGetBitmap->width=MessageBuffer[count+1];
+ CurrentGetBitmap->height=MessageBuffer[count+2];
+ CurrentGetBitmap->size=GSM_GetBitmapSize(CurrentGetBitmap);
+
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count+4,CurrentGetBitmap->size);
+
+ CurrentGetBitmapError=GE_NONE;
+ break;
+
+ case 0x04:
+
+#ifdef DEBUG
+ fprintf(stdout,_("Getting or setting Picture Image - OK\n"));
+#endif
+ CurrentSetBitmapError=GE_NONE;
+ CurrentGetBitmapError=GE_NONE;
+ break;
+
+ case 0x05:
+
+#ifdef DEBUG
+ fprintf(stdout,_("Setting Picture Image - invalid location or other error\n"));
+#endif
+ CurrentSetBitmapError=GE_UNKNOWN;
+ break;
+
+ case 0x06:
+
+#ifdef DEBUG
+ fprintf(stdout,_("Getting Picture Image - invalid location or other error\n"));
+#endif
+ CurrentGetBitmapError=GE_UNKNOWN;
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type 0x47.\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N6110_DispatchACKMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ char buffer[50];
+
+ sprintf(buffer,"Received ACK %02x %02x\n",MessageBuffer[0],MessageBuffer[1]);
+ AppendLog(buffer,strlen(buffer),false);
+
+#ifdef DEBUG
+ fprintf(stdout, _("[Received Ack of type %02x, seq: %2x]\n"), MessageBuffer[0],
+ MessageBuffer[1]);
+#endif /* DEBUG */
+
+ CurrentLinkOK = true;
+}
+
+void N6110_Dispatch0xD0Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: The phone is powered on - seq 1.\n"));
+#endif /* DEBUG */
+
+}
+
+/* This function is used for parsing the RLP frame into fields. */
+void N6110_RX_HandleRLPMessage(u8 *MessageBuffer)
+{
+
+ RLP_F96Frame frame;
+ int count;
+ int valid = true;
+
+ /* We do not need RLP frame parsing to be done when we do not have callback
+ specified. */
+ if (CurrentRLP_RXCallback == NULL)
+ exit;
+
+ /* Anybody know the official meaning of the first two bytes?
+ Nokia 6150 sends junk frames starting D9 01, and real frames starting
+ D9 00. We'd drop the junk frames anyway because the FCS is bad, but
+ it's tidier to do it here. We still need to call the callback function
+ to give it a chance to handle timeouts and/or transmit a frame */
+ if (MessageBuffer[0] == 0xd9 && MessageBuffer[1] == 0x01)
+ valid = false;
+
+ /* Nokia uses 240 bit frame size of RLP frames as per GSM 04.22
+ specification, so Header consists of 16 bits (2 bytes). See section 4.1
+ of the specification. */
+
+ frame.Header[0] = MessageBuffer[2];
+ frame.Header[1] = MessageBuffer[3];
+
+ /* Next 200 bits (25 bytes) contain the Information. We store the
+ information in the Data array. */
+
+ for (count = 0; count < 25; count ++)
+ frame.Data[count] = MessageBuffer[4 + count];
+
+ /* The last 24 bits (3 bytes) contain FCS. */
+
+ frame.FCS[0] = MessageBuffer[29];
+ frame.FCS[1] = MessageBuffer[30];
+ frame.FCS[2] = MessageBuffer[31];
+
+ /* Here we pass the frame down in the input stream. */
+ CurrentRLP_RXCallback(valid ? &frame : NULL);
+}
+
+void N6110_Dispatch0xF4Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: The phone is powered on - seq 2.\n"));
+#endif /* DEBUG */
+
+}
+
+void N6110_ReplyIncomingSMS(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ GSM_SMSMessage NullSMS;
+
+ switch (MessageBuffer[6]) {
+
+ case 0x00: NullSMS.Type = GST_SMS; NullSMS.folder = GST_INBOX; break;
+ case 0x01: NullSMS.Type = GST_DR; NullSMS.folder = GST_INBOX; break;
+
+ /* Is it possible ? */
+ case 0x02: NullSMS.Type = GST_SMS; NullSMS.folder = GST_OUTBOX; break;
+ default: NullSMS.Type = GST_UN; break;
+ }
+
+#ifdef DEBUG
+ if (NullSMS.Type == GST_DR)
+ fprintf(stdout, _("Message: SMS Message (Report) Received\n"));
+ else
+ fprintf(stdout, _("Message: SMS Message Received\n"));
+#endif /* DEBUG */
+
+ GSM_DecodeNokiaSMSFrame(&NullSMS, MessageBuffer+7, MessageLength-7);
+
+#ifdef DEBUG
+ fprintf(stdout, _("\n"));
+#endif /* DEBUG */
+}
+
+void N6110_DispatchMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ bool unknown=false;
+
+ /* Switch on the basis of the message type byte */
+ switch (MessageType) {
+
+ /* Call information */
+ case 0x01:
+
+ N6110_Dispatch0x01Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* SMS handling */
+ case 0x02:
+ switch (MessageBuffer[3]) {
+ case 0x02:
+ case 0x03:N6110_ReplySendSMSMessage(MessageLength,MessageBuffer,MessageType);break;
+ case 0x10:N6110_ReplyIncomingSMS(MessageLength,MessageBuffer,MessageType);break;
+ case 0x21:N6110_ReplySetCellBroadcast(MessageLength, MessageBuffer, MessageType);break;
+ case 0x23:N6110_ReplyReadCellBroadcast(MessageLength, MessageBuffer, MessageType);break;
+ case 0x31:N6110_ReplySetSMSCenter(MessageLength,MessageBuffer,MessageType);break;
+ case 0x34:
+ case 0x35:N6110_ReplyGetSMSCenter(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Phonebook handling */
+ case 0x03:
+ switch (MessageBuffer[3]) {
+ case 0x02:
+ case 0x03:N6110_ReplyGetMemoryLocation(MessageLength,MessageBuffer,MessageType);break;
+ case 0x05:
+ case 0x06:N6110_ReplyWritePhonebookLocation(MessageLength,MessageBuffer,MessageType);break;
+ case 0x08:
+ case 0x09:N6110_ReplyGetMemoryStatus(MessageLength,MessageBuffer,MessageType);break;
+ case 0x17:
+ case 0x18:N6110_ReplyGetSpeedDial(MessageLength,MessageBuffer,MessageType);break;
+ case 0x1a:
+ case 0x1b:N6110_ReplySetSpeedDial(MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x03Message(MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* Phone status */
+ case 0x04:
+ switch (MessageBuffer[3]) {
+ case 0x02:N6110_ReplyRFBatteryLevel(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Startup Logo, Operator Logo and Profiles. */
+ case 0x05:
+ switch (MessageBuffer[3]) {
+ case 0x11:N6110_ReplySetProfile (MessageLength,MessageBuffer,MessageType);break;
+ case 0x14:N6110_ReplyGetProfile (MessageLength,MessageBuffer,MessageType);break;
+ case 0x1b:N6110_ReplyGetProfile (MessageLength,MessageBuffer,MessageType);break;
+ case 0x1d:N6110_ReplySetProfile (MessageLength,MessageBuffer,MessageType);break;
+ case 0x37:N6110_ReplySetRingtone (MessageLength,MessageBuffer,MessageType);break;
+ case 0x38:N6110_ReplySetRingtone (MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x05Message(MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* Network Operator Message to handset -> Gerry Anderson & prepaid info */
+ /* Call diverts */
+ case 0x06:
+ switch (MessageBuffer[3]) {
+ case 0x02:
+ case 0x03:N6110_ReplyCallDivert (MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x06Message(MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* Security code requests */
+ case 0x08:
+ switch (MessageBuffer[3]) {
+ case 0x08:N6110_ReplyGetSecurityCodeStatus(MessageLength,MessageBuffer,MessageType);break;
+ case 0x0b:N6110_ReplyEnterSecurityCode (MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_ReplyEnterSecurityCode (MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* SIM login */
+ case 0x09:
+
+ N6110_Dispatch0x09Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* Network info */
+ case 0x0a:
+ switch (MessageBuffer[3]) {
+ case 0x71:N6110_ReplyGetNetworkInfo(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Simulating key pressing */
+ case 0x0c:
+ switch (MessageBuffer[3]) {
+ case 0x43:N6110_ReplyPressKey(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Display */
+ case 0x0d:
+ switch (MessageBuffer[3]) {
+ case 0x50:N6110_ReplyDisplayOutput (MessageLength,MessageBuffer,MessageType);break;
+ case 0x52:N6110_ReplyGetDisplayStatus(MessageLength,MessageBuffer,MessageType);break;
+ case 0x54:N6110_ReplyDisplayOutput (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Phone Clock and Alarm */
+ case 0x11:
+ switch (MessageBuffer[3]) {
+ case 0x61:N6110_ReplySetDateTime(MessageLength,MessageBuffer,MessageType);break;
+ case 0x63:N6110_ReplyGetDateTime(MessageLength,MessageBuffer,MessageType);break;
+ case 0x6c:N6110_ReplySetAlarm (MessageLength,MessageBuffer,MessageType);break;
+ case 0x6e:N6110_ReplyGetAlarm (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Calendar notes handling */
+ case 0x13:
+ switch (MessageBuffer[3]) {
+ case 0x65:N6110_ReplyWriteCalendarNote (MessageLength,MessageBuffer,MessageType);break;
+ case 0x67:N6110_ReplyGetCalendarNote (MessageLength,MessageBuffer,MessageType);break;
+ case 0x69:N6110_ReplyDeleteCalendarNote(MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x13Message (MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* SMS Messages */
+ case 0x14:
+ switch (MessageBuffer[3]) {
+ case 0x05:
+ case 0x06:N6110_ReplySaveSMSMessage (MessageLength,MessageBuffer,MessageType);break;
+ case 0x08:
+ case 0x09:N6110_ReplyGetSMSMessage (MessageLength,MessageBuffer,MessageType);break;
+ case 0x0b:N6110_ReplyDeleteSMSMessage(MessageLength,MessageBuffer,MessageType);break;
+ case 0x37:
+ case 0x38:N6110_ReplyGetSMSStatus (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* WAP */
+ case 0x3f:
+ switch (MessageBuffer[3]) {
+ case 0x01:
+ case 0x02:N7110_ReplyEnableWAPCommands(MessageLength,MessageBuffer,MessageType);break;
+ case 0x07:
+ case 0x08:N7110_ReplyGetWAPBookmark (MessageLength,MessageBuffer,MessageType);break;
+ case 0x0a:
+ case 0x0b:N7110_ReplySetWAPBookmark (MessageLength,MessageBuffer,MessageType);break;
+ case 0x16:
+ case 0x17:
+ case 0x1c:N7110_ReplyGetWAPSettings (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Internal phone functions? */
+ case 0x40:
+ switch (MessageBuffer[2]) {
+ case 0x64:N6110_ReplyEnableExtendedCommands (MessageLength,MessageBuffer,MessageType);break;
+ case 0x65:N6110_ReplyResetPhoneSettings (MessageLength,MessageBuffer,MessageType);break;
+ case 0x66:N6110_ReplyIMEI (MessageLength,MessageBuffer,MessageType);break;
+ case 0x6a:N6110_ReplyGetProductProfileSetting(MessageLength,MessageBuffer,MessageType);break;
+ case 0x6b:N6110_ReplySetProductProfileSetting(MessageLength,MessageBuffer,MessageType);break;
+ case 0x6e:N6110_ReplyGetSecurityCode (MessageLength,MessageBuffer,MessageType);break;
+ case 0x7e:N6110_ReplyNetmonitor (MessageLength,MessageBuffer,MessageType);break;
+ case 0x8a:N6110_ReplySimlockInfo (MessageLength,MessageBuffer,MessageType);break;
+ case 0x8b:N6110_ReplySetOperatorName (MessageLength,MessageBuffer,MessageType);break;
+ case 0x8c:N6110_ReplyGetOperatorName (MessageLength,MessageBuffer,MessageType);break;
+ case 0x8f:N6110_ReplyPlayTone (MessageLength,MessageBuffer,MessageType);break;
+ case 0x9e:N6110_ReplyGetBinRingtone (MessageLength,MessageBuffer,MessageType);break;
+ case 0xa0:N6110_ReplySetBinRingtone (MessageLength,MessageBuffer,MessageType);break;
+ case 0xc8:N6110_ReplyHW (MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x40Message (MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* Picture Images */
+ case 0x47:
+
+ N6110_Dispatch0x47Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* Mobile phone identification */
+ case 0x64:
+
+ N6110_ReplyGetAuthentication(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /***** Acknowlegment of our frames. *****/
+ case FBUS_FRTYPE_ACK:
+
+ N6110_DispatchACKMessage(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /***** Power on message. *****/
+ case 0xd0:
+
+ N6110_Dispatch0xD0Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ case 0xd2:
+
+ N6110_ReplyID(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /***** RLP frame received. *****/
+ case 0xf1:
+
+ N6110_RX_HandleRLPMessage(MessageBuffer);
+ break;
+
+ /***** Power on message. *****/
+ case 0xf4:
+
+ N6110_Dispatch0xF4Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /***** Unknown message *****/
+ /* If you think that you know the exact meaning of other messages - please
+ let us know. */
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message type.\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg type\n",false);
+
+ unknown=false;
+ break;
+
+ }
+
+ if (unknown) {
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type %02x.\n"),MessageType);
+#endif
+ AppendLogText("Unknown msg\n",false);
+ }
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for accessing functions on the 7110 and similar
+ phones.
+
+*/
+
+/* "Turn on" prototypes in n-7110.h */
+
+#define __n_7110_c
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+#include <time.h>
+
+#ifndef WIN32
+ #include "devices/device.h"
+#endif
+
+#ifdef WIN32
+ #include "misc_win32.h"
+#endif
+
+/* Various header file */
+#ifndef VC6
+ #include "config.h"
+#endif
+
+#include "gsm-api.h"
+#include "gsm-coding.h"
+#include "newmodules/n6110.h"
+#include "newmodules/n7110.h"
+#include "protocol/fbus.h"
+
+/* Global variables used by code in gsm-api.c to expose the functions
+ supported by this model of phone. */
+
+/* Here we initialise model specific functions. */
+
+GSM_Functions N7110_Functions = {
+ N7110_Initialise,
+ N7110_DispatchMessage,
+ NULL_Terminate,
+ NULL_KeepAlive,
+ N7110_GetMemoryLocation,
+ N7110_WritePhonebookLocation,
+ N7110_GetSpeedDial,
+ N7110_SetSpeedDial,
+ N7110_GetMemoryStatus,
+ N7110_GetSMSStatus,
+ N6110_GetSMSCenter,
+ N6110_SetSMSCenter,
+ N7110_GetSMSMessage,
+ N7110_DeleteSMSMessage,
+ N6110_SendSMSMessage,
+ N7110_SaveSMSMessage,
+ N7110_GetRFLevel,
+ N7110_GetBatteryLevel,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ N7110_GetSecurityCode,
+ N6110_GetIMEI,
+ N6110_GetRevision,
+ N6110_GetModel,
+ N7110_GetDateTime,
+ N7110_SetDateTime,
+ N7110_GetAlarm,
+ N7110_SetAlarm,
+ N6110_DialVoice,
+ N6110_DialData,
+ N6110_GetIncomingCallNr,
+ N6110_GetNetworkInfo,
+ N7110_GetCalendarNote,
+ N7110_WriteCalendarNote,
+ N7110_DeleteCalendarNote,
+ N6110_NetMonitor,
+ UNIMPLEMENTED,
+ N7110_GetBitmap,
+ N7110_SetBitmap,
+ N7110_SetRingTone,
+ N7110_SetBinRingTone,
+ N7110_GetBinRingTone,
+ N6110_Reset,
+ N7110_GetProfile,
+ UNIMPLEMENTED,
+ N6110_SendRLPFrame,
+ N6110_CancelCall,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ N6110_EnableCellBroadcast,
+ N6110_DisableCellBroadcast,
+ N6110_ReadCellBroadcast,
+ N6110_PlayTone,
+ N6110_GetProductProfileSetting,
+ N6110_SetProductProfileSetting,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ N7110_GetVoiceMailbox,
+ N6110_Tests,
+ N6110_SimlockInfo,
+ N7110_GetCalendarNotesInfo,
+ N7110_GetSMSFolders,
+ UNIMPLEMENTED,
+ N7110_GetWAPBookmark,
+ N7110_SetWAPBookmark,
+ N7110_GetWAPSettings,
+ N6110_CallDivert,
+ UNIMPLEMENTED,
+ N6110_GetManufacturer
+};
+
+/* Mobile phone information */
+
+GSM_Information N7110_Information = {
+ "6210|6250|7110", /* Supported models in FBUS */
+ "6210|6250|7110", /* Supported models in MBUS */
+ "", /* Supported models in FBUS over infrared */
+ "6210|6250|7110", /* Supported models in FBUS over DLR3 */
+ "",
+ "6210|6250|7110", /* Supported models in FBUS over Irda sockets */
+ "",
+ 5, /* Max RF Level */
+ 0, /* Min RF Level */
+ GRF_Arbitrary, /* RF level units */
+ 5, /* Max Battery Level */
+ 0, /* Min Battery Level */
+ GBU_Arbitrary, /* Battery level units */
+ GDT_DateTime, /* Have date/time support */
+ GDT_TimeOnly, /* Alarm supports time only */
+ 1 /* Only one alarm available */
+};
+
+const char *N7110_MemoryType_String [] = {
+ "", /* 0x00 */
+ "DC", /* 0x01 */
+ "MC", /* 0x02 */
+ "RC", /* 0x03 */
+ "FD", /* 0x04 */
+ "ME", /* 0x05 */
+ "SM", /* 0x06 */
+ "ON", /* 0x07 */
+ "EN", /* 0x08 */
+ "MT", /* 0x09 */
+};
+
+int PictureImageNum; //required during reading Picture Images
+int PictureImageIndex;
+int PictureImageLoc;
+
+void N7110_ReplyEnableIncomingSMSInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ switch (MessageBuffer[3]) {
+ case 0x0e:
+#ifdef DEBUG
+ fprintf(stdout,_("Message: Enabled info for incoming SMS\n"));
+#endif /* DEBUG */
+
+ CurrentMagicError=GE_NONE;
+ break;
+ case 0x0f:
+#ifdef DEBUG
+ fprintf(stdout,_("Message: error enabling for incoming SMS\n"));
+ switch (MessageBuffer[4]) {
+ case 0x0c:fprintf(stdout,_(" No PIN\n"));break;
+ default :fprintf(stdout,_(" unknown\n"));break;
+ }
+#endif /* DEBUG */
+
+ CurrentMagicError=GE_UNKNOWN;
+ break;
+ }
+}
+
+GSM_Error N7110_EnableIncomingSMSInfo ()
+{
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x0d, 0x00, 0x00, 0x02};
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMagicError, 8, 0x02, req);
+}
+
+/* Initialise variables and state machine. */
+GSM_Error N7110_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+
+ unsigned char init_char = N6110_SYNC_BYTE;
+ int count;
+ int InitLength;
+
+ if (Protocol->Initialise(port_device,initlength,connection,rlp_callback)!=GE_NONE)
+ {
+ return GE_NOTSUPPORTED;
+ }
+
+ if (connection!=GCT_MBUS && connection!=GCT_Irda) {
+
+ InitLength = atoi(initlength);
+
+ if ((strcmp(initlength, "default") == 0) || (InitLength == 0)) {
+ InitLength = 250; /* This is the usual value, lower may work. */
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("Writing init chars...."));
+#endif
+
+ /* Initialise link with phone or what have you */
+ /* Send init string to phone, this is a bunch of 0x55 characters. Timing is
+ empirical. */
+ for (count = 0; count < InitLength; count ++) {
+ usleep(100);
+ Protocol->WritePhone(1,&init_char);
+ }
+
+#ifdef DEBUG
+ fprintf(stdout,_("Done\n"));
+#endif
+
+ N6110_SendStatusRequest();
+
+ }
+
+ usleep(100);
+
+ if (N6110_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (N6110_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (N6110_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;
+
+// N7110_EnableIncomingSMSInfo();
+
+ if (connection==GCT_MBUS || connection==GCT_Irda) {
+ /* In MBUS doesn't have any init strings, etc. Phone answered with frame,
+ so connection should be enabled ;-) */
+ /* Similiar for Irda */
+ CurrentLinkOK = true;
+ }
+
+ CurrentSMSFoldersCount=1000;
+
+ return (GE_NONE);
+}
+
+/* This function translates GMT_MemoryType to N7110_MEMORY_xx */
+int N7110_GetMemoryType(GSM_MemoryType memory_type)
+{
+
+ int result;
+
+ switch (memory_type) {
+
+// case GMT_MT:
+// result = N7110_MEMORY_MT;
+// break;
+
+ case GMT_ME: result = N7110_MEMORY_ME; break;
+ case GMT_SM: result = N7110_MEMORY_SM; break;
+ case GMT_FD: result = N7110_MEMORY_FD; break;
+ case GMT_ON: result = N7110_MEMORY_ON; break;
+ case GMT_EN: result = N7110_MEMORY_EN; break;
+ case GMT_DC: result = N7110_MEMORY_DC; break;
+ case GMT_RC: result = N7110_MEMORY_RC; break;
+ case GMT_MC: result = N7110_MEMORY_MC; break;
+ case GMT_CG: result = N7110_MEMORY_CG; break;
+ default : result = N6110_MEMORY_XX;
+ }
+
+ return (result);
+}
+
+GSM_Error N7110_GetVoiceMailbox ( GSM_PhonebookEntry *entry)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
+ 0x02, //memory type
+ 0x05,
+ 0x00, 0x00, //location
+ 0x00, 0x00};
+
+ CurrentPhonebookEntry = entry;
+
+ req[9] = N7110_MEMORY_VM;
+ req[10] = (1>>8);
+ req[11] = 1 & 0xff;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, 14, 0x03, req);
+}
+
+void N7110_ReplyEnableWAPCommands(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ switch(MessageBuffer[3]) {
+
+ case 0x01:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP functions enabled\n"));
+#endif /* DEBUG */
+ CurrentGetWAPBookmarkError=GE_NONE;
+ break;
+
+ case 0x02:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP functions enabled\n"));
+#endif /* DEBUG */
+ CurrentGetWAPBookmarkError=GE_NONE;
+ break;
+
+ }
+}
+
+/* To enable WAP frames in phone */
+GSM_Error N7110_EnableWAPCommands ()
+{
+ unsigned char req0[] = { N6110_FRAME_HEADER, 0x00 };
+
+ return NULL_SendMessageSequence
+ (50, &CurrentGetWAPBookmarkError, 4, 0x3f, req0);
+}
+
+void N7110_ReplyGetWAPBookmark(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int tmp;
+
+ switch(MessageBuffer[3]) {
+
+ case 0x07:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP bookmark received OK\n"));
+#endif /* DEBUG */
+
+ DecodeUnicode(WAPBookmark->title, MessageBuffer + 7, MessageBuffer[6] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Title: \"%s\"\n"),WAPBookmark->title);
+#endif /* DEBUG */
+
+ tmp=MessageBuffer[6]*2+7;
+
+ DecodeUnicode(WAPBookmark->address, MessageBuffer + tmp+1, MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Address: \"%s\"\n"),WAPBookmark->address);
+#endif /* DEBUG */
+
+ CurrentGetWAPBookmarkError=GE_NONE;
+ break;
+
+ case 0x08:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP bookmark receiving error\n"));
+ switch (MessageBuffer[4]) {
+ case 0x01:fprintf(stdout, _(" Inside Bookmarks menu. Must leave it\n"));break;
+ case 0x02:fprintf(stdout, _(" Invalid or empty location\n"));break;
+ default :fprintf(stdout, _(" Unknown error. Please report it\n"));
+ }
+#endif /* DEBUG */
+
+ switch (MessageBuffer[4]) {
+ case 0x01:CurrentGetWAPBookmarkError=GE_INSIDEBOOKMARKSMENU;break;
+ case 0x02:CurrentGetWAPBookmarkError=GE_INVALIDBOOKMARKLOCATION;break;
+ default:CurrentGetWAPBookmarkError=GE_UNKNOWN;
+ }
+
+ break;
+ }
+}
+
+GSM_Error N7110_GetWAPBookmark (GSM_WAPBookmark *bookmark)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x06, 0x00, 0x00};
+
+ GSM_Error error;
+
+ /* We have to enable WAP frames in phone */
+ error=N7110_EnableWAPCommands ();
+ if (error!=GE_NONE) return error;
+
+ req[2]=0x00;
+ req[5]=bookmark->location-1;
+
+ WAPBookmark=bookmark;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentGetWAPBookmarkError, 6, 0x3f, req);
+}
+
+void N7110_ReplySetWAPBookmark(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ switch(MessageBuffer[3]) {
+
+ case 0x0a:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP bookmark set OK\n"));
+#endif /* DEBUG */
+
+ CurrentSetWAPBookmarkError=GE_NONE;
+ break;
+
+ case 0x0b:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Error setting WAP bookmark\n"));
+#endif /* DEBUG */
+
+ CurrentSetWAPBookmarkError=GE_UNKNOWN;
+ break;
+ }
+}
+
+GSM_Error N7110_SetWAPBookmark (GSM_WAPBookmark *bookmark)
+{
+ unsigned char req[64] = { N6110_FRAME_HEADER, 0x09 };
+ GSM_Error error;
+ int count;
+
+ /* We have to enable WAP frames in phone */
+ error = N7110_EnableWAPCommands ();
+ if (error != GE_NONE)
+ return error;
+
+ count = 4;
+ req[count++] = (bookmark->location & 0xff00) >> 8;
+ req[count++] = (bookmark->location & 0x00ff);
+
+ req[count++] = strlen(bookmark->title);
+ EncodeUnicode (req+count,bookmark->title ,strlen(bookmark->title));
+ count=count+2*strlen(bookmark->title);
+
+ req[count++] = strlen(bookmark->address);
+ EncodeUnicode (req+count,bookmark->address ,strlen(bookmark->address));
+ count=count+2*strlen(bookmark->address);
+
+ /* ??? */
+ req[count++] = 0x01; req[count++] = 0x80; req[count++] = 0x00;
+ req[count++] = 0x00; req[count++] = 0x00; req[count++] = 0x00;
+ req[count++] = 0x00; req[count++] = 0x00; req[count++] = 0x00;
+
+ WAPBookmark = bookmark;
+
+ return NULL_SendMessageSequence(50, &CurrentSetWAPBookmarkError,
+ count, 0x3f, req);
+}
+
+void N7110_ReplyGetWAPSettings(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int tmp;
+
+ switch(MessageBuffer[3]) {
+
+ case 0x16:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP settings received OK\n"));
+#endif /* DEBUG */
+
+ DecodeUnicode(WAPSettings->title, MessageBuffer + 5, MessageBuffer[4] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Title: \"%s\"\n"),WAPSettings->title);
+#endif /* DEBUG */
+
+ tmp=5+MessageBuffer[4]*2;
+
+ DecodeUnicode(WAPSettings->homepage, MessageBuffer + tmp+1, MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Homepage: \"%s\"\n"),WAPSettings->homepage);
+#endif /* DEBUG */
+
+ tmp=tmp+MessageBuffer[tmp]*2+1;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Connection type: "));
+ switch (MessageBuffer[tmp]) {
+ case 0x00: fprintf(stdout,_("temporary"));break;
+ case 0x01: fprintf(stdout,_("continuous"));break;
+ default: fprintf(stdout,_("unknown"));
+ }
+ fprintf(stdout, _("\n"));
+
+ fprintf(stdout, _(" Connection security: "));
+ switch (MessageBuffer[tmp+13]) {
+ case 0x00: fprintf(stdout,_("off"));break;
+ case 0x01: fprintf(stdout,_("on"));break;
+ default: fprintf(stdout,_("unknown"));
+ }
+ fprintf(stdout, _("\n"));
+
+#endif /* DEBUG */
+
+ switch (MessageBuffer[tmp]) {
+ case 0x00: WAPSettings->iscontinuous=false;break;
+ case 0x01: WAPSettings->iscontinuous=true;break;
+ }
+ switch (MessageBuffer[tmp+13]) {
+ case 0x00: WAPSettings->issecurity=false;break;
+ case 0x01: WAPSettings->issecurity=true;break;
+ }
+
+ WAPSettings->location=MessageBuffer[tmp+7];//location for second part
+
+ CurrentGetWAPSettingsError=GE_NONE;
+ break;
+
+ case 0x17:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP settings receiving error\n"));
+ switch (MessageBuffer[4]) {
+ case 0x01:fprintf(stdout, _(" Inside Settings menu. Must leave it\n"));break;
+ case 0x02:fprintf(stdout, _(" Invalid or empty location\n"));break;
+ default :fprintf(stdout, _(" Unknown error. Please report it\n"));
+ }
+#endif /* DEBUG */
+
+ switch (MessageBuffer[4]) {
+ case 0x01:CurrentGetWAPSettingsError=GE_INSIDESETTINGSMENU;break;
+ case 0x02:CurrentGetWAPSettingsError=GE_INVALIDSETTINGSLOCATION;break;
+ default :CurrentGetWAPSettingsError=GE_UNKNOWN;
+ }
+
+ break;
+
+ case 0x1c:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: WAP settings received OK\n"));
+#endif /* DEBUG */
+
+ switch (MessageBuffer[5]) {
+ case 0x00:
+
+ WAPSettings->bearer=WAPSETTINGS_BEARER_SMS;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Settings for SMS bearer:\n"));
+#endif /* DEBUG */
+
+ tmp=6;
+
+ DecodeUnicode(WAPSettings->service, MessageBuffer + tmp+1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Service number: \"%s\"\n"),WAPSettings->service);
+#endif /* DEBUG */
+
+ tmp=tmp+MessageBuffer[tmp]*2+1;
+
+ DecodeUnicode(WAPSettings->server, MessageBuffer + tmp+ 1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Server number: \"%s\"\n"),WAPSettings->server);
+#endif /* DEBUG */
+
+ break;
+
+ case 0x01:
+
+ WAPSettings->bearer=WAPSETTINGS_BEARER_DATA;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Settings for data bearer:\n"));
+#endif /* DEBUG */
+
+ tmp=10;
+
+ DecodeUnicode(WAPSettings->ipaddress, MessageBuffer + tmp+ 1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" IP address: \"%s\"\n"),WAPSettings->ipaddress);
+#endif /* DEBUG */
+
+ tmp=tmp+MessageBuffer[tmp]*2+1;
+
+ DecodeUnicode(WAPSettings->dialup, MessageBuffer + tmp+1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Dial-up number: \"%s\"\n"),WAPSettings->dialup);
+#endif /* DEBUG */
+
+ tmp=tmp+MessageBuffer[tmp]*2+1;
+
+ DecodeUnicode(WAPSettings->user, MessageBuffer + tmp+1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" User name: \"%s\"\n"),WAPSettings->user);
+#endif /* DEBUG */
+
+ tmp=tmp+MessageBuffer[tmp]*2+1;
+
+ DecodeUnicode(WAPSettings->password, MessageBuffer + tmp+1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Password: \"%s\"\n"),WAPSettings->password);
+#endif /* DEBUG */
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Authentication type: "));
+ switch (MessageBuffer[6]) {
+ case 0x00: fprintf(stdout,_("normal"));break;
+ case 0x01: fprintf(stdout,_("secure"));break;
+ default: fprintf(stdout,_("unknown"));break;
+ }
+ fprintf(stdout, _("\n"));
+
+ fprintf(stdout, _(" Data call type: "));
+ switch (MessageBuffer[7]) {
+ case 0x00: fprintf(stdout,_("analogue"));break;
+ case 0x01: fprintf(stdout,_("IDSN"));break;
+ default: fprintf(stdout,_("unknown"));break;
+ }
+ fprintf(stdout, _("\n"));
+
+ fprintf(stdout, _(" Data call speed: "));
+ switch (MessageBuffer[9]) {
+ case 0x01: fprintf(stdout,_("9600"));break;
+ case 0x02: fprintf(stdout,_("14400"));break;
+ default: fprintf(stdout,_("unknown"));break;
+ }
+ fprintf(stdout, _("\n"));
+
+#endif /* DEBUG */
+
+ switch (MessageBuffer[6]) {
+ case 0x00: WAPSettings->isnormalauthentication=true;break;
+ case 0x01: WAPSettings->isnormalauthentication=false;break;
+ }
+ switch (MessageBuffer[7]) {
+ case 0x00: WAPSettings->isISDNcall=false;break;
+ case 0x01: WAPSettings->isISDNcall=true;break;
+ }
+ switch (MessageBuffer[9]) {
+ case 0x01: WAPSettings->isspeed14400=false;break;
+ case 0x02: WAPSettings->isspeed14400=true;break;
+ }
+
+ break;
+
+ case 0x02:
+
+ WAPSettings->bearer=WAPSETTINGS_BEARER_USSD;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Settings for USSD bearer:\n"));
+#endif /* DEBUG */
+
+ tmp=7;
+
+ DecodeUnicode(WAPSettings->service, MessageBuffer + tmp+1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ if (MessageBuffer[6]==0x01)
+ fprintf(stdout, _(" Service number: \"%s\"\n"),WAPSettings->service);
+ else
+ fprintf(stdout, _(" IP address: \"%s\"\n"),WAPSettings->service);
+#endif /* DEBUG */
+
+ WAPSettings->isIP=true;
+ if (MessageBuffer[6]==0x01) WAPSettings->isIP=false;
+
+ tmp=tmp+MessageBuffer[tmp]*2+1;
+
+ DecodeUnicode(WAPSettings->code, MessageBuffer + tmp+1,
+ MessageBuffer[tmp] );
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Service code: \"%s\"\n"),WAPSettings->code);
+#endif /* DEBUG */
+
+ }
+
+ CurrentGetWAPSettingsError=GE_NONE;
+ break;
+ }
+}
+
+GSM_Error N7110_GetWAPSettings (GSM_WAPSettings *settings)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x15, 0x00};
+ unsigned char req2[] = { N6110_FRAME_HEADER, 0x1b, 0x00};
+
+ GSM_Error error;
+
+ /* We have to enable WAP frames in phone */
+ error=N7110_EnableWAPCommands ();
+ if (error!=GE_NONE) return error;
+
+ req[2]=0x00;
+ req[4]=settings->location-1;
+
+ WAPSettings=settings;
+
+ error=NULL_SendMessageSequence
+ (50, &CurrentGetWAPSettingsError, 6, 0x3f, req);
+ if (error!=GE_NONE) return error;
+
+ req2[2]=0x00;
+
+ req2[4]=settings->location;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentGetWAPSettingsError, 6, 0x3f, req2);
+}
+
+void N7110_ReplyGetMemoryStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Memory status received:\n"));
+#endif
+
+ if (CurrentMemoryStatus && CurrentMemoryStatusError == GE_BUSY) {
+ /* first Loc. (MessageBuffer[10]<<8) + MessageBuffer[11]; */
+ CurrentMemoryStatus->Free = (MessageBuffer[14]<<8) + MessageBuffer[15];
+ CurrentMemoryStatus->Used = (MessageBuffer[16]<<8) + MessageBuffer[17];
+ CurrentMemoryStatus->Free -= CurrentMemoryStatus->Used;
+
+ CurrentMemoryStatusError = GE_NONE;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Memory Type: %s\n"), N7110_MemoryType_String[MessageBuffer[5]]);
+ fprintf(stdout, _(" Used: %d\n"), CurrentMemoryStatus->Used);
+ fprintf(stdout, _(" Free: %d\n"), CurrentMemoryStatus->Free);
+#endif /* DEBUG */
+ }
+}
+
+/* This function is used to get storage status from the phone. It currently
+ supports two different memory areas - internal and SIM. */
+GSM_Error N7110_GetMemoryStatus(GSM_MemoryStatus *Status)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x03, /* MemoryStatus request */
+ 0x02,
+ 0x05 /* MemoryType */
+ };
+
+ switch (Status->MemoryType) {
+
+ case GMT_ME:
+ case GMT_SM:
+ CurrentMemoryStatus = Status;
+
+ req[5] = N7110_GetMemoryType(Status->MemoryType);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentMemoryStatusError, 6, 0x03, req);
+ break;
+
+ case GMT_DC:
+ case GMT_RC:
+ case GMT_MC:
+ Status->Free = 0;
+ Status->Used = 20;
+ return GE_NONE;
+
+ default:
+ return GE_NOTSUPPORTED;
+ }
+}
+
+void N7110_ReplyGetProfile(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ switch(MessageBuffer[3]) {
+
+ case 0x02:
+
+#ifdef DEBUG
+ fprintf(stdout,_("Profile feature %02x received\n"),MessageBuffer[6]);
+#endif /* DEBUG */
+
+ switch (MessageBuffer[6]) {
+ case 0xff: /* Profile Name */
+ DecodeUnicode (CurrentProfile->Name, MessageBuffer+10, MessageBuffer[9]);
+#ifdef DEBUG
+ fprintf(stdout,_(" Name \"%s\"\n"),CurrentProfile->Name);
+#endif /* DEBUG */
+
+ break;
+
+ case 0x00: /* Keypad tone (Off, Level 1 ... Level 3) */
+ switch( MessageBuffer[10] ) {
+ case 0:
+ CurrentProfile->KeypadTone = PROFILE_KEYPAD_OFF; break;
+ case 1:
+ case 2:
+ case 3:
+ CurrentProfile->KeypadTone = MessageBuffer[10]-1; break;
+ }
+ break;
+
+ case 0x02: /* Call Alert type (Ringing, Ascending, ..., Off) */
+ /* I make it compatible with GetProfileCallAlertString */
+ switch( MessageBuffer[10] ) {
+ case 0: CurrentProfile->CallAlert = PROFILE_CALLALERT_RINGING; break;
+ case 1: CurrentProfile->CallAlert = PROFILE_CALLALERT_ASCENDING; break;
+ case 2: CurrentProfile->CallAlert = PROFILE_CALLALERT_RINGONCE; break;
+ case 3: CurrentProfile->CallAlert = PROFILE_CALLALERT_BEEPONCE; break;
+ case 5: CurrentProfile->CallAlert = PROFILE_CALLALERT_OFF; break;
+ }
+ break;
+ case 0x03: /* Ringtone number */
+ CurrentProfile->Ringtone = MessageBuffer[10];
+ break;
+ case 0x04: /* Ringtone volume (from level 1 to level 5) */
+ CurrentProfile->Volume = MessageBuffer[10] + 6;
+ break;
+ case 0x05: /* MessageTone Type (Off,Standard,...,Ascending) */
+ CurrentProfile->MessageTone = MessageBuffer[10];
+ break;
+ case 0x06: /* Vibration (On/Off) */
+ CurrentProfile->Vibration = MessageBuffer[10];
+ break;
+ case 0x07: /* WarningTone (On/Off) */
+ switch( MessageBuffer[10] ) {
+ case 0:
+ CurrentProfile->WarningTone = PROFILE_WARNING_OFF; break;
+ case 1:
+ CurrentProfile->WarningTone = PROFILE_WARNING_ON; break;
+ }
+ break;
+ case 0x08: /* Alert for (caller groups) */
+ CurrentProfile->CallerGroups = MessageBuffer[10];
+ break;
+ case 0x09: /* Auto Answer for Handsfree and Headset (On/Off) */
+ CurrentProfile->AutomaticAnswer = MessageBuffer[10];
+ break;
+ }
+
+ CurrentProfileError=GE_NONE;
+ break;
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x39\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+
+ }
+}
+
+GSM_Error N7110_GetProfile(GSM_Profile *Profile)
+{
+ int i;
+
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x01, 0x01, 0x01, 0x01,
+ 0x00, //profile number
+ 0xff}; //feature. Here 0xff=name
+
+ unsigned char req2[11] = {0x03,0x04,0x05,0x06,0x07,0x08,0x0a,0x22,
+ 0x00,0x02,0x09 };
+
+ GSM_Error error;
+
+ CurrentProfile = Profile;
+
+ /* When after sending all frames feature==253, it means, that it is not
+ supported */
+ CurrentProfile->KeypadTone=253;
+ CurrentProfile->Lights=253;
+ CurrentProfile->CallAlert=253;
+ CurrentProfile->Ringtone=253;
+ CurrentProfile->Volume=253;
+ CurrentProfile->MessageTone=253;
+ CurrentProfile->WarningTone=253;
+ CurrentProfile->Vibration=253;
+ CurrentProfile->CallerGroups=253;
+ CurrentProfile->ScreenSaver=253;
+ CurrentProfile->AutomaticAnswer=253;
+
+ req[7] = Profile->Number+1;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentProfileError, 9, 0x39, req);
+ if (error!=GE_NONE) return error;
+
+ for (i = 0; i < 11; i++) {
+
+ req[7] = Profile->Number+1;
+
+ req[8] = req2[i];
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentProfileError, 9, 0x39, req);
+ if (error!=GE_NONE) return error;
+ }
+
+ return (GE_NONE);
+}
+
+void N7110_ReplyGetCalendarNotesInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int i;
+
+ CurrentCalendarNotesInfo.HowMany = MessageBuffer[4]*256+MessageBuffer[5];
+ CurrentCalendarNotesInfo2->HowMany = CurrentCalendarNotesInfo.HowMany;
+
+ for(i=0;i<CurrentCalendarNotesInfo.HowMany && i<MAX_NOTES_INFO_ELEMS;i++) {
+ CurrentCalendarNotesInfo.Location[i] = MessageBuffer[8+i*2]*256+ MessageBuffer[8+i*2+1];
+ CurrentCalendarNotesInfo2->Location[i]=CurrentCalendarNotesInfo.Location[i];
+ }
+
+ CurrentCalendarNotesInfoError=GE_NONE;
+}
+
+GSM_Error N7110_GetCalendarNotesInfo(GSM_NotesInfo *NotesInfo)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x3a, /* get notes info */
+ 0xFF, 0xFE //fixed
+ };
+ GSM_Error error;
+
+ CurrentCalendarNotesInfo2=NotesInfo;
+
+ error=NULL_SendMessageSequence(50, &CurrentCalendarNotesInfoError, 6, 0x13, req);
+
+ return error;
+}
+
+void P7110_GetNoteAlarm(int alarmdiff, GSM_DateTime *time, GSM_DateTime *alarm, int alarm2)
+{
+ time_t t_alarm;
+ struct tm tm_time;
+ struct tm *tm_alarm;
+
+#ifdef DEBUG
+ if (alarmdiff == 0xffff) fprintf(stdout," No alarm");
+ else fprintf(stdout," Alarm is %i seconds before date", alarmdiff*alarm2);
+ fprintf(stdout,"\n");
+#endif
+
+ if (alarmdiff != 0xffff) {
+
+ memset(&tm_time, 0, sizeof(tm_time));
+ tm_time.tm_year = time->Year - 1900;
+ tm_time.tm_mon = time->Month - 1;
+ tm_time.tm_mday = time->Day;
+ tm_time.tm_hour = time->Hour;
+ tm_time.tm_min = time->Minute;
+ tm_time.tm_sec = time->Second;
+
+ tzset();
+ t_alarm = mktime(&tm_time);
+ t_alarm -= alarmdiff*alarm2;
+
+ tm_alarm = localtime(&t_alarm);
+
+ alarm->Year = tm_alarm->tm_year + 1900;
+ alarm->Month = tm_alarm->tm_mon + 1;
+ alarm->Day = tm_alarm->tm_mday;
+ alarm->Hour = tm_alarm->tm_hour;
+ alarm->Minute = tm_alarm->tm_min;
+ alarm->Second = tm_alarm->tm_sec;
+
+#ifdef DEBUG
+ fprintf(stdout, " Alarm: %02i-%02i-%04i %02i:%02i:%02i\n",
+ alarm->Day,alarm->Month,alarm->Year,
+ alarm->Hour,alarm->Minute,alarm->Second);
+#endif
+ }
+}
+
+void P7110_GetNoteTimes(unsigned char *block, GSM_CalendarNote *c)
+{
+ time_t alarmdiff;
+
+ c->Time.Year = block[8]*256+block[9];
+ c->Time.Month = block[10];
+ c->Time.Day = block[11];
+ if (c->Type != GCN_REMINDER) {
+ c->Time.Hour = block[12];
+ c->Time.Minute = block[13];
+ } else {
+ c->Time.Hour = 0;
+ c->Time.Minute = 0;
+ }
+ c->Time.Second = 0;
+
+#ifdef DEBUG
+ fprintf(stdout, " Date: %02i-%02i-%04i %02i:%02i:%02i\n",
+ c->Time.Day,c->Time.Month,c->Time.Year,
+ c->Time.Hour,c->Time.Minute,c->Time.Second);
+#endif
+
+ if (c->Type != GCN_REMINDER) {
+ alarmdiff = block[14]*256 + block[15];
+ P7110_GetNoteAlarm(alarmdiff, &(c->Time), &(c->Alarm), 60);
+
+ c->Recurrance = block[16]*256 + block[17];
+ DecodeUnicode(c->Text, block+20, block[18]);
+ } else {
+ c->Recurrance = block[12]*256 + block[13];
+ DecodeUnicode(c->Text, block+16, block[14]);
+ }
+
+ /* 0xffff -> 1 Year (8760 hours) */
+ if (c->Recurrance == 0xffff) c->Recurrance=8760;
+
+#ifdef DEBUG
+ fprintf(stdout, " Recurrance: %i hours\n Text: \"%s\"\n",
+ c->Recurrance,c->Text);
+#endif
+}
+
+void N7110_ReplyGetCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int alarm;
+
+ CurrentCalendarNote->YearOfBirth=0; //for other than birthday
+ CurrentCalendarNote->AlarmType=0x00;//for other than birthday
+ CurrentCalendarNote->Phone[0]=0; //for other than call
+
+ CurrentCalendarNote->Alarm.Year = 0;
+ CurrentCalendarNote->Alarm.Month = 0;
+ CurrentCalendarNote->Alarm.Day = 0;
+ CurrentCalendarNote->Alarm.Hour = 0;
+ CurrentCalendarNote->Alarm.Minute = 0;
+ CurrentCalendarNote->Alarm.Second = 0;
+
+#ifdef DEBUG
+ fprintf(stdout, "Message: calendar note received\n");
+#endif
+
+ switch (MessageBuffer[6]) /* entry type */ {
+ case 0x01: /* Meeting */
+#ifdef DEBUG
+ fprintf(stdout, " Note type: meeting\n");
+#endif
+ CurrentCalendarNote->Type = GCN_MEETING;
+ P7110_GetNoteTimes(MessageBuffer, CurrentCalendarNote);
+ CurrentCalendarNoteError=GE_NONE;
+ break;
+
+ case 0x02: /* Call */
+#ifdef DEBUG
+ fprintf(stdout, " Note type: call\n");
+#endif
+ CurrentCalendarNote->Type = GCN_CALL;
+ P7110_GetNoteTimes(MessageBuffer, CurrentCalendarNote);
+ DecodeUnicode(CurrentCalendarNote->Phone,
+ MessageBuffer + 20 + MessageBuffer[18] * 2, MessageBuffer[19]);
+#ifdef DEBUG
+ fprintf(stdout, " Phone number: \"%s\"\n",CurrentCalendarNote->Phone);
+#endif
+ CurrentCalendarNoteError=GE_NONE;
+ break;
+
+ case 0x04: /* Birthday */
+#ifdef DEBUG
+ fprintf(stdout, " Note type: birthday\n");
+#endif
+ CurrentCalendarNote->Type = GCN_BIRTHDAY;
+
+ alarm = ((unsigned int)MessageBuffer[14]) << 24;
+ alarm += ((unsigned int)MessageBuffer[15]) << 16;
+ alarm += ((unsigned int)MessageBuffer[16]) << 8;
+ alarm += MessageBuffer[17];
+
+ /* CurrentCalendarNote->Time.Year is set earlier */
+ CurrentCalendarNote->Time.Month = MessageBuffer[10];
+ CurrentCalendarNote->Time.Day = MessageBuffer[11];
+ CurrentCalendarNote->Time.Hour = 23;
+ CurrentCalendarNote->Time.Minute = 59;
+ CurrentCalendarNote->Time.Second = 58;
+ P7110_GetNoteAlarm(alarm, &(CurrentCalendarNote->Time), &(CurrentCalendarNote->Alarm) ,1);
+
+ CurrentCalendarNote->YearOfBirth = MessageBuffer[18]*256 + MessageBuffer[19];
+ CurrentCalendarNote->Time.Year = CurrentCalendarNote->YearOfBirth;
+
+ CurrentCalendarNote->AlarmType = MessageBuffer[20];
+
+#ifdef DEBUG
+ fprintf(stdout,_(" Alarm type: %s\n"),
+ (CurrentCalendarNote->AlarmType==0x00) ? "Tone " : "Silent");
+
+ fprintf(stdout, " Birthday date: %02i-%02i-%04i (age %d)\n",CurrentCalendarNote->Time.Day,
+ CurrentCalendarNote->Time.Month,CurrentCalendarNote->Time.Year,
+ CurrentCalendarNote->Alarm.Year - CurrentCalendarNote->Time.Year);
+#endif
+
+ DecodeUnicode( CurrentCalendarNote->Text,MessageBuffer+22,MessageBuffer[21]);
+#ifdef DEBUG
+ fprintf(stdout, " Text: \"%s\"\n",CurrentCalendarNote->Text);
+#endif
+
+ CurrentCalendarNote->Recurrance = 0;
+ CurrentCalendarNoteError=GE_NONE;
+ break;
+
+ case 0x08: /* Reminder */
+#ifdef DEBUG
+ fprintf(stdout, " Note type: reminder\n");
+#endif
+ CurrentCalendarNote->Type = GCN_REMINDER;
+ P7110_GetNoteTimes(MessageBuffer, CurrentCalendarNote);
+ CurrentCalendarNoteError=GE_NONE;
+ break;
+
+ default: /* unknown */
+#ifdef DEBUG
+ fprintf(stdout, " Note type: UNKNOWN\n");
+#endif
+ break;
+ }
+}
+
+GSM_Error N7110_GetCalendarNote(GSM_CalendarNote *CalendarNote)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x19, /* get calendar note */
+ 0x00, 0x00 //location
+ };
+
+ GSM_Error error;
+ GSM_DateTime date_time;
+ struct tm *now;
+ time_t nowh;
+
+ if (CalendarNote->ReadNotesInfo || CurrentCalendarNotesInfo.HowMany==2000) {
+ error=N7110_GetCalendarNotesInfo(&CurrentCalendarNotesInfo);
+ if (error!=GE_NONE) return error;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout, _("Calendar Notes Location Logical = %d.\n"),
+ CalendarNote->Location);
+ fprintf(stdout, _("Calendar Notes Location Phisical = %d.\n"),
+ CurrentCalendarNotesInfo.Location[CalendarNote->Location-1]);
+#endif
+
+ /* this is for making xgnokii work.. */
+ if (CalendarNote->Location > CurrentCalendarNotesInfo.HowMany )
+ return GE_INVALIDCALNOTELOCATION;
+
+ req[4] = CurrentCalendarNotesInfo.Location[CalendarNote->Location-1]>>8;
+ req[5] = CurrentCalendarNotesInfo.Location[CalendarNote->Location-1]&0xff;
+ CurrentCalendarNote = CalendarNote;
+
+ /* We have to get current year. It's NOT written in frame for Birthday */
+ error=N7110_GetDateTime(&date_time);
+ if (error!=GE_NONE) return error;
+ if (!date_time.IsSet) {
+ nowh=time(NULL);
+ now=localtime(&nowh);
+
+ /* I have 100 (for 2000) Year now :-) */
+ if (now->tm_year>99 && now->tm_year<1900) {
+ now->tm_year=now->tm_year+1900;
+ }
+ date_time.Year=now->tm_year;
+ }
+ CurrentCalendarNote->Time.Year = date_time.Year;
+
+ error=NULL_SendMessageSequence(50, &CurrentCalendarNoteError, 6, 0x13, req);
+
+ CurrentCalendarNote = NULL;
+
+ return error;
+}
+
+void N7110_ReplyWriteCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+#ifdef DEBUG
+ char kz_types[][6] = { "MEET", "CALL", "BIRTH", "REM" };
+
+ fprintf(stdout,
+ "Succesfully written Calendar Note Type %s on location %d\n",
+ kz_types[(MessageBuffer[3]/2)-1],
+ MessageBuffer[4]*256+MessageBuffer[5] );
+
+ fprintf(stdout, "--> Exit Status is %d (maybe is the size of buffer written to phone)\n",
+ MessageBuffer[6]*256+MessageBuffer[7] );
+#endif
+ CurrentCalendarNoteError=GE_NONE;
+}
+
+long P7110_GetNoteAlarmDiff(GSM_DateTime *time, GSM_DateTime *alarm)
+{
+ time_t t_alarm;
+ time_t t_time;
+ struct tm tm_alarm;
+ struct tm tm_time;
+
+ tzset();
+
+ tm_alarm.tm_year=alarm->Year-1900;
+ tm_alarm.tm_mon=alarm->Month-1;
+ tm_alarm.tm_mday=alarm->Day;
+ tm_alarm.tm_hour=alarm->Hour;
+ tm_alarm.tm_min=alarm->Minute;
+ tm_alarm.tm_sec=alarm->Second;
+ tm_alarm.tm_isdst=0;
+ t_alarm = mktime(&tm_alarm);
+
+ tm_time.tm_year=time->Year-1900;
+ tm_time.tm_mon=time->Month-1;
+ tm_time.tm_mday=time->Day;
+ tm_time.tm_hour=time->Hour;
+ tm_time.tm_min=time->Minute;
+ tm_time.tm_sec=time->Second;
+ tm_time.tm_isdst=0;
+ t_time = mktime(&tm_time);
+
+#ifdef DEBUG
+ fprintf(stdout, " Alarm: %02i-%02i-%04i %02i:%02i:%02i\n",
+ alarm->Day,alarm->Month,alarm->Year,
+ alarm->Hour,alarm->Minute,alarm->Second);
+ fprintf(stdout, " Date: %02i-%02i-%04i %02i:%02i:%02i\n",
+ time->Day,time->Month,time->Year,
+ time->Hour,time->Minute,time->Second);
+ fprintf(stdout,_("Difference in alarm time is %f\n"),difftime( t_time, t_alarm )+3600);
+#endif
+
+ return difftime( t_time ,t_alarm )+3600;
+}
+
+GSM_Error N7110_WriteCalendarNote(GSM_CalendarNote *CalendarNote)
+{
+ unsigned char req[200] = { N6110_FRAME_HEADER,
+ 0x01, /* note type ... */
+ 0x00, 0x00, /* location */
+ 0x00, /* entry type */
+ 0x00, //fixed
+ 0x00, 0x00, 0x00, 0x00, /* Year(2bytes), Month, Day */
+ /* here starts block */
+ 0x00, 0x00, 0x00, 0x00,0x00, 0x00 /* ... depends on note type ... */
+ };
+
+ int count=0;
+ long seconds, minutes;
+
+ GSM_Error error;
+ int firstFreeLocation;
+
+ /*
+ * 6210/7110 needs to seek the first free pos to inhabit with next note
+ */
+ error=N7110_FirstCalendarFreePos(&firstFreeLocation);
+ if (error!=GE_NONE) return error;
+
+#ifdef DEBUG
+ fprintf(stdout, _("First free calendar location is = %d.\n"),
+ firstFreeLocation);
+#endif
+
+ /* Location */
+ req[4]=0x00;
+ req[5]=0x00;
+
+ switch( CalendarNote->Type ) {
+ case GCN_MEETING : req[6]=0x01; req[3]=0x01; break;
+ case GCN_CALL : req[6]=0x02; req[3]=0x03; break;
+ case GCN_BIRTHDAY: req[6]=0x04; req[3]=0x05; break;
+ case GCN_REMINDER: req[6]=0x08; req[3]=0x07; break;
+ }
+
+ req[8]=CalendarNote->Time.Year>>8;
+ req[9]=CalendarNote->Time.Year&0xff;
+ req[10]=CalendarNote->Time.Month;
+ req[11]=CalendarNote->Time.Day;
+
+ /* From here starts BLOCK */
+ count=12;
+ switch( CalendarNote->Type ) {
+
+ case GCN_MEETING:
+ req[count++]=CalendarNote->Time.Hour; // 12
+ req[count++]=CalendarNote->Time.Minute; // 13
+ /* Alarm .. */
+ req[count++]=0xff; // 14
+ req[count++]=0xff; // 15
+ if( CalendarNote->Alarm.Year )
+ {
+ seconds= P7110_GetNoteAlarmDiff(&CalendarNote->Time,
+ &CalendarNote->Alarm);
+ if( seconds>=0L ) { /* Otherwise it's an error condition.... */
+ minutes=seconds/60L;
+ count-=2;
+ req[count++]=minutes>>8;
+ req[count++]=minutes&0xff;
+ }
+ }
+ /* Recurrance */
+ if( CalendarNote->Recurrance >= 8760 )
+ CalendarNote->Recurrance = 0xffff; /* setting 1 Year repeat */
+ req[count++]=CalendarNote->Recurrance>>8; // 16
+ req[count++]=CalendarNote->Recurrance&0xff; // 17
+ /* len of text */
+ req[count++]=strlen(CalendarNote->Text); // 18
+ /* fixed 0x00 */
+ req[count++]=0x00; // 19
+ /* Text */
+#ifdef DEBUG
+ fprintf(stdout, "Count before encode = %d\n", count );
+ fprintf(stdout, "Meeting Text is = \"%s\"\n", CalendarNote->Text );
+#endif
+
+ EncodeUnicode (req+count,CalendarNote->Text ,strlen(CalendarNote->Text));// 20->N
+ count=count+2*strlen(CalendarNote->Text);
+ break;
+
+ case GCN_CALL:
+ req[count++]=CalendarNote->Time.Hour; // 12
+ req[count++]=CalendarNote->Time.Minute; // 13
+ /* Alarm .. */
+ req[count++]=0xff; // 14
+ req[count++]=0xff; // 15
+ if( CalendarNote->Alarm.Year )
+ {
+ seconds= P7110_GetNoteAlarmDiff(&CalendarNote->Time,
+ &CalendarNote->Alarm);
+ if( seconds>=0L ) { /* Otherwise it's an error condition.... */
+ minutes=seconds/60L;
+ count-=2;
+ req[count++]=minutes>>8;
+ req[count++]=minutes&0xff;
+ }
+ }
+ /* Recurrance */
+ if( CalendarNote->Recurrance >= 8760 )
+ CalendarNote->Recurrance = 0xffff; /* setting 1 Year repeat */
+ req[count++]=CalendarNote->Recurrance>>8; // 16
+ req[count++]=CalendarNote->Recurrance&0xff; // 17
+ /* len of text */
+ req[count++]=strlen(CalendarNote->Text); // 18
+ /* fixed 0x00 */
+ req[count++]=strlen(CalendarNote->Phone); // 19
+ /* Text */
+ EncodeUnicode (req+count,CalendarNote->Text ,strlen(CalendarNote->Text));// 20->N
+ count=count+2*strlen(CalendarNote->Text);
+ EncodeUnicode (req+count,CalendarNote->Phone ,strlen(CalendarNote->Phone));// (N+1)->n
+ count=count+2*strlen(CalendarNote->Phone);
+ break;
+
+ case GCN_BIRTHDAY:
+ req[count++]=0x00; // 12 Fixed
+ req[count++]=0x00; // 13 Fixed
+
+ /* Alarm .. */
+ req[count++]=0x00; req[count++]=0x00; // 14, 15
+ req[count++]=0xff; // 16
+ req[count++]=0xff; // 17
+ if( CalendarNote->Alarm.Year ) {
+ // I try with Time.Year = Alarm.Year. If negative, I increase 1 year,
+ // but only once ! This thing, because I may have Alarm period across
+ // a year. (eg. Birthday on 2001-01-10 and Alarm on 2000-12-27)
+
+ CalendarNote->Time.Year = CalendarNote->Alarm.Year;
+ if( (seconds= P7110_GetNoteAlarmDiff(&CalendarNote->Time,
+ &CalendarNote->Alarm)) < 0L ) {
+ CalendarNote->Time.Year++;
+ seconds= P7110_GetNoteAlarmDiff(&CalendarNote->Time,
+ &CalendarNote->Alarm);
+ }
+ if( seconds>=0L ) { /* Otherwise it's an error condition.... */
+ count-=4;
+ req[count++]=seconds>>24; // 14
+ req[count++]=(seconds>>16) & 0xff; // 15
+ req[count++]=(seconds>>8) & 0xff; // 16
+ req[count++]=seconds&0xff; // 17
+ }
+ }
+
+ req[count++]=CalendarNote->AlarmType; // 18
+
+ /* len of text */
+ req[count++]=strlen(CalendarNote->Text); // 19
+
+ /* Text */
+#ifdef DEBUG
+ fprintf(stdout, "Count before encode = %d\n", count );
+ fprintf(stdout, "Meeting Text is = \"%s\" Altype is 0x%02x \n", CalendarNote->Text , CalendarNote->AlarmType );
+#endif
+ EncodeUnicode (req+count,CalendarNote->Text ,strlen(CalendarNote->Text));// 22->N
+ count=count+2*strlen(CalendarNote->Text);
+ break;
+
+ case GCN_REMINDER:
+ /* Recurrance */
+ if( CalendarNote->Recurrance >= 8760 )
+ CalendarNote->Recurrance = 0xffff; /* setting 1 Year repeat */
+ req[count++]=CalendarNote->Recurrance>>8; // 12
+ req[count++]=CalendarNote->Recurrance&0xff; // 13
+ /* len of text */
+ req[count++]=strlen(CalendarNote->Text); // 14
+ /* fixed 0x00 */
+ req[count++]=0x00; // 15
+ /* Text */
+ EncodeUnicode (req+count,CalendarNote->Text ,strlen(CalendarNote->Text));// 16->N
+ count=count+2*strlen(CalendarNote->Text);
+ break;
+ }
+
+ /* padding */
+ req[count]=0x00;
+#ifdef DEBUG
+ fprintf(stdout, "Count after padding = %d\n", count );
+#endif
+
+ CurrentCalendarNote = CalendarNote;
+
+ error=NULL_SendMessageSequence(50, &CurrentCalendarNoteError, count, 0x13, req);
+
+ CurrentCalendarNote = NULL;
+
+ return error;
+}
+
+void N7110_ReplyFirstCalendarFreePos(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ *CurrentFirstCalendarFreePos = MessageBuffer[4]*256+MessageBuffer[5];
+ CurrentFirstCalendarFreePosError=GE_NONE;
+}
+
+GSM_Error N7110_FirstCalendarFreePos(int *FreePos)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x31 };
+
+ GSM_Error error;
+
+ CurrentFirstCalendarFreePos = FreePos;
+
+ error=NULL_SendMessageSequence(50, &CurrentFirstCalendarFreePosError,
+ 4, 0x13, req);
+
+ CurrentFirstCalendarFreePos = NULL;
+
+ return error;
+}
+
+void N7110_ReplyDeleteCalendarNote(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+#ifdef DEBUG
+ fprintf(stdout,
+ "Succesfully Delete Calendar Note on location %d\n",
+ MessageBuffer[4]*256+MessageBuffer[5] );
+
+ fprintf(stdout, "--> Other data are :\n" );
+ fprintf(stdout, " '%c'[0x%02x](%3d), '%c'[0x%02x](%3d), '%c'[0x%02x](%3d), '%c'[0x%02x](%3d)\n",
+ MessageBuffer[6], MessageBuffer[6], MessageBuffer[6],
+ MessageBuffer[7], MessageBuffer[7], MessageBuffer[7],
+ MessageBuffer[8], MessageBuffer[8], MessageBuffer[8],
+ MessageBuffer[9], MessageBuffer[9], MessageBuffer[9] );
+#endif
+ CurrentCalendarNoteError=GE_NONE;
+}
+
+GSM_Error N7110_DeleteCalendarNote(GSM_CalendarNote *CalendarNote)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x0b, /* delete calendar note */
+ 0x00, 0x00 //location
+ };
+
+ GSM_Error error;
+
+ if (CalendarNote->ReadNotesInfo || CurrentCalendarNotesInfo.HowMany==2000) {
+ error=N7110_GetCalendarNotesInfo(&CurrentCalendarNotesInfo);
+ if (error!=GE_NONE) return error;
+ }
+
+ /* this is for making xgnokii work.. */
+ if (CalendarNote->Location > CurrentCalendarNotesInfo.HowMany )
+ return GE_INVALIDCALNOTELOCATION;
+
+ req[4] = CurrentCalendarNotesInfo.Location[CalendarNote->Location-1]>>8;
+ req[5] = CurrentCalendarNotesInfo.Location[CalendarNote->Location-1]&0xff;
+
+ CurrentCalendarNote = CalendarNote;
+
+ error=NULL_SendMessageSequence(50, &CurrentCalendarNoteError, 6, 0x13, req);
+
+ CurrentCalendarNote = NULL;
+
+ return error;
+}
+
+void N7110_ReplyGetSMSFolders(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ wchar_t wc;
+
+ int i, j, tmp;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Folders received:\n"));
+#endif /* DEBUG */
+
+ i=5;
+
+ CurrentSMSFoldersCount=MessageBuffer[4];
+
+ for (j=0;j<MessageBuffer[4];j++) {
+ strcpy(CurrentSMSFolders->Folder[j].Name," ");
+#ifdef DEBUG
+ fprintf(stdout, _(" Folder Index: %d"),MessageBuffer[i]);
+#endif /* DEBUG */
+ CurrentSMSFolders->FoldersID[j]=MessageBuffer[i];
+
+ i=i+2;
+
+#ifdef DEBUG
+ fprintf(stdout, _(", folder name: "));
+#endif /* DEBUG */
+ tmp=0;
+ while ((MessageBuffer[i]!=0x00) & (MessageBuffer[i+1]==0x00)) {
+
+ wc = MessageBuffer[i] | (MessageBuffer[i+1] << 8);
+
+ CurrentSMSFolders->Folder[j].Name[tmp]=DecodeWithUnicodeAlphabet(wc);
+#ifdef DEBUG
+ fprintf(stdout, _("%c"),CurrentSMSFolders->Folder[j].Name[tmp]);
+#endif /* DEBUG */
+ tmp++;
+ i=i+2;
+ }
+#ifdef DEBUG
+ fprintf(stdout, _("\n"));
+#endif /* DEBUG */
+ tmp=0;
+ i=i+1;
+ }
+
+ CurrentSMSFoldersError=GE_NONE;
+}
+
+GSM_Error N7110_GetSMSFolders ( GSM_SMSFolders *folders)
+{
+ unsigned char req[] = { N6110_FRAME_HEADER, 0x7A, 0x00, 0x00};
+
+ GSM_Error error;
+
+ CurrentSMSFolders=folders;
+
+ error=NULL_SendMessageSequence(20, &CurrentSMSFoldersError, 6, 0x14, req);
+
+ folders->number=CurrentSMSFoldersCount;
+
+ return error;
+}
+
+void N7110_ReplyGetSMSFolderStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int i;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Folder status received\n"));
+ fprintf(stdout, _(" Number of Entries: %i"),MessageBuffer[4]*256+MessageBuffer[5]);
+#endif /* DEBUG */
+ CurrentSMSFolder.number=MessageBuffer[4]*256+MessageBuffer[5];
+#ifdef DEBUG
+ fprintf(stdout, _(" (indexes "));
+#endif /* DEBUG */
+
+ for (i=0;i<MessageBuffer[4]*256+MessageBuffer[5];i++) {
+#ifdef DEBUG
+ fprintf(stdout, _("%i, "), MessageBuffer[6+(i*2)]*256+MessageBuffer[(i*2)+7]);
+#endif /* DEBUG */
+ CurrentSMSFolder.locations[i]=MessageBuffer[6+(i*2)]*256+MessageBuffer[(i*2)+7];
+ }
+
+#ifdef DEBUG
+ fprintf(stdout, _(")\n"));
+#endif /* DEBUG */
+
+ CurrentSMSFolderError=GE_NONE;
+}
+
+GSM_Error N7110_GetSMSFolderStatus ( GSM_OneSMSFolder *folder, u8 ID)
+{
+ unsigned char req[] = { N7110_FRAME_HEADER,
+ 0x6b,
+ 0x08, //folderID
+ 0x0F,
+ 0x01};
+
+ GSM_Error error;
+
+ CurrentSMSFolder = *folder;
+ CurrentSMSFolderID = ID;
+ req[4] = ID;
+
+ error=NULL_SendMessageSequence(20, &CurrentSMSFolderError, 7, 0x14, req);
+
+ *folder=CurrentSMSFolder;
+
+ return error;
+}
+
+void N7110_ReplyDeleteSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS deleted succesfully\n"));
+#endif /* DEBUG */
+ CurrentSMSMessageError = GE_NONE;
+}
+
+GSM_Error N7110_DeleteSMSMessage(GSM_SMSMessage *message)
+{
+ unsigned char req[] = {
+ N7110_FRAME_HEADER, 0x0a, /* delete SMS request */
+ 0x00, /* folder (req[4])*/
+ 0x00, /* location */
+ 0x00, /* location (req[6])*/
+ 0x01 };
+
+ GSM_Error error;
+ int smsnum, location;
+ u8 folderid;
+
+ smsnum = message->Location;
+ /* We made "fake" SMS numbering for SMS in 7110/6210/etc. */
+ if ((error = N7110_HandleSMSLocation(smsnum, &folderid, &location, NULL, GSH_DELETE))!=GE_NONE)
+ return(error);
+
+ req[4]=folderid;
+ req[5]=location / 256;
+ req[6]=location;
+
+#ifdef DEBUG
+ printf("delete sms: folder %d, location %d\n",folderid,location);
+#endif
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSMSMessageError, 8, 0x14, req);
+}
+
+GSM_Error N7110_GetSMSMessage(GSM_SMSMessage *message)
+{
+
+ unsigned char req[] = { N6110_FRAME_HEADER,
+ 0x07,
+ 0x08, // folder ID
+ 0x00, 0x05, // location
+ 0x01,
+ 0x65,
+ 0x01};
+
+ int smsnum, location;
+ u8 folderid;
+
+ GSM_Error error;
+ CurrentSMSMessage = message;
+ CurrentSMSMessageError = GE_BUSY;
+
+
+ smsnum = message->Location;
+
+ /* we make central handling of real location */
+ error = N7110_HandleSMSLocation(smsnum, &folderid, &location, message, GSH_GET);
+ /* if smsnum is 0 (next sms) we need real smsnum */
+ N7110_SMS2FakeLocation( &smsnum, folderid, location);
+ message->Location = smsnum;
+ switch(error)
+ {
+ case GE_SMSISINMEM: /* future use: get already reed sms from mem */
+ return GE_NONE;
+ break;
+ case GE_NONE: req[4]=folderid;
+ req[5]=location / 256;
+ req[6]=location;
+#ifdef DEBUG
+ fprintf(stdout, _("GetSMSMessage: read folder %d, location %d\n"),folderid,location);
+#endif
+ return NULL_SendMessageSequence(100, &CurrentSMSMessageError, 10, 0x14, req);
+ break;
+ default: break;
+ }
+
+ return(error);
+}
+
+void N7110_ReplySaveSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int smsnum;
+
+ switch (MessageBuffer[3]) {
+
+ /* save sms */
+ case 0x05:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message stored at folder %d, location %d\n"), MessageBuffer[4], MessageBuffer[6]);
+#endif
+
+ if (CurrentSMSMessage!=NULL) {
+ N7110_SMS2FakeLocation(&smsnum, (u8) MessageBuffer[4], (int) MessageBuffer[6]);
+ CurrentSMSMessage->MessageNumber=smsnum;
+ }
+
+ CurrentSMSMessageError = GE_NONE;
+ break;
+
+ /* save sms failed */
+ case 0x06:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message save failed\n"));
+#endif
+ CurrentSMSMessageError = GE_SMSSAVEFAILED;
+ break;
+
+ case 0x84:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Changed name for SMS Message\n"));
+#endif
+ CurrentSMSMessageError = GE_NONE;
+ break;
+
+ }
+}
+
+GSM_Error N7110_SaveSMSMessage(GSM_SMSMessage *SMS)
+{
+ unsigned char req[256] = {
+ N6110_FRAME_HEADER, 0x04, /* SMS save request*/
+ 0x03, /* default: mark sms as GSS_NOTSENTREAD */
+ 0x10, /* folder (req[5])*/
+ 0x00, /* location */
+ 0x00, /* location (req[7])*/
+ 0x00 /* ??? */
+ };
+
+ unsigned char req2[200] = {N6110_FRAME_HEADER, 0x83};
+
+ int length,smsnum,location;
+ u8 folderid;
+ GSM_Error error;
+ SMS_MessageType PDU;
+
+ smsnum = SMS->Location;
+
+#ifdef DEBUG
+ printf("save sms: smsnum is :%d\n",smsnum);
+#endif
+
+ if ( SMS->Status == GSS_SENTREAD) req[4] = 0x01;
+
+ folderid = SMS->folder;
+
+ PDU=SMS_Deliver;
+
+ error=GSM_EncodeNokiaSMSFrame(SMS, req+9, &length, PDU);
+ if (error != GE_NONE) return error;
+
+ CurrentSMSMessage = SMS;
+
+ error=N7110_HandleSMSLocation(smsnum, &folderid, &location, SMS, GSH_SAVE);
+ switch (error)
+ {
+
+ case GE_BUSYSMSLOCATION: /* delete old sms before save */
+ error = N7110_DeleteSMSMessage(SMS);
+ if (error != GE_NONE) return error;
+ break;
+ case GE_NONE:
+ break;
+ default:
+ return error;
+ break;
+ }
+
+#ifdef DEBUG
+ printf("save sms: want to save at folder:%d , location:%d\n",folderid,location);
+#endif
+
+ req[5]=folderid;
+ req[6]=location / 256;
+ req[7]=location;
+
+ error=NULL_SendMessageSequence
+ (70, &CurrentSMSMessageError, 40+length, 0x14, req);
+
+ if (error==GE_NONE && SMS->Name[0]!=0) {
+ length=4;
+ N7110_Fake2SMSLocation(SMS->MessageNumber, &folderid, &location);
+ req2[length++]=folderid;
+ req2[length++]=location / 256;
+ req2[length++]=location;
+ EncodeUnicode(req2+length, SMS->Name, strlen(SMS->Name));
+ length=length+strlen(SMS->Name)*2;
+ req2[length++]=0;
+ req2[length++]=0;
+ error=NULL_SendMessageSequence
+ (70, &CurrentSMSMessageError, length, 0x14, req2);
+ }
+
+ return error;
+}
+
+/* handling for 7110 folders */
+GSM_Error N7110_HandleSMSLocation(int smsnum, u8 *folder, int *location, GSM_SMSMessage *message, GSM_SMSHandleAction action)
+{
+ /* remember me */
+ static int nextSMSmessage = -1;
+ static GSM_SMSStatus Status;
+
+ bool found = false;
+ int folderid;
+ GSM_OneSMSFolder onefolder;
+ GSM_Error error;
+ int ismsnum;
+ int i;
+
+ switch (action) {
+ case GSH_DELETE: /* future use: delete sms in mem -> free memory */
+ /* for now we make same as in GSH_GET */
+ case GSH_GET: /* if smsnum == 0 user wants to read next sms */
+ if (smsnum == 0 )
+ {
+ /* first time we read folderstatus */
+ if ( nextSMSmessage == -1)
+ {
+ nextSMSmessage = 0;
+ error = N7110_GetSMSStatus( &Status);
+ if (error!=GE_NONE) return error;
+ }
+ ismsnum = Status.foldertable[nextSMSmessage].smsnum;
+ N7110_Fake2SMSLocation( ismsnum, folder, location);
+ nextSMSmessage++;
+ if(nextSMSmessage >= Status.Number)
+ {
+ nextSMSmessage = -1;
+#ifdef DEBUG
+ printf("HandleSMS: setting nextSMSmessage to -1\n");
+#endif
+ }
+ } else /* user give location -> make fake location */
+ {
+ /* future use: get already read sms from mem */
+ N7110_Fake2SMSLocation( smsnum, folder, location);
+ }
+ break;
+ case GSH_SAVE: /* if smsnum == 0 user wants to save in specific folder */
+ if (smsnum == 0 )
+ {
+ /* calculate correct folderid */
+ *folder = ( *folder + 1) * 8;
+
+ *location = 0;
+ } else /* user give location -> make fake location */
+ {
+ N7110_Fake2SMSLocation( smsnum, folder, location);
+ folderid = *folder;
+
+ error=N7110_GetSMSFolderStatus(&onefolder, folderid );
+ if (error!=GE_NONE) return error;
+
+ /* is there a sms at that location ? */
+ for (i=0; i<CurrentSMSFolder.number; i++)
+ if ( CurrentSMSFolder.locations[i] == *location ) found = true;
+
+ if (found == true) return GE_BUSYSMSLOCATION;
+ else return GE_NONE;
+ }
+ break;
+ default:
+ return GE_UNKNOWN;
+ } //switch
+ return GE_NONE;
+}
+
+/* input: fake smsnum, output: folderid & location */
+void N7110_Fake2SMSLocation(int smsnum, u8 *folderid, int *location)
+{
+ int ifolderid;
+
+ ifolderid = smsnum / N7110_MAXSMSINFOLDER;
+ *folderid = ifolderid * 0x08;
+ *location = smsnum - ifolderid * N7110_MAXSMSINFOLDER;
+}
+
+/* input; folderid & location, output: fake smsnum */
+void N7110_SMS2FakeLocation(int *smsnum, u8 folderid, int location)
+{
+ int ifolderid;
+
+ ifolderid = folderid / 0x08;
+ *smsnum = ifolderid * N7110_MAXSMSINFOLDER + location;
+}
+
+GSM_Error N7110_GetRFLevel(GSM_RFUnits *units, float *level)
+{
+ unsigned char request[] = {N6110_FRAME_HEADER, 0x81};
+
+ int timeout=10;
+ int rf_level;
+
+ CurrentRFLevel=-1;
+
+ Protocol->SendMessage(4, 0x0a, request);
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentRFLevel == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ /* Make copy in case it changes. */
+ rf_level = CurrentRFLevel;
+
+ if (rf_level == -1)
+ return (GE_NOLINK);
+
+ /* Now convert between the different units we support. */
+
+ /* Arbitrary units. */
+ *units = GRF_Percentage;
+ *level = rf_level;
+ return (GE_NONE);
+}
+
+GSM_Error N7110_GetBatteryLevel(GSM_BatteryUnits *units, float *level)
+{
+ unsigned char request[] = {N6110_FRAME_HEADER, 0x02};
+
+ int timeout=10;
+ int batt_level;
+
+ CurrentBatteryLevel=-1;
+
+ Protocol->SendMessage(4, 0x17, request);
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentBatteryLevel == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ /* Take copy in case it changes. */
+ batt_level = CurrentBatteryLevel;
+
+ if (batt_level == -1)
+ return (GE_NOLINK);
+
+ /* Only units we handle at present are GBU_Arbitrary */
+ *units = GBU_Percentage;
+ *level = batt_level;
+ return (GE_NONE);
+}
+
+GSM_Error N7110_GetSecurityCode(GSM_SecurityCode *SecurityCode)
+{
+ unsigned char req[] = {0x00, 0x01, 0x01, 0xee, 0x1c};
+
+ if (SecurityCode->Type!=GSCT_SecurityCode) return GE_NOTSUPPORTED;
+
+ CurrentSecurityCode=SecurityCode;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSecurityCodeError, 5, 0x7a, req);
+}
+
+GSM_Error N7110_GetDateTime(GSM_DateTime *date_time)
+{
+ return N6110_PrivGetDateTime(date_time,0x19);
+}
+
+/* Needs SIM card with PIN in phone */
+GSM_Error N7110_SetDateTime(GSM_DateTime *date_time)
+{
+ return N6110_PrivSetDateTime(date_time,0x19);
+}
+
+GSM_Error N7110_GetAlarm(int alarm_number, GSM_DateTime *date_time)
+{
+ return N6110_PrivGetAlarm(alarm_number,date_time,0x19);
+}
+
+/* FIXME: we should also allow to set the alarm off :-) */
+GSM_Error N7110_SetAlarm(int alarm_number, GSM_DateTime *date_time)
+{
+ return N6110_PrivSetAlarm(alarm_number,date_time, 0x19);
+}
+
+void N7110_ReplyGetSMSStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ switch (MessageBuffer[3]) {
+
+ /* sms status */
+ case 0x37:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Status Received\n"));
+ fprintf(stdout, _(" Used msg in phone memory: %i\n"),MessageBuffer[10]*256+MessageBuffer[11]);
+ fprintf(stdout, _(" Unread msg in phone memory: %i\n"),MessageBuffer[12]*256+MessageBuffer[13]);
+ fprintf(stdout, _(" Used msg in SIM: %i\n"),MessageBuffer[14]*256+MessageBuffer[15]);
+ fprintf(stdout, _(" Unread msg in SIM: %i\n"),MessageBuffer[16]*256+MessageBuffer[17]);
+#endif /* DEBUG */
+ CurrentSMSStatus->UnRead = MessageBuffer[13];
+ CurrentSMSStatusError = GE_NONE;
+ break;
+
+ case 0x38:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Status error, probably not authorized by PIN\n"));
+#endif /* DEBUG */
+ CurrentSMSStatusError = GE_INTERNALERROR;
+ break;
+
+ }
+}
+
+GSM_Error N7110_GetSMSStatus(GSM_SMSStatus *Status)
+{
+ /* RTH FIXME: what is exact meaning of 0x0037 answer ? */
+ /* we check all folders, but get sum of unread sms via 0x0036 request */
+ unsigned char req[] = {N6110_FRAME_HEADER, 0x36, 0x64};
+
+ GSM_SMSFolders folders;
+ GSM_OneSMSFolder folder;
+ GSM_Error error;
+ u8 ifolder;
+ int ismsnum,ilocation;
+ int i,j,smsmaxnum;
+
+ CurrentSMSStatus = Status;
+
+ /* read all SMS folders */
+ /* check for unread messages in folder 0xf8 */
+ error = N7110_GetSMSFolderStatus(&folder, 0xf8);
+ if (error != GE_NONE) return error;
+
+ smsmaxnum=0;
+ for(j=0; j<folder.number; j++)
+ {
+ ifolder = 0; /*read unread messages from folder 0 */
+ ilocation = folder.locations[j];
+ N7110_SMS2FakeLocation( &ismsnum, ifolder, ilocation) ;
+ CurrentSMSStatus->foldertable[smsmaxnum].smsnum = ismsnum;
+ CurrentSMSStatus->foldertable[smsmaxnum].folder = ifolder;
+ CurrentSMSStatus->foldertable[smsmaxnum].location = ilocation;
+ smsmaxnum++;
+ }
+
+ /* read standard folders */
+ N7110_GetSMSFolders (&folders);
+ for(i=0; i<CurrentSMSFoldersCount; i++)
+ {
+ error = N7110_GetSMSFolderStatus(&CurrentSMSFolders->Folder[i], CurrentSMSFolders->FoldersID[i]);
+ if (error != GE_NONE) return error;
+
+ for(j=0; j<CurrentSMSFolders->Folder[i].number; j++)
+ {
+ ifolder = CurrentSMSFolders->FoldersID[i];
+ ilocation = CurrentSMSFolders->Folder[i].locations[j];
+ N7110_SMS2FakeLocation( &ismsnum, ifolder, ilocation);
+ CurrentSMSStatus->foldertable[smsmaxnum].smsnum = ismsnum;
+ CurrentSMSStatus->foldertable[smsmaxnum].folder = ifolder;
+ CurrentSMSStatus->foldertable[smsmaxnum].location = ilocation;
+ smsmaxnum++;
+ }
+ }
+ CurrentSMSStatus->Number = smsmaxnum;
+
+ return NULL_SendMessageSequence(10, &CurrentSMSStatusError, 5, 0x14, req);
+}
+
+void N7110_DecodePhonebookFrame(GSM_PhonebookEntry *entry,u8 *MessageBuffer,u16 MessageLength)
+{
+ int blockcount=0;
+ unsigned char *pBlock;
+ int length=0;
+
+#ifdef DEBUG
+ int j;
+#endif
+
+ pBlock = &MessageBuffer[0];
+
+ while (length!=MessageLength) {
+ GSM_SubPhonebookEntry* pEntry = &entry->SubEntries[blockcount];
+
+#ifdef DEBUG
+ fprintf(stdout,_(" "));
+ for (j=5;j<(pBlock[3]-6)+5;j++) fprintf(stdout,_("%02x "),pBlock[j]);
+ fprintf(stdout,_("\n"));
+#endif
+
+ switch( pBlock[0] ) {
+ case N7110_ENTRYTYPE_SPEEDDIAL:
+
+ CurrentSpeedDialEntry->MemoryType = GMT_SM;
+ if (pBlock[4]==0x02) CurrentSpeedDialEntry->MemoryType = GMT_ME;
+
+ CurrentSpeedDialEntry->Location = pBlock[7]+pBlock[6]*256;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Speed dial\n"));
+ fprintf(stdout, _(" Location: %d\n"), CurrentSpeedDialEntry->Location);
+ fprintf(stdout, _(" MemoryType: %i\n"), CurrentSpeedDialEntry->MemoryType);
+ fprintf(stdout, _(" Number: %d\n"), CurrentSpeedDialEntry->Number);
+#endif /* DEBUG */
+
+ CurrentSpeedDialError=GE_NONE;
+ break;
+
+ case N7110_ENTRYTYPE_NAME:
+ DecodeUnicode (entry->Name, pBlock+6, pBlock[5]/2);
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY)
+ strncpy(CurrentGetBitmap->text,entry->Name,sizeof(CurrentGetBitmap->text));
+ entry->Empty = false;
+#ifdef DEBUG
+ fprintf(stdout, _(" Name:\n"));
+ fprintf(stdout, _(" Name: %s\n"), entry->Name);
+#endif /* DEBUG */
+ break;
+
+ case N7110_ENTRYTYPE_NUMBER:
+ pEntry->EntryType = pBlock[0];
+ pEntry->NumberType = pBlock[5];
+ pEntry->BlockNumber = pBlock[4];
+
+ DecodeUnicode (pEntry->data.Number, pBlock+10, pBlock[9]/2);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Number:\n"));
+ fprintf(stdout, _(" Type: %d (%02x)\n"),pEntry->NumberType,pEntry->NumberType);
+ fprintf(stdout, _(" Number: %s\n"),pEntry->data.Number);
+#endif /* DEBUG */
+ if( pEntry->EntryType == GSM_Number &&
+ ((pEntry->NumberType == GSM_General && !strcmp(entry->Number,""))
+ || pEntry->NumberType == GSM_SIM)) {
+ strcpy( entry->Number, pEntry->data.Number );
+ *pEntry->data.Number = 0;
+ } else
+ blockcount++;
+ break;
+ case N7110_ENTRYTYPE_DATE:
+ pEntry->EntryType = pBlock[0];
+ pEntry->NumberType = pBlock[5];
+ pEntry->BlockNumber = pBlock[4];
+ DecodeDateTime(pBlock+6, &pEntry->data.Date);
+#ifdef DEBUG
+ fprintf(stdout, _(" Date:\n"));
+ fprintf(stdout, _(" Date: %02u.%02u.%04u\n"), pEntry->data.Date.Day,
+ pEntry->data.Date.Month, pEntry->data.Date.Year );
+ fprintf(stdout, _(" Time: %02u:%02u:%02u\n"), pEntry->data.Date.Hour,
+ pEntry->data.Date.Minute, pEntry->data.Date.Second);
+#endif /* DEBUG */
+ blockcount++;
+ break;
+ case N7110_ENTRYTYPE_NOTE:
+ case N7110_ENTRYTYPE_POSTAL:
+ case N7110_ENTRYTYPE_EMAIL:
+ pEntry->EntryType = pBlock[0];
+ pEntry->NumberType = 0;
+ pEntry->BlockNumber = pBlock[4];
+
+ DecodeUnicode (pEntry->data.Number, pBlock+6, pBlock[5]/2);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Email or note or postal:\n"));
+ fprintf(stdout, _(" Type: %d (%02x)\n"),pEntry->EntryType,pEntry->EntryType);
+ fprintf(stdout, _(" Text: %s\n"),pEntry->data.Number);
+#endif /* DEBUG */
+ blockcount++;
+ break;
+ case N7110_ENTRYTYPE_GROUP:
+ entry->Group = pBlock[5]-1; /* 0 = family as for 6110 */
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY)
+ CurrentGetBitmap->number = entry->Group;
+#ifdef DEBUG
+ fprintf(stdout, _(" Group: %d\n"), entry->Group);
+#endif /* DEBUG */
+ break;
+ case N7110_ENTRYTYPE_RINGTONE:
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY)
+ CurrentGetBitmap->ringtone = pBlock[5];
+#ifdef DEBUG
+ fprintf(stdout, _(" Group ringtone number %d received.\n"), pBlock[5]);
+#endif /* DEBUG */
+ break;
+ case N7110_ENTRYTYPE_LOGOON:
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY)
+ CurrentGetBitmap->enabled = pBlock[5];
+#ifdef DEBUG
+ fprintf(stdout, _(" Logo enabled = %d received.\n"), pBlock[5]);
+#endif /* DEBUG */
+ break;
+ case N7110_ENTRYTYPE_GROUPLOGO:
+#ifdef DEBUG
+ fprintf(stdout, _(" Caller group logo received.\n"));
+#endif /* DEBUG */
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY) {
+ CurrentGetBitmap->width = pBlock[5];
+ CurrentGetBitmap->height= pBlock[6];
+ CurrentGetBitmap->size = pBlock[9];
+ if (CurrentGetBitmap->size > sizeof(CurrentGetBitmap->bitmap))
+ CurrentGetBitmap->size = CurrentGetBitmap->size;
+ memcpy(CurrentGetBitmap->bitmap,pBlock+10,CurrentGetBitmap->size);
+ }
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _(" Unknown Entry Code (%u) received.\n"), pBlock[0] );
+#endif /* DEBUG */
+ break;
+ }
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Blocksize was: %d (%02x)\n"), (int) pBlock[3], pBlock[3]);
+#endif
+ length=length+pBlock[3];
+
+ pBlock = &pBlock[(int) pBlock[3]];
+ }
+
+ entry->SubEntriesCount = blockcount;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" SubBlocks: %d\n"),entry->SubEntriesCount);
+#endif /* DEBUG */
+}
+
+void N7110_ReplyGetMemoryLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+
+ CurrentPhonebookEntry->Empty = true;
+ CurrentPhonebookEntry->Group = 5; /* 5 = no group as 6110 */
+ CurrentPhonebookEntry->Name[0] = '\0';
+ CurrentPhonebookEntry->Number[0] = '\0';
+ CurrentPhonebookEntry->SubEntriesCount = 0;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook entry received:\n"));
+#endif
+
+ if( MessageBuffer[6] == 0x0f ) // not found
+ {
+#ifdef DEBUG
+ fprintf(stdout, _(" Error %i\n"),MessageBuffer[10]);
+ switch (MessageBuffer[10]) {
+ case 0x34:fprintf(stdout,_(" Invalid phonebook location\n"));break;
+ case 0x3b:fprintf(stdout,_(" Speed dial not assigned\n"));break;
+ default :fprintf(stdout,_(" Unknown.Please report\n"));break;
+ }
+#endif
+ switch (MessageBuffer[10]) {
+ case 0x34:CurrentPhonebookError = GE_INVALIDPHBOOKLOCATION;break;
+ case 0x3b:CurrentPhonebookError = GE_INVALIDSPEEDDIALLOCATION;break;
+ default :CurrentPhonebookError = GE_UNKNOWN;
+ }
+ CurrentSpeedDialError=GE_INVALIDSPEEDDIALLOCATION;
+
+ } else {
+ CurrentPhonebookEntry->Location=MessageBuffer[13]+MessageBuffer[12]*256;
+
+#ifdef DEBUG
+ fprintf(stdout,_(" Location: %i\n"),CurrentPhonebookEntry->Location);
+#endif
+
+ N7110_DecodePhonebookFrame(CurrentPhonebookEntry,MessageBuffer+18,MessageLength-18);
+
+ CurrentPhonebookError = GE_NONE;
+ }
+}
+
+/* Routine to get specifed phone book location. Designed to be called by
+ application. Will block until location is retrieved or a timeout/error
+ occurs. */
+GSM_Error N7110_GetMemoryLocation(GSM_PhonebookEntry *entry) {
+
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
+ 0x02, //memory type
+ 0x05,
+ 0x00, 0x00, //location
+ 0x00, 0x00};
+
+ CurrentPhonebookEntry = entry;
+
+ req[9] = N7110_GetMemoryType(entry->MemoryType);
+ req[10] = (entry->Location>>8);
+ req[11] = entry->Location & 0xff;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, 14, 0x03, req);
+}
+
+void N7110_ReplyWritePhonebookLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ // [12,13] = Location
+ // [14] = Memory
+
+ if( MessageBuffer[6] == 0x0f ) // ERROR
+ {
+#ifdef DEBUG
+ /* I didn't find any error when the Text,Name or Number was too long
+ My Phone 7110; NSE-5; SW 04.84 */
+ switch( MessageBuffer[10] ) {
+ case 0x3d: fprintf(stdout, _("Error: Wrong Entry Type.\n")); break;
+ case 0x3e: fprintf(stdout, _("Error: Too much entries.\n")); break;
+ default : fprintf(stdout, _("Error: Unknown error (%u).\n"), MessageBuffer[10]); break;
+ }
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_NONE;
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook written correctly.\n"));
+#endif /* DEBUG */
+
+ CurrentPhonebookError = GE_NONE;
+ }
+}
+
+int N7110_PackPBKBlock(int id, int size, int no, unsigned char *buf, unsigned char *block)
+{
+#ifdef DEBUG
+ fprintf(stdout,_("Adding block id:%i,number:%i,length:%i\n"),id,no+1,size+6);
+#endif
+
+ *(block++) = id;
+ *(block++) = 0;
+ *(block++) = 0;
+ *(block++) = size + 6;
+ *(block++) = no + 1;
+
+ memcpy(block, buf, size);
+ block += size;
+
+ *(block++) = 0;
+
+ return (size + 6);
+}
+
+int N7110_EncodePhonebookFrame(unsigned char *req, GSM_PhonebookEntry entry, int *block2)
+{
+ int count=0, len, i, block=0;
+
+ char string[500];
+
+ /* Name */
+ len = strlen(entry.Name);
+ string[0] = len * 2; // Length ot the string (without Termination)
+ EncodeUnicode((string + 1), entry.Name, len);
+ string[len * 2 + 1] = 0; // Terminating 0
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_NAME, len * 2 + 2, block++, string, req + count);
+
+ if (*entry.Number) {
+ len = strlen(entry.Number);
+ string[0] = N7110_ENTRYTYPE_NUMBER;
+ string[1] = string[2] = string[3] = 0;
+ string[4] = len * 2; // length (without Termination)
+ EncodeUnicode((string + 5), entry.Number, len);
+ string[len * 2 + 5] = 0; // Terminating 0
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_NUMBER, len * 2 + 6, block++, string, req + count);
+ }
+
+ /* Rest of the subentries */
+ for (i = 0; i < entry.SubEntriesCount; i++) {
+ len = strlen(entry.SubEntries[i].data.Number);
+ if (entry.SubEntries[i].EntryType != GSM_Number) {
+ string[0] = len * 2; // length (without Termination)
+ EncodeUnicode((string + 1), entry.SubEntries[i].data.Number, len);
+ string[len * 2 + 1] = 0; // Terminating 0
+ count += N7110_PackPBKBlock(entry.SubEntries[i].EntryType, len * 2 + 2, block++, string, req + count);
+ } else {
+ string[0] = entry.SubEntries[i].NumberType;
+ string[1] = string[2] = string[3] = 0;
+ string[4] = len * 2; //length (without Termination)
+ EncodeUnicode((string + 5), entry.SubEntries[i].data.Number, len);
+ string[len * 2 + 5] = 0; // Terminating 0
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_NUMBER, len * 2 + 6, block++, string, req + count);
+ }
+ }
+
+ if (entry.Group != 5) {
+ /* Group */
+ string[0] = entry.Group + 1;
+ string[1] = 0;
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_GROUP, 2, block++, string, req + count);
+ }
+
+ *block2=block;
+
+ return count;
+}
+
+/* Routine to write phonebook location in phone. */
+GSM_Error N7110_WritePhonebookLocation(GSM_PhonebookEntry *entry)
+{
+ unsigned char req[500] = {N7110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0c,
+ 0x00, 0x00, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00};
+ int count = 18, blocks;
+
+ if (entry->Name[0] != '\0' || entry->Number[0] != '\0') {
+ req[11] = N7110_GetMemoryType(entry->MemoryType);
+ req[12] = (entry->Location >> 8);
+ req[13] = entry->Location & 0xff;
+
+// if (entry->MemoryType == GMT_SM) entry->SubEntriesCount = 0;
+
+ count=count+N7110_EncodePhonebookFrame(req+18, *entry, &blocks);
+
+ req[17]=blocks;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Writing phonebook entry %s...\n"),entry->Name);
+#endif
+
+ return NULL_SendMessageSequence(50, &CurrentPhonebookError, count, 0x03, req);
+
+ } else {
+
+ /* empty name & number => we have to delete the phonebook record! */
+ return N7110_DeletePhonebookLocation( entry );
+
+ }
+}
+
+void N7110_ReplyDeletePhonebookLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Phonebook entry deleted correctly\n"));
+#endif /* DEBUG */
+ CurrentPhonebookError = GE_NONE;
+}
+
+/* delete phonebookentry */
+/* Not used in this moment */
+GSM_Error N7110_DeletePhonebookLocation(GSM_PhonebookEntry *entry)
+{
+ unsigned char req[256] = {
+ N7110_FRAME_HEADER, 0x0f, 0x00, 0x01, 0x04,
+ 0x00, 0x00, 0x0c, 0x01, 0xff,
+ 0x00, /* location low*/
+ 0x01, /* location high*/
+ 0x05, /* mem location low*/
+ 0x00, /* mem location high*/
+ 0x00, 0x00
+ };
+
+ req[12] = (entry->Location >> 8);
+ req[13] = entry->Location & 0xff;
+ req[14] = N7110_GetMemoryType(entry->MemoryType);
+
+#ifdef DEBUG
+ fprintf(stdout, _("Deleting phonebook entry at location %d...\n"),entry->Location);
+#endif
+
+ return NULL_SendMessageSequence(50, &CurrentPhonebookError, 18, 0x03, req);
+}
+
+/* for saving group logos only */
+GSM_Error N7110_WriteGroupDataLocation(GSM_Bitmap *bitmap)
+{
+ unsigned char req[500] = {N6110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0c,
+ 0x00, 0x10, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00};
+ char string[500];
+ int block=0, i;
+ unsigned int count = 18;
+
+ req[13] = bitmap->number + 1;
+
+ /* Logo on/off */
+ string[0] = bitmap->enabled?1:0;
+ string[1] = 0;
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_LOGOON, 2, block++, string, req + count);
+
+ /* Ringtone */
+ string[0] = bitmap->ringtone;
+ string[1] = 0;
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_RINGTONE, 2, block++, string, req + count);
+
+ /* Number of group */
+ string[0] = bitmap->number+1;
+ string[1] = 0;
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_GROUP, 2, block++, string, req + count);
+
+ /* Name */
+ if (*bitmap->text) {
+ i = strlen(bitmap->text);
+ string[0] = i * 2 + 2;
+ EncodeUnicode((string + 1), bitmap->text, i);
+ string[i * 2 + 1] = 0; // Terminating 0
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_NAME, i * 2 + 2, block++, string, req + count);
+ }
+
+ /* Logo */
+ string[0] = bitmap->width;
+ string[1] = bitmap->height;
+ string[2] = 0;
+ string[3] = 0;
+ string[4] = bitmap->size;
+ memcpy(string + 5, bitmap->bitmap, bitmap->size);
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_GROUPLOGO, bitmap->size + 5, block++, string, req + count);
+
+ req[17] = block; //number of blocks
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, count, 0x03, req);
+}
+
+GSM_Error N7110_GetSpeedDial(GSM_SpeedDial *entry)
+{
+ unsigned char req[] = {N7110_FRAME_HEADER, 0x07, 0x01, 0x01, 0x00, 0x01,
+ 0x02, //memory type
+ 0x05,
+ 0x00, 0x00, //location
+ 0x00, 0x00};
+
+ GSM_PhonebookEntry entry2;
+ GSM_Error error;
+
+ CurrentPhonebookEntry = &entry2;
+
+ CurrentSpeedDialEntry = entry;
+
+ req[9] = N7110_MEMORY_SD;
+ req[10] = (entry->Number>>8);
+ req[11] = entry->Number & 0xff;
+
+ error=NULL_SendMessageSequence
+ (50, &CurrentSpeedDialError, 14, 0x03, req);
+
+ /* Full compatibility with 6110 */
+ if (error==GE_INVALIDSPEEDDIALLOCATION) {
+ entry->Location=0;
+ entry->MemoryType=GMT_MT;
+ return GE_NONE;
+ } else return error;
+}
+
+/* Experimental ! */
+GSM_Error N7110_SetSpeedDial(GSM_SpeedDial *entry)
+{
+ unsigned char req[500] = {N6110_FRAME_HEADER, 0x0b, 0x00, 0x01, 0x01, 0x00, 0x00, 0x0c,
+ 0x00, 0x0e, /* memory type */
+ 0x00, 0x00, /* location */
+ 0x00, 0x00, 0x00};
+ char string[500];
+ int block=1;
+ unsigned int count = 18;
+
+ req[13] = entry->Number;
+
+ string[0]= 0xff;
+ string[1]= entry->Location/256;
+ string[2]= entry->Location%256;
+ string[3]= 0x05;
+ string[4]= string[5] = 0;
+ count += N7110_PackPBKBlock(N7110_ENTRYTYPE_SPEEDDIAL, 6, block++, string, req + count);
+
+ req[17] = block - 1; //number of blocks
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, count, 0x03, req);
+}
+
+/* Set a bitmap or welcome-note */
+GSM_Error N7110_SetBitmap(GSM_Bitmap *Bitmap)
+{
+ unsigned char reqStartup[1000] = { N7110_FRAME_HEADER,
+ 0xec, 0x15, // Startup Logo
+ 0x00, 0x00, 0x00, 0x04,
+ 0xc0, 0x02, 0x00,
+ 0x00, // Bitmap height
+ 0xc0, 0x03, 0x00,
+ 0x00, // Bitmap width
+ 0xc0, 0x04, 0x03, 0x00
+ }; // Bitmap following
+ unsigned char reqOp[1000] = { N7110_FRAME_HEADER,
+ 0xa3, 0x01,
+ 0x00, // logo disabled
+ 0x00, 0xf0, 0x00, // network code (000 00)
+ 0x00 ,0x04,
+ 0x08, // length of rest
+ 0x00, 0x00, // Bitmap width / height
+ 0x00,
+ 0x00, // Bitmap size
+ 0x00, 0x00
+ }; // Bitmap following
+
+ /* Picture Images */
+ unsigned char req2[7] = { N6110_FRAME_HEADER, 0x96,0x00,0x0f,0x07 };
+ unsigned char req3[9] = { 0x09, 0x11, 0x19, 0x21, 0x29, 0x31, 0x39, 0x41, 0x49 };
+ unsigned char req4[500] = { N6110_FRAME_HEADER, 0x50, 0x07,
+ 0x00, //location
+ 0x00,0x00, //index
+ 0x07};
+
+ unsigned char req5[120] = {0x00, 0x01, 0x01, 0xec, 0x02,0x00};
+
+ unsigned char req6[]= {0x00,0x01,0x00,0xaf,0x00};
+
+ u16 count,i;
+
+ int timeout=60;
+
+ GSM_Error error;
+
+ CurrentSetBitmapError=GE_BUSY;
+
+ switch (Bitmap->type) {
+ case GSM_WelcomeNoteText:
+
+ EncodeUnicode (req5+5, Bitmap->text, strlen(Bitmap->text));
+ count=5+strlen(Bitmap->text)*2;
+ req5[count++]=0x00;
+ req5[count++]=0x00;
+ Protocol->SendMessage(count, 0x7a, req5);
+ break;
+
+ case GSM_DealerNoteText:
+ CurrentSetBitmapError = GE_NOTIMPLEMENTED;
+ break;
+
+ case GSM_StartupLogo:
+ case GSM_7110StartupLogo:
+ case GSM_6210StartupLogo:
+ reqStartup[12] = Bitmap->height;
+ reqStartup[16] = Bitmap->width;
+ count = 21;
+ memcpy(reqStartup+count,Bitmap->bitmap,Bitmap->size);
+ Protocol->SendMessage(count+Bitmap->size, 0x7a, reqStartup);
+ break;
+
+ case GSM_OperatorLogo:
+ case GSM_7110OperatorLogo:
+ count = 18;
+
+ /* set logo */
+ if (strcmp(Bitmap->netcode,"000 00")) {
+ reqOp[5] = 0x01; // Logo enabled
+ EncodeNetworkCode(reqOp+6, Bitmap->netcode);
+ reqOp[11] = 8+GSM_GetBitmapSize(Bitmap);
+ reqOp[12]=Bitmap->width;
+ reqOp[13]=Bitmap->height;
+ reqOp[15]=GSM_GetBitmapSize(Bitmap);
+ memcpy(reqOp+count,Bitmap->bitmap,Bitmap->size);
+ count += Bitmap->size;
+ } else {
+ for (i=0;i<5;i++) {
+ req6[4]=i;
+ error=NULL_SendMessageSequence
+ (50, &CurrentSetBitmapError, 5, 0x0a, req6);
+ if (error!=GE_NONE) return error;
+ }
+ }
+ Protocol->SendMessage(count, 0x0a, reqOp);
+ break;
+
+ case GSM_CallerLogo:
+ CurrentSetBitmapError = N7110_WriteGroupDataLocation(Bitmap);
+ break;
+
+ case GSM_PictureImage:
+ CurrentGetBitmap=Bitmap;
+ PictureImageNum=0;
+ count=0;
+ while (count!=9) {
+ req2[4]=req3[count];
+ PictureImageLoc=req3[count];
+ count++;
+ if (NULL_SendMessageSequence (50, &CurrentGetBitmapError, 7, 0x14, req2)!=GE_NONE) break;
+ if (PictureImageNum==Bitmap->number+1) break;
+ }
+ if (CurrentGetBitmapError!=GE_NONE) {
+ req4[5]=0x21;
+ req4[6]=0;
+ req4[7]=0;
+ } else {
+ req4[5]=PictureImageLoc;
+ req4[6]=PictureImageIndex/256;
+ req4[7]=PictureImageIndex%256;
+ }
+ count=7;
+ for (i=0;i<38;i++) req4[count++]=0x00;
+ req4[count++]=Bitmap->width;
+ req4[count++]=Bitmap->height;
+ req4[count++]=Bitmap->size/256;
+ req4[count++]=Bitmap->size%256;
+ memcpy(reqOp+count,Bitmap->bitmap,Bitmap->size);
+ count += Bitmap->size;
+ req4[count++]=0x00;
+ req4[count++]=0x00;
+
+ CurrentSetBitmapError = GE_BUSY;
+
+ Protocol->SendMessage(count, 0x14, req4);
+
+ case GSM_None:
+ return GE_NONE;
+ }
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentSetBitmapError == GE_BUSY ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ if ((Bitmap->type==GSM_OperatorLogo || Bitmap->type==GSM_7110OperatorLogo)
+ && CurrentSetBitmapError==GE_NONE && !strcmp(Bitmap->netcode,"000 00")) {
+ return N6110_Reset(0x03);
+ }
+
+ return CurrentSetBitmapError;
+}
+
+/* Get a bitmap from the phone */
+GSM_Error N7110_GetBitmap(GSM_Bitmap *Bitmap)
+{
+ unsigned char req[10] = { N6110_FRAME_HEADER };
+
+ /* Picture Images */
+ unsigned char req2[7] = { N6110_FRAME_HEADER, 0x96,0x00,0x0f,0x07 };
+ unsigned char req3[9] = { 0x09, 0x11, 0x19, 0x21, 0x29, 0x31, 0x39, 0x41, 0x49 };
+ unsigned char req4[9] = { N6110_FRAME_HEADER, 0x07,
+ 0x00, //location
+ 0x00,0x00, //index
+ 0x00, 0x64};
+
+ /* Welcome note */
+ unsigned char req5[] = {0x00, 0x01, 0x01, 0xee, 0x02};
+
+ u8 count=3;
+ int timeout;
+ GSM_PhonebookEntry entry;
+
+ CurrentGetBitmapError = GE_BUSY;
+
+ CurrentGetBitmap=Bitmap;
+
+ switch (CurrentGetBitmap->type) {
+ case GSM_StartupLogo:
+ case GSM_7110StartupLogo:
+ case GSM_6210StartupLogo:
+ req[count-1]=0x01; /* change FRAME_HEADER */
+ req[count++]=0xee; /* to get 0x01ee */
+ req[count++]=0x15;
+ Protocol->SendMessage(count, 0x7a, req);
+ break;
+
+ case GSM_WelcomeNoteText:
+
+ Protocol->SendMessage(5, 0x7a, req5);
+ break;
+
+ case GSM_DealerNoteText:
+
+ return GE_NOTIMPLEMENTED;
+
+ case GSM_OperatorLogo:
+ case GSM_7110OperatorLogo:
+ req[count++]=0x70; /* NetworkStatus */
+ Protocol->SendMessage(count, 0x0a, req);
+ break;
+
+ case GSM_CallerLogo:
+ entry.MemoryType = GMT_CG;
+ entry.Location = Bitmap->number+1;
+ *Bitmap->text=0;
+ Bitmap->ringtone=0xFF;
+ Bitmap->enabled=true;
+ CurrentGetBitmapError = N7110_GetMemoryLocation(&entry);
+ CurrentGetBitmap=NULL;
+ if (entry.Location!=Bitmap->number+1) return GE_UNKNOWN;
+ if (!strcmp(Bitmap->text,"")) {
+ switch(Bitmap->number) {
+ case 0:strcpy(Bitmap->text,"Family\0");break;
+ case 1:strcpy(Bitmap->text,"VIP\0");break;
+ case 2:strcpy(Bitmap->text,"Friends\0");break;
+ case 3:strcpy(Bitmap->text,"Colleagues\0");break;
+ case 4:strcpy(Bitmap->text,"Other\0");break;
+ }
+ }
+ break;
+
+ case GSM_PictureImage:
+
+ PictureImageNum=0;
+ count=0;
+ while (count!=9) {
+ req2[4]=req3[count];
+ PictureImageLoc=req3[count];
+ count++;
+ if (NULL_SendMessageSequence (50, &CurrentGetBitmapError, 7, 0x14, req2)!=GE_NONE)
+ return CurrentGetBitmapError;
+ if (PictureImageNum==Bitmap->number+1) break;
+ }
+ if (CurrentGetBitmapError!=GE_NONE) return CurrentGetBitmapError;
+
+ req4[4]=PictureImageLoc;
+ req4[5]=PictureImageIndex/256;
+ req4[6]=PictureImageIndex%256;
+
+ CurrentGetBitmapError = GE_BUSY;
+
+ Protocol->SendMessage(9, 0x14, req4);
+
+ break;
+
+ default:
+ return GE_NOTSUPPORTED;
+ }
+
+ timeout=150;
+
+ while (timeout != 0 && CurrentGetBitmapError == GE_BUSY) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ CurrentGetBitmap=NULL;
+
+ return (CurrentGetBitmapError);
+}
+
+int ReturnBinRingLocation()
+{
+ char model[64];
+
+ while (GSM->GetModel(model) != GE_NONE) sleep(1);
+
+ if (strcmp(model,"NSE-5") == 0) return 0x74; //first 0x74 //7110
+ if (strcmp(model,"NPE-3") == 0) return 0x89; //first is 0x89; //6210
+
+ return 0;
+}
+
+/*
+this works only for 6210, the 7110 needs upload to a location ?
+*/
+GSM_Error N7110_SetRingTone(GSM_Ringtone *ringtone, int *maxlength)
+{
+
+ /* Buffer for preview uploading */
+ unsigned char buffer[1000] = {0x7C, 0x01, 0x00, 0x0D,
+ 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ 0x00 // Length
+ };
+ int size=FB61_MAX_RINGTONE_FRAME_LENGTH;
+
+ GSM_NetworkInfo NetworkInfo;
+
+ char req[4000] = {N7110_FRAME_HEADER, 0x1F, 0x00,
+ 0x87, // Location
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0xFC, 0x09, 0x00, 0x0A, 0x01
+ };
+
+ /* Info from Till Toenshoff [till@uni.de]
+
+ One improvement - for looping you can use an alternative header
+ normal
+ 0x02, 0xFC, 0x09, 0x00, 0x0A, 0x01
+
+ loop
+ 0x02, 0xFC, 0x09, 0x00, 0x05, 0xLL, 0x0A, 0x01
+
+ LL=0x01-0x10
+
+ 0x01=loop once
+ [...]
+ 0x10=loop infinite
+ */
+ char tail[] = {0x40, 0x7D, 0x40, 0x5C, 0x0A, 0xFE, 0x40,
+ 0x20, 0x40, 0x7D, 0x40, 0x37, 0x0A, 0xFE,
+ 0x0A, 0x0A, 0x40, 0x32, 0x07, 0x0B // 20 Bytes tail
+ };
+
+//{ "c", "c#", "d", "d#", "e", "f", "f#", "g", "g#", "a", "a#", "h" };
+ char N7110_notes[14] =
+ { 0, 1, 2, 3, 4, 4, 5, 6, 7, 8, 9, 10 , 11, 11 };
+
+ int current = 6, i, note, lastnote = 0, duration;
+
+ /* Preview uploading */
+ if (ringtone->location==255) {
+ *maxlength=GSM_PackRingtone(ringtone, buffer+11, &size);
+ buffer[10] = size;
+ Protocol->SendMessage(size+11, 0x00, buffer);
+ GSM->GetNetworkInfo(&NetworkInfo); //need to make something
+ sleep(1);
+ return GE_NONE; //no answer from phone
+ }
+
+ req[5]=ReturnBinRingLocation()+ringtone->location;
+
+ EncodeUnicode (req+current,ringtone->name ,strlen(ringtone->name));
+
+ current = 43;
+
+ for (i=0; i<ringtone->NrNotes; i++) {
+
+ if (ringtone->notes[i].note == 255)
+ note = 0x40;
+ else
+ note = 114+12*((ringtone->notes[i].note/14)%4) + N7110_notes[ringtone->notes[i].note%14];
+
+ duration = 60000*ringtone->notes[i].duration/ringtone->notes[i].tempo/256; // in 8 ms ticks of 7110
+
+ switch (ringtone->notes[i].style) {
+ case StaccatoStyle:
+ if (duration) {
+ req[current++] = note; // note only for one tick
+ req[current++] = 1;
+ duration--;
+ }
+ note = 0x40; // rest pause
+ case NaturalStyle:
+ if (note != 0x40 && duration) {
+ req[current++] = 0x40;
+ req[current++] = 1; // small pause between notes
+ duration--;
+ }
+ default:
+ if (note != 0x40 && note == lastnote && duration) {
+ req[current++] = 0x40;
+ req[current++] = 1; // small pause between same notes
+ duration--;
+ }
+
+ while (duration > 125) {
+ req[current++] = note;
+ req[current++] = 125;
+ duration -= 125;
+ }
+ req[current++] = note;
+ req[current++] = duration;
+ }
+ lastnote = note;
+ }
+
+ for (i = 0; i < sizeof(tail); i++)
+ req[current++] = tail[i];
+
+ Protocol->SendMessage(current, 0x1F, req);
+
+ sleep(1);
+
+ return GE_NONE; //no answer from phone
+}
+
+void N7110_ReplyGetBinRingtone(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int i, tmp;
+
+ switch (MessageBuffer[3]) {
+
+ case 0x23:
+
+ tmp=0;i=4;
+ while (MessageBuffer[i]!=0 || MessageBuffer[i+1]!=0) {
+ tmp++;
+ i=i+2;
+ }
+
+ DecodeUnicode(CurrentGetBinRingtone->name,MessageBuffer+6,tmp);
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Received ringtone \"%s\"\n"),CurrentGetBinRingtone->name);
+#endif /* DEBUG */
+
+ CurrentGetBinRingtone->frame[0]=0x00;
+ CurrentGetBinRingtone->frame[1]=0x00;
+ CurrentGetBinRingtone->frame[2]=0x0c;
+ CurrentGetBinRingtone->frame[3]=0x01;
+ CurrentGetBinRingtone->frame[4]=0x2c;
+
+ memcpy(CurrentGetBinRingtone->frame+5,CurrentGetBinRingtone->name,strlen(CurrentGetBinRingtone->name));
+
+ CurrentGetBinRingtone->length=5+strlen(CurrentGetBinRingtone->name);
+
+ CurrentGetBinRingtone->frame[CurrentGetBinRingtone->length++]=0x00;
+ CurrentGetBinRingtone->frame[CurrentGetBinRingtone->length++]=0x00;
+
+ /* Looking for end */
+ i=37;
+ while (true) {
+ if (MessageBuffer[i]==0x07 && MessageBuffer[i+1]==0x0b) {
+ i=i+2;break;
+ }
+ if (MessageBuffer[i]==0x0e && MessageBuffer[i+1]==0x0b) {
+ i=i+2;break;
+ }
+ i++;
+ if (i==MessageLength) break;
+ }
+
+ /* Copying frame */
+ memcpy(CurrentGetBinRingtone->frame+CurrentGetBinRingtone->length,MessageBuffer+37,i-37);
+ CurrentGetBinRingtone->length=CurrentGetBinRingtone->length+i-37;
+
+ CurrentBinRingtoneError=GE_NONE;
+ break;
+
+ case 0x24:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Received empty ringtone\n"));
+#endif /* DEBUG */
+
+ CurrentBinRingtoneError=GE_INVALIDRINGLOCATION;
+ break;
+ }
+}
+
+GSM_Error N7110_GetBinRingTone(GSM_BinRingtone *ringtone)
+{
+
+ unsigned char req[6] = { N6110_FRAME_HEADER, 0x22, 0x00, 0x00 };
+
+ req[2]=0x01;
+
+ req[5]=ReturnBinRingLocation()+ringtone->location;
+
+ CurrentGetBinRingtone=ringtone;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentBinRingtoneError, 6, 0x1f, req);
+
+}
+
+GSM_Error N7110_SetBinRingTone(GSM_BinRingtone *ringtone)
+{
+ unsigned char req[1000] = { N6110_FRAME_HEADER, 0x1f, 0x00, 0x00 };
+
+ GSM_NetworkInfo NetworkInfo;
+
+ int i;
+
+ req[2]=0x01;
+
+ req[5]=ReturnBinRingLocation()+ringtone->location;
+
+ for (i=6;i<35;i++) req[i]=0x00;
+
+ i=6;
+
+ EncodeUnicode (req+i,ringtone->frame+5 ,strlen(ringtone->frame+5));
+
+ i=5;
+
+ while (ringtone->frame[i]!=0 || ringtone->frame[i+1]!=0) i++;
+
+ memcpy(req+35,ringtone->frame+i,ringtone->length-i);
+
+ Protocol->SendMessage(35+ringtone->length-i, 0x1f, req);
+
+ GSM->GetNetworkInfo(&NetworkInfo); //need to make something
+
+ return GE_NONE; //no answer from phone
+}
+
+void N7110_ReplyIncomingSMS(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ GSM_SMSMessage NullSMS;
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: Incoming SMS\n"));
+#endif /* DEBUG */
+
+ GSM_DecodeNokiaSMSFrame(&NullSMS, MessageBuffer+5, MessageLength-5);
+
+#ifdef DEBUG
+ fprintf(stdout, _("\n"));
+#endif /* DEBUG */
+}
+
+void N7110_Dispatch0x0AMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int count;
+
+#ifdef DEBUG
+ char name[100];
+#endif
+
+ GSM_NetworkInfo NullNetworkInfo;
+
+ switch (MessageBuffer[3]) {
+
+ case 0xb0:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Clearing operator logo msg\n"));
+#endif
+ CurrentSetBitmapError=GE_NONE;
+ break;
+
+ case 0x71:
+
+ /* Make sure we are expecting NetworkInfo frame */
+ if ((CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY) ||
+ (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY)) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Network informations and operator logo:\n"));
+#endif
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Network informations not requested, but received:\n"));
+#endif
+ }
+
+ sprintf(NullNetworkInfo.NetworkCode, "%x%x%x %x%x", MessageBuffer[14] & 0x0f, MessageBuffer[14] >>4, MessageBuffer[15] & 0x0f, MessageBuffer[16] & 0x0f, MessageBuffer[16] >>4);
+
+ sprintf(NullNetworkInfo.CellID, "%02x%02x", MessageBuffer[10], MessageBuffer[11]);
+
+ sprintf(NullNetworkInfo.LAC, "%02x%02x", MessageBuffer[12], MessageBuffer[13]);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" CellID: %s\n"), NullNetworkInfo.CellID);
+ fprintf(stdout, _(" LAC: %s\n"), NullNetworkInfo.LAC);
+ fprintf(stdout, _(" Network code: %s\n"), NullNetworkInfo.NetworkCode);
+ fprintf(stdout, _(" Network name for gnokii: %s (%s)\n"),
+ GSM_GetNetworkName(NullNetworkInfo.NetworkCode),
+ GSM_GetCountryName(NullNetworkInfo.NetworkCode));
+
+ DecodeUnicode(name,MessageBuffer+18,MessageBuffer[17]);
+ fprintf(stdout, _(" Network name for phone: %s\n"),name);
+
+ fprintf(stdout, _(" Status: "));
+ switch (MessageBuffer[8]) {
+ case 0x01: fprintf(stdout, _("home network selected")); break;
+ case 0x02: fprintf(stdout, _("roaming network")); break;
+ case 0x03: fprintf(stdout, _("requesting network")); break;
+ case 0x04: fprintf(stdout, _("not registered in the network")); break;
+ default: fprintf(stdout, _("unknown"));
+ }
+
+ fprintf(stdout, "\n");
+
+ fprintf(stdout, _(" Network selection: %s\n"), MessageBuffer[9]==1?_("manual"):_("automatic"));
+#endif /* DEBUG */
+
+ /* Make sure we are expecting NetworkInfo frame */
+ if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY) {
+ *CurrentNetworkInfo=NullNetworkInfo;
+ CurrentNetworkInfoError = GE_NONE;
+ }
+
+ /* Make sure we are expecting an operator logo */
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY) {
+
+ strcpy(CurrentGetBitmap->netcode,NullNetworkInfo.NetworkCode);
+
+#ifdef DEBUG
+ if (MessageBuffer[4] == 0x02)
+ fprintf(stdout, _("Message: Operator Logo for %s (%s) network received.\n"),
+ CurrentGetBitmap->netcode,
+ GSM_GetNetworkName(CurrentGetBitmap->netcode));
+ else
+ fprintf(stdout, _("Message: No Operator Logo for %s (%s) network received.\n"),
+ CurrentGetBitmap->netcode,
+ GSM_GetNetworkName(CurrentGetBitmap->netcode));
+#endif
+
+ CurrentGetBitmap->type=GSM_7110OperatorLogo;
+ if (MessageBuffer[4] == 0x02) { /* logo present */
+ count = 7;
+ count += MessageBuffer[count]; /* skip network info */
+ count ++;
+ CurrentGetBitmap->width=MessageBuffer[count++]; /* 78 */
+ CurrentGetBitmap->height=MessageBuffer[count++]; /* 21 */
+ count+=4;
+ CurrentGetBitmap->size=GSM_GetBitmapSize(CurrentGetBitmap); /* packed size */
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+count,CurrentGetBitmap->size);
+ } else {
+ CurrentGetBitmap->width=78;
+ CurrentGetBitmap->height=21;
+ CurrentGetBitmap->size=GSM_GetBitmapSize(CurrentGetBitmap); /* packed size */
+ memset(CurrentGetBitmap->bitmap,0,CurrentGetBitmap->size);
+ }
+ CurrentGetBitmapError=GE_NONE;
+ }
+
+ break;
+
+ case 0x82:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Network Level received:\n"));
+
+ fprintf(stdout, _(" Network Level: %d\n"), MessageBuffer[4]);
+#endif /* DEBUG */
+
+ CurrentRFLevel=MessageBuffer[4];
+ break;
+
+ case 0xa4:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Operator logo set correctly.\n"));
+#endif
+ CurrentSetBitmapError = GE_NONE;
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x0a\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N7110_Dispatch0x14Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int i, tmp;
+ GSM_ETSISMSMessage ETSI;
+
+ switch (MessageBuffer[3]) {
+
+ /* We have requested invalid or empty location. */
+ case 0x09:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS reading failed\n"));
+#endif /* DEBUG */
+
+ CurrentSMSMessageError = GE_INVALIDSMSLOCATION;
+ CurrentGetBitmapError=GE_UNKNOWN;
+ break;
+
+ /* getsms or picture image */
+ case 0x08:
+
+ if (MessageBuffer[8]==0x07) {
+
+ if (CurrentGetBitmap!=NULL) {
+
+ for (i=0;i<MessageBuffer[9]+1;i++)
+ ETSI.SMSCNumber[i]=MessageBuffer[i+9];
+
+ for (i=0;i<((MessageBuffer[22]+1)/2+1)+1;i++)
+ ETSI.Number[i]=MessageBuffer[22+i];
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Picture Image received\n"));
+ fprintf(stdout, _(" SMS center number: %s\n"), GSM_UnpackSemiOctetNumber(ETSI.SMSCNumber,false));
+ fprintf(stdout, _(" Sender number: %s\n"), GSM_UnpackSemiOctetNumber(ETSI.Number,true));
+#endif /* DEBUG */
+
+ strcpy(CurrentGetBitmap->Sender,GSM_UnpackSemiOctetNumber(ETSI.Number,true));
+
+ CurrentGetBitmap->width=MessageBuffer[47];
+ CurrentGetBitmap->height=MessageBuffer[48];
+ CurrentGetBitmap->size=GSM_GetBitmapSize(CurrentGetBitmap);
+
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+51,CurrentGetBitmap->size);
+
+ tmp=GSM_UnpackEightBitsToSeven(0, 121, 121, MessageBuffer+52+CurrentGetBitmap->size,
+ CurrentGetBitmap->text);
+
+ CurrentGetBitmap->text[MessageBuffer[51+CurrentGetBitmap->size]]=0;
+
+ CurrentGetBitmapError=GE_NONE;
+
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Picture Image received, but not reqested\n"));
+#endif /* DEBUG */
+
+ CurrentSMSMessageError = GE_SMSTOOLONG;
+ }
+
+ break;
+ } else {
+ /* sms message */
+ /* status in byte 4 */
+ CurrentSMSMessage->Status = MessageBuffer[4];
+
+ CurrentSMSMessage->Type = GST_SMS;
+ if (MessageBuffer[8]==0x01) CurrentSMSMessage->Type = GST_DR;
+
+ CurrentSMSMessage->MessageNumber = CurrentSMSMessage->Location;
+
+ /* RTH FIXME: old folder stuff for xgnokii */
+ CurrentSMSMessage->folder = (MessageBuffer[5] / 8)-1;
+ /* if unreadMessage from folder 0, set INBOX folder */
+ if (CurrentSMSMessage->folder==-1) CurrentSMSMessage->folder = 0;
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message received: Type: %i Folder: %i Location: %i\n")
+ ,CurrentSMSMessage->Type, CurrentSMSMessage->folder, MessageBuffer[7]);
+#endif /* DEBUG */
+
+ GSM_DecodeNokiaSMSFrame(CurrentSMSMessage, MessageBuffer+9, MessageLength-9);
+
+ /* Signal no error to calling code. */
+ CurrentSMSMessageError = GE_NONE;
+ break;
+ }
+
+ case 0x97:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Received index for Picture Images\n"));
+#endif /* DEBUG */
+
+ for (i=1;i<MessageBuffer[4]*256+MessageBuffer[5]+1;i++) {
+ PictureImageNum++;
+ if (PictureImageNum==CurrentGetBitmap->number+1) {
+ PictureImageIndex=MessageBuffer[4+i*2]*256+MessageBuffer[5+i*2];
+ break;
+ }
+ }
+
+ CurrentGetBitmapError=GE_NONE;
+ CurrentSetBitmapError=GE_NONE;
+
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 14\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N7110_Dispatch0x17Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ switch (MessageBuffer[3]) {
+
+ case 0x03:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Battery status received:\n"));
+
+ fprintf(stdout, _(" Battery Level: %d\n"), MessageBuffer[5]);
+#endif /* DEBUG */
+
+ CurrentBatteryLevel=MessageBuffer[5];
+ break;
+
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message of type 0x17\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N7110_Dispatch0x7AMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ int i, tmp;
+
+ switch (MessageBuffer[3]) {
+
+ /* Setting setting request */
+ case 0xeb:
+
+ switch (MessageBuffer[4]) {
+ case 0x02:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Startup text set correctly.\n"));
+#endif
+ CurrentSetBitmapError = GE_NONE;
+ break;
+
+ case 0x15:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Startup logo set correctly.\n"));
+#endif
+ CurrentSetBitmapError = GE_NONE;
+ break;
+ }
+
+ break;
+
+ /* Setting received */
+ case 0xed:
+
+ switch (MessageBuffer[4]) {
+ case 0x02:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Startup text received.\n"));
+#endif
+
+ tmp=0;i=6;
+ while (MessageBuffer[i]!=0||MessageBuffer[i+1]!=0) {
+ i=i+2;
+ tmp++;
+ }
+
+ DecodeUnicode (CurrentGetBitmap->text, MessageBuffer+6, tmp);
+
+#ifdef DEBUG
+ fprintf(stdout, _(" Text: \"%s\"\n"),CurrentGetBitmap->text);
+#endif
+
+ CurrentGetBitmapError = GE_NONE;
+ break;
+
+ case 0x15:
+#ifdef DEBUG
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY)
+ fprintf(stdout, _("Message: Startup logo received.\n"));
+ else
+ fprintf(stdout, _("Message: Startup logo not requested, but received.\n"));
+#endif
+
+ /* Make sure we are expecting a startup logo */
+ if (CurrentGetBitmap && CurrentGetBitmapError == GE_BUSY) {
+ CurrentGetBitmap->height=MessageBuffer[13]; /* 96 */
+ CurrentGetBitmap->width=MessageBuffer[17]; /* 60/65 */
+ CurrentGetBitmap->type=GSM_7110StartupLogo;
+ if (CurrentGetBitmap->width==60) CurrentGetBitmap->type=GSM_6210StartupLogo;
+ CurrentGetBitmap->size=GSM_GetBitmapSize(CurrentGetBitmap); /* unpacked size */
+ if (CurrentGetBitmap->size > sizeof(CurrentGetBitmap->bitmap))
+ CurrentGetBitmap->size=sizeof(CurrentGetBitmap->bitmap);
+ memcpy(CurrentGetBitmap->bitmap,MessageBuffer+22,CurrentGetBitmap->size);
+ CurrentGetBitmapError=GE_NONE;
+ }
+ break;
+ case 0x1c:
+#ifdef DEBUG
+ fprintf(stdout, _("Message: security code \""));
+
+ for (i=6;i<11;i++) {
+ fprintf(stdout, _("%c"),MessageBuffer[i]);
+ }
+
+ fprintf(stdout,_("\"received.\n"));
+#endif
+ strncpy(CurrentSecurityCode->Code,MessageBuffer+6,6);
+
+ CurrentSecurityCodeError=GE_NONE;
+ break;
+ }
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type 0x7a.\n"));
+#endif
+ AppendLogText("Unknown msg\n",false);
+ break; /* Visual C Don't like empty cases */
+ }
+}
+
+void N7110_DispatchMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+ bool unknown=false;
+
+ /* Switch on the basis of the message type byte */
+ switch (MessageType) {
+
+ /* Call information */
+ /* Note, we use N6110_Dispatch0x40Message, but only some of 0x01
+ old msg are available in new phones - other returns generally only
+ errors */
+ case 0x01:
+
+ N6110_Dispatch0x01Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* SMS handling */
+ case 0x02:
+ switch (MessageBuffer[3]) {
+ case 0x02:
+ case 0x03:N6110_ReplySendSMSMessage(MessageLength,MessageBuffer,MessageType);break;
+ case 0x0e:
+ case 0x0f:N7110_ReplyEnableIncomingSMSInfo(MessageLength,MessageBuffer,MessageType);break;
+ case 0x11:N7110_ReplyIncomingSMS (MessageLength,MessageBuffer,MessageType);break;
+ case 0x21:N6110_ReplySetCellBroadcast (MessageLength, MessageBuffer, MessageType);break;
+ case 0x23:N6110_ReplyReadCellBroadcast (MessageLength, MessageBuffer, MessageType);break;
+ case 0x31:N6110_ReplySetSMSCenter (MessageLength,MessageBuffer,MessageType);break;
+ case 0x34:
+ case 0x35:N6110_ReplyGetSMSCenter(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Phonebook and speed dials */
+ case 0x03:
+ switch (MessageBuffer[3]) {
+ case 0x04:N7110_ReplyGetMemoryStatus (MessageLength,MessageBuffer,MessageType);break;
+ case 0x08:N7110_ReplyGetMemoryLocation (MessageLength,MessageBuffer,MessageType);break;
+ case 0x10:N7110_ReplyDeletePhonebookLocation(MessageLength,MessageBuffer,MessageType);break;
+ case 0x0C:N7110_ReplyWritePhonebookLocation (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* This is call forwarding stuff */
+ case 0x06:
+ switch (MessageBuffer[3]) {
+ case 0x02:
+ case 0x03:N6110_ReplyCallDivert (MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x06Message(MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* Network and operator logo */
+ case 0x0a:
+
+ N7110_Dispatch0x0AMessage(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* Calendar notes handling */
+ case 0x13:
+ switch (MessageBuffer[3]) {
+ case 0x02:
+ case 0x04:
+ case 0x06:
+ case 0x08:N7110_ReplyWriteCalendarNote (MessageLength,MessageBuffer,MessageType);break;
+ case 0x0c:N7110_ReplyDeleteCalendarNote (MessageLength,MessageBuffer,MessageType);break;
+ case 0x1A:N7110_ReplyGetCalendarNote (MessageLength,MessageBuffer,MessageType);break;
+ case 0x32:N7110_ReplyFirstCalendarFreePos(MessageLength,MessageBuffer,MessageType);break;
+ case 0x3b:N7110_ReplyGetCalendarNotesInfo(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* SMS stuff */
+ case 0x14:
+ switch (MessageBuffer[3]) {
+ case 0x05:
+ case 0x06:N7110_ReplySaveSMSMessage (MessageLength,MessageBuffer,MessageType);break;
+ case 0x0b:N7110_ReplyDeleteSMSMessage (MessageLength,MessageBuffer,MessageType);break;
+ case 0x37:
+ case 0x38:N7110_ReplyGetSMSStatus (MessageLength,MessageBuffer,MessageType);break;
+ case 0x6C:N7110_ReplyGetSMSFolderStatus(MessageLength,MessageBuffer,MessageType);break;
+ case 0x7B:N7110_ReplyGetSMSFolders (MessageLength,MessageBuffer,MessageType);break;
+ case 0x84:N7110_ReplySaveSMSMessage (MessageLength,MessageBuffer,MessageType);break;
+ default :N7110_Dispatch0x14Message (MessageLength, MessageBuffer, MessageType);break;
+ }
+ break;
+
+ /* Battery status */
+ case 0x17:
+
+ N7110_Dispatch0x17Message(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* Date and time */
+ case 0x19:
+ switch (MessageBuffer[3]) {
+ case 0x61:N6110_ReplySetDateTime(MessageLength,MessageBuffer,MessageType);break;
+ case 0x63:N6110_ReplyGetDateTime(MessageLength,MessageBuffer,MessageType);break;
+ case 0x6c:N6110_ReplySetAlarm (MessageLength,MessageBuffer,MessageType);break;
+ case 0x6e:N6110_ReplyGetAlarm (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Ringtones */
+ case 0x1f:
+ switch (MessageBuffer[3]) {
+ case 0x23:
+ case 0x24:N7110_ReplyGetBinRingtone(MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Profiles */
+ case 0x39:
+
+ N7110_ReplyGetProfile(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /* WAP */
+ case 0x3f:
+ switch (MessageBuffer[3]) {
+ case 0x01:
+ case 0x02:N7110_ReplyEnableWAPCommands(MessageLength,MessageBuffer,MessageType);break;
+ case 0x07:
+ case 0x08:N7110_ReplyGetWAPBookmark (MessageLength,MessageBuffer,MessageType);break;
+ case 0x0a:
+ case 0x0b:N7110_ReplySetWAPBookmark (MessageLength,MessageBuffer,MessageType);break;
+ case 0x16:
+ case 0x17:
+ case 0x1c:N7110_ReplyGetWAPSettings (MessageLength,MessageBuffer,MessageType);break;
+ default :unknown=true;break;
+ }
+ break;
+
+ /* Internal phone functions ? */
+ /* Note, we use N6110_Dispatch0x40Message, but only some of 0x40
+ old msg are available in new phones - other returns generally only
+ errors */
+ case 0x40:
+ switch (MessageBuffer[2]) {
+ case 0x64:N6110_ReplyEnableExtendedCommands (MessageLength,MessageBuffer,MessageType);break;
+ case 0x65:N6110_ReplyResetPhoneSettings (MessageLength,MessageBuffer,MessageType);break;
+ case 0x66:N6110_ReplyIMEI (MessageLength,MessageBuffer,MessageType);break;
+ case 0x6a:N6110_ReplyGetProductProfileSetting(MessageLength,MessageBuffer,MessageType);break;
+ case 0x6b:N6110_ReplySetProductProfileSetting(MessageLength,MessageBuffer,MessageType);break;
+ case 0x7e:N6110_ReplyNetmonitor (MessageLength,MessageBuffer,MessageType);break;
+ case 0x8a:N6110_ReplySimlockInfo (MessageLength,MessageBuffer,MessageType);break;
+ case 0x8f:N6110_ReplyPlayTone (MessageLength,MessageBuffer,MessageType);break;
+ case 0xc8:N6110_ReplyHW (MessageLength,MessageBuffer,MessageType);break;
+ default :N6110_Dispatch0x40Message (MessageLength,MessageBuffer,MessageType);break;
+ }
+ break;
+
+ /* Settings */
+ case 0x7a:
+
+ N7110_Dispatch0x7AMessage(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /***** Acknowlegment of our frames. *****/
+ case FBUS_FRTYPE_ACK:
+
+ N6110_DispatchACKMessage(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ case 0xd2:
+
+ N6110_ReplyID(MessageLength, MessageBuffer, MessageType);
+ break;
+
+ /***** Unknown message *****/
+ /* If you think that you know the exact meaning of other messages - please
+ let us know. */
+ default:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Unknown message type.\n"));
+#endif /* DEBUG */
+ AppendLogText("Unknown msg type\n",false);
+ break;
+
+ }
+
+ if (unknown) {
+#ifdef DEBUG
+ fprintf(stdout, _("Unknown message of type %02x.\n"),MessageType);
+#endif
+ AppendLogText("Unknown msg\n",false);
+ }
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for accessing functions on the at and similar
+ phones.
+
+*/
+
+/* "Turn on" prototypes in n-at.h */
+
+#define __n_at_c
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef WIN32
+ #include "devices/device.h"
+#endif
+
+#ifdef WIN32
+ #include "misc_win32.h"
+#endif
+
+/* Various header file */
+#ifndef VC6
+ #include "config.h"
+#endif
+
+#include "gsm-api.h"
+#include "gsm-coding.h"
+#include "newmodules/newat.h"
+#include "newmodules/n6110.h"
+/* Global variables used by code in gsm-api.c to expose the functions
+ supported by this model of phone. */
+
+
+
+
+
+
+/* Here we initialise model specific functions. */
+
+GSM_Functions Nat_Functions = {
+ Nat_Initialise,
+ Nat_DispatchMessage,
+ NULL_Terminate,
+ NULL_KeepAlive,
+ Nat_GetMemoryLocation,
+ Nat_WritePhonebookLocation,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ Nat_GetMemoryStatus,
+ Nat_GetSMSStatus,
+ Nat_GetSMSCenter,
+ Nat_SetSMSCenter,
+ Nat_GetSMSMessage,
+ Nat_DeleteSMSMessage,
+ Nat_SendSMSMessage,
+ Nat_SaveSMSMessage,
+ Nat_GetRFLevel,
+ Nat_GetBatteryLevel,
+ Nat_GetPowerSource,
+ Nat_GetDisplayStatus, //fill it
+ Nat_EnterSecurityCode,
+ Nat_GetSecurityCodeStatus,
+ UNIMPLEMENTED,
+ N6110_GetIMEI,
+ N6110_GetRevision,
+ N6110_GetModel,
+ Nat_GetDateTime,
+ Nat_SetDateTime,
+ Nat_GetAlarm,
+ Nat_SetAlarm, //doesn't work correctly...
+ Nat_DialVoice,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ Nat_GetNetworkInfo,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ Nat_SendDTMF,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ Nat_CancelCall,
+ Nat_PressKey, //fill it
+ UNIMPLEMENTED, //DisplayOutput= AT+CDIS
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ N6110_GetSMSFolders,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ UNIMPLEMENTED,
+ Nat_CallDivert,
+ UNIMPLEMENTED,
+ Nat_GetManufacturer
+};
+
+/* Mobile phone information */
+
+GSM_Information Nat_Information = {
+ "", /* Supported models in FBUS */
+ "at", /* Supported models in MBUS */
+ "", /* Supported models in FBUS over infrared */
+ "", /* Supported models in FBUS over DLR3 */
+ "at", /* Supported models in AT commands mode */
+ "",
+ "",
+ 4, /* Max RF Level */
+ 0, /* Min RF Level */
+ GRF_Arbitrary, /* RF level units */
+ 4, /* Max Battery Level */
+ 0, /* Min Battery Level */
+ GBU_Arbitrary, /* Battery level units */
+ GDT_None, /* No date/time support */
+ GDT_None, /* No alarm support */
+ 0 /* Max alarms = 0 */
+};
+
+/* Type of SMS mode. 0=PDU mode; 1=text mode */
+int SMSATCMGF=-1; //-1 when not used earlier
+#define SMS_AT_PDU 0
+#define SMS_AT_TEXT 1
+
+/* Type of charset for phonebook 0=GSM; 1=HEX */
+int PBKATCSCS=-1; //-1 when not used earlier
+#define PBK_AT_GSM 0
+#define PBK_AT_HEX 1
+
+/* Manufacturer of connected AT compatible phone */
+int ATMan=-1; // -1 when not used earlier
+#define AT_MAN_NOKIA 0
+#define AT_MAN_SIEMENS 1
+
+int ExtractOneParameter(unsigned char *input, unsigned char *output)
+{
+ int position=0;
+
+ while (*input!=',' && *input!=0x0d) {
+ *output=*input;
+ input++;
+ output++;
+ position++;
+ }
+ *output=0;
+ position++;
+ return position;
+}
+
+void ATDecodeDateTime(GSM_DateTime *dt, unsigned char *input)
+{
+ dt->Year=2000+(*input-'0')*10; input++;
+ dt->Year=dt->Year+(*input-'0'); input++;
+
+ input++;
+ dt->Month=(*input-'0')*10; input++;
+ dt->Month=dt->Month+(*input-'0'); input++;
+
+ input++;
+ dt->Day=(*input-'0')*10; input++;
+ dt->Day=dt->Day+(*input-'0'); input++;
+
+ input++;
+ dt->Hour=(*input-'0')*10; input++;
+ dt->Hour=dt->Hour+(*input-'0'); input++;
+
+ input++;
+ dt->Minute=(*input-'0')*10; input++;
+ dt->Minute=dt->Minute+(*input-'0');input++;
+
+ input++;
+ dt->Second=(*input-'0')*10; input++;
+ dt->Second=dt->Second+(*input-'0');input++;
+
+ if (input!=NULL) {
+ input++;
+ dt->Timezone=(*input-'0')*10; input++;
+ dt->Timezone=dt->Timezone+(*input-'0');input++;
+ input=input-2;
+ if (*input=='-') dt->Timezone=-dt->Timezone;
+ }
+}
+
+void Nat_ReplyGetIMEI(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ strncpy(Current_IMEI,MessageBuffer+10,15);
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: IMEI %s received\n"),Current_IMEI);
+#endif
+
+ CurrentGetIMEIError=GE_NONE;
+}
+
+GSM_Error Nat_SendIMEIFrame()
+{
+ unsigned char req[8] = {"AT+CGSN\r"};
+
+ return NULL_SendMessageSequence
+ (50, &CurrentGetIMEIError, 8, 0x00, req);
+}
+
+void Nat_ReplyGetID(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i;
+
+ i=10;
+ if (strncmp("Nokia Communicator GSM900/1800",MessageBuffer+i,30)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Mobile phone model identification received:\n"));
+ fprintf(stdout, _(" Model: RAE-3\n"));
+#endif
+ strcpy(Current_Model,"RAE-3");
+
+ } else {
+ while (MessageBuffer[i]!=0x0d && MessageBuffer[i]!=0x0a) {
+ Current_Model[i-10]=MessageBuffer[i];
+ i++;
+ }
+ Current_Model[i-9]=0;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Mobile phone model identification received:\n"));
+ fprintf(stdout, _(" Model: %s\n"),Current_Model);
+#endif
+ }
+
+ CurrentMagicError=GE_NONE;
+}
+
+GSM_Error Nat_SendIDFrame()
+{
+ unsigned char req[8] = {"AT+CGMM\r"};
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMagicError, 8, 0x00, req);
+}
+
+void Nat_ReplyGetHW(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ int i,current;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Mobile phone model identification received:\n"));
+#endif
+
+ switch (ATMan) {
+ case AT_MAN_NOKIA:
+#ifdef DEBUG
+ fprintf(stdout, _(" Firmware: "));
+ for (i=12;i<17;i++) fprintf(stdout,_("%c"),MessageBuffer[i]);
+ fprintf(stdout, _("\n"));
+ /* Some Nokia phones like 9210 return only firmware */
+ if (MessageLength>22) {
+ fprintf(stdout, _(" Hardware: "));
+ for (i=21;i<25;i++) fprintf(stdout,_("%c"),MessageBuffer[i]);
+ fprintf(stdout, _("\n"));
+ }
+#endif
+
+ strcpy(Current_Revision,"SW");current=2;
+ for (i=12;i<17;i++) Current_Revision[current++]=MessageBuffer[i];
+ Current_Revision[current++]=',';
+ Current_Revision[current++]=' ';
+ Current_Revision[current++]='H';
+ Current_Revision[current++]='W';
+ if (MessageLength>22) {
+ for (i=21;i<25;i++) Current_Revision[current++]=MessageBuffer[i];
+ } else {
+ /* Some Nokia phones like 9210 return only firmware */
+ /* Here we copy firmware as hardware */
+ for (i=12;i<17;i++) Current_Revision[current++]=MessageBuffer[i];
+ }
+ break;
+ case AT_MAN_SIEMENS:
+ current=0;i=18;
+ strcpy(Current_Revision,"SW");current=2;
+ while (MessageBuffer[i]!=0x0d && MessageBuffer[i]!=0x0a) {
+ Current_Revision[current++]=MessageBuffer[i];
+ i++;
+ }
+ Current_Revision[current++]=',';
+ Current_Revision[current++]=' ';
+ Current_Revision[current++]='H';
+ Current_Revision[current++]='W';
+ i=18;
+ while (MessageBuffer[i]!=0x0d && MessageBuffer[i]!=0x0a) {
+ Current_Revision[current++]=MessageBuffer[i];
+ i++;
+ }
+
+ break;
+ default:
+ strcpy(Current_Revision,"SWxx.xx, HWxxxx");
+ break;
+ }
+
+ CurrentGetHWError=GE_NONE;
+}
+
+GSM_Error Nat_SendHWFrame()
+{
+ unsigned char req[8] = {"AT+CGMR\r"};
+
+ return NULL_SendMessageSequence
+ (50, &CurrentGetHWError, 8, 0x00, req);
+}
+
+void Nat_ReplyGetManufacturer(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: phone manufacturer received\n"));
+#endif
+
+ if (strstr(MessageBuffer,"Nokia")) {
+#ifdef DEBUG
+ fprintf(stdout, _(" Nokia\n"));
+#endif
+ ATMan=AT_MAN_NOKIA;
+ }
+
+ if (strstr(MessageBuffer,"SIEMENS")) {
+#ifdef DEBUG
+ fprintf(stdout, _(" Siemens\n"));
+#endif
+ ATMan=AT_MAN_SIEMENS;
+ }
+
+ CurrentMagicError=GE_NONE;
+}
+
+GSM_Error Nat_SendManufacturerFrame()
+{
+ unsigned char req[8] = {"AT+CGMI\r"};
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMagicError, 8, 0x00, req);
+}
+
+/* Initialise variables and state machine. */
+GSM_Error Nat_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+ if (Protocol->Initialise(port_device,initlength,connection,rlp_callback)!=GE_NONE)
+ {
+ return GE_NOTSUPPORTED;
+ }
+
+
+ /* We try to escape AT+CMGS mode, at least Siemens M20 then needs to get some rest
+ */
+// WRITEPHONE(PortFD,"\x1B\r",2);
+// usleep(500000);
+
+ usleep(100);
+
+ if (Nat_SendManufacturerFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (Nat_SendIMEIFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (Nat_SendHWFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ if (Nat_SendIDFrame()!=GE_NONE) return GE_TIMEOUT;
+
+ /* In AT doesn't have any init strings, etc. Phone answered with frame,
+ so connection should be enabled ;-) */
+ CurrentLinkOK = true;
+
+ return (GE_NONE);
+}
+
+GSM_Error Nat_GetManufacturer(char* manufacturer)
+{
+ switch (ATMan) {
+ case AT_MAN_NOKIA :strcpy (manufacturer, "Nokia"); break;
+ case AT_MAN_SIEMENS:strcpy (manufacturer, "Siemens");break;
+ default :strcpy (manufacturer, "unknown");break;
+ }
+
+ return GE_NONE;
+}
+
+void Nat_ReplyPBKSetMemoryType(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: memory type set OK\n"));
+#endif
+
+ CurrentPhonebookError=GE_NONE;
+}
+
+static GSM_Error PBKSetMemoryType(GSM_MemoryType type)
+{
+ char req[] = "AT+CPBS=\"XX\"\r";
+ char req2[10];
+
+ GetMemoryTypeString(req2, &type);
+
+ req[9]=req2[0];
+ req[10]=req2[1];
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplySetCharset(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ if (strncmp("AT+CSCS=\"HEX\"",MessageBuffer,13)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: charset set to HEX\n"));
+#endif
+ CurrentPhonebookError=GE_NONE;
+ }
+ if (strncmp("AT+CSCS=\"GSM\"",MessageBuffer,13)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: charset set to GSM\n"));
+#endif
+ CurrentPhonebookError=GE_NONE;
+ }
+}
+
+GSM_Error SetCharset()
+{
+ unsigned char req [14] = {"AT+CSCS=\"HEX\"\r"}; // HEX charset
+ unsigned char req2[14] = {"AT+CSCS=\"GSM\"\r"}; // GSM charset
+ GSM_Error error;
+
+ error=NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, 14, 0x00, req);
+ if (error==GE_NONE) {
+ PBKATCSCS=PBK_AT_HEX;
+ return GE_NONE;
+ }
+
+ error=NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, 14, 0x00, req2);
+ if (error==GE_NONE) {
+ PBKATCSCS=PBK_AT_GSM;
+ return GE_NONE;
+ }
+
+ return error;
+}
+
+/* FIXME: M20 can have " inside name. We can't get endpos by finding first " */
+void Nat_ReplyGetMemoryLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ char *pos, *endpos;
+ int l;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: phonebook entry received\n"));
+#endif
+
+ CurrentPhonebookEntry->Empty = true;
+ *(CurrentPhonebookEntry->Name) = '\0';
+ *(CurrentPhonebookEntry->Number) = '\0';
+ CurrentPhonebookEntry->SubEntriesCount=0;
+ CurrentPhonebookEntry->Group = 0;
+
+ pos = strchr(MessageBuffer, '\"');
+ endpos = NULL;
+ if (pos) {
+ endpos = strchr(++pos, '\"');
+ if (endpos) {
+ *endpos = '\0';
+ strcpy(CurrentPhonebookEntry->Number, pos);
+ }
+ pos = NULL;
+ if (endpos) pos = strchr(++endpos, '\"');
+ endpos = NULL;
+ if (pos) {
+ pos++;
+ l = pos - (char *)MessageBuffer;
+ endpos = memchr(pos, '\"', MessageLength - l);
+ }
+ if (endpos) {
+ l = endpos - pos;
+ switch (PBKATCSCS) {
+ case PBK_AT_GSM:
+ DecodeDefault(CurrentPhonebookEntry->Name, pos, l);
+ break;
+ case PBK_AT_HEX:
+ DecodeHexBin(CurrentPhonebookEntry->Name, pos, l);
+ break;
+ }
+ }
+ }
+
+ CurrentPhonebookError=GE_NONE;
+}
+
+GSM_Error Nat_GetMemoryLocation(GSM_PhonebookEntry *entry)
+{
+ GSM_Error error;
+ char req[] = "AT+CPBR=00000\r";
+
+ if (PBKATCSCS==-1) {
+ error=SetCharset();
+ if (error!=GE_NONE) return error;
+ }
+
+ error = PBKSetMemoryType(entry->MemoryType);
+ if (error != GE_NONE) return error;
+
+ CurrentPhonebookEntry = entry;
+
+ sprintf(req + 8, "%5d\r", entry->Location);
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplyWritePhonebookLocation(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: phonebook entry set OK\n"));
+#endif
+
+ CurrentPhonebookError=GE_NONE;
+}
+
+GSM_Error Nat_WritePhonebookLocation(GSM_PhonebookEntry * entry)
+{
+ GSM_Error error;
+ char req[128];
+ char Name[128];
+ char Number[100];
+ u8 i;
+
+ switch (entry->MemoryType) {
+ case GMT_ME:
+ /* FIXME: the 7110, 6210... supports long phonebookentries. in lack
+ of documentation we only support SIM memory */
+ if(GetModelFeature (FN_PHONEBOOK)==F_PBK71INT) return GE_NOTIMPLEMENTED;
+
+ break;
+ default:
+ break;
+ }
+
+ if (PBKATCSCS==-1) {
+ error=SetCharset();
+ if (error!=GE_NONE) return error;
+ }
+
+ error = PBKSetMemoryType(entry->MemoryType);
+ if (error != GE_NONE) return error;
+
+ switch (PBKATCSCS) {
+ case PBK_AT_HEX:
+ EncodeHexBin (Name, entry->Name, strlen(entry->Name));
+ Name[strlen(entry->Name)*2]=0;
+ break;
+ case PBK_AT_GSM:
+ EncodeDefault (Name, entry->Name, strlen(entry->Name));
+ Name[strlen(entry->Name)]=0;
+ break;
+ }
+
+ GSM_PackSemiOctetNumber(entry->Number,Number,false);
+ i=Number[0];
+
+ sprintf(req, "AT+CPBW=%d, \"%s\", %i, \"%s\"\r",
+ entry->Location, entry->Number, i, Name);
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPhonebookError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplyGetMemoryStatusCPBS(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ char *start;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: memory status received\n"));
+#endif
+
+ CurrentMemoryStatus->Used = 0;
+ CurrentMemoryStatus->Free = 0;
+
+ start = strchr(MessageBuffer, ',');
+
+ if (start) {
+ start++;
+ CurrentMemoryStatus->Used = atoi(start);
+ start = strchr(start, ',');
+ if (start) {
+ start++;
+ CurrentMemoryStatus->Free = atoi(start) - CurrentMemoryStatus->Used;
+ CurrentMemoryStatusError=GE_NONE;
+ } else CurrentMemoryStatusError=GE_UNKNOWN;
+ } else CurrentMemoryStatusError=GE_UNKNOWN;
+}
+
+void Nat_ReplyGetMemoryStatusCPBR(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ char *start;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: memory size received\n"));
+#endif
+
+ CurrentMemoryStatus->Used = 0;
+ CurrentMemoryStatus->Free = 0;
+
+ start = strchr(MessageBuffer, '-');
+
+ if (start) {
+ start++;
+ /* Parse +CPBR: (first-last),max_number_len,max_name_len */
+ /* We cannot get Used/Free info. We can get only size of memory
+ we don't have size in memory status and because of it
+ we make assigment used=size_of_memory, free=0.
+ It's better than nothing */
+ CurrentMemoryStatus->Used = atoi(start);
+ CurrentMemoryStatusError=GE_NONE;
+ } else CurrentMemoryStatusError=GE_UNKNOWN;
+}
+
+GSM_Error Nat_GetMemoryStatus(GSM_MemoryStatus *Status)
+{
+ GSM_Error error;
+ char req [] ="AT+CPBS?\r"; /* in some phones doesn't work or doesn't return
+ memory status inside */
+ char req2[] ="AT+CPBR=?\r";
+
+ error = PBKSetMemoryType(Status->MemoryType);
+ if (error != GE_NONE) return error;
+
+ CurrentMemoryStatus = Status;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentMemoryStatusError, strlen(req), 0x00, req);
+ if (error==GE_NONE) {
+ CurrentMemoryStatus = NULL;
+ return error;
+ }
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentMemoryStatusError, strlen(req2), 0x00, req2);
+
+ CurrentMemoryStatus = NULL;
+
+ return error;
+}
+
+void Nat_ReplyCallDivert(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int current;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: call forwarding info\n"));
+#endif
+ if (MessageLength>0x20) {
+ current=27;
+ while (MessageBuffer[current]!='"') {
+ CurrentCallDivert->Number[current-27]=MessageBuffer[current];
+ current++;
+ }
+ CurrentCallDivert->Enabled=true;
+ CurrentCallDivert->Number[current-27]=0x00;
+ CurrentCallDivert->Timeout=999;//where is it in frame ?
+ } else {
+ CurrentCallDivert->Enabled=false;
+ }
+ CurrentCallDivertError=GE_NONE;
+}
+
+GSM_Error Nat_CallDivert(GSM_CallDivert *cd)
+{
+ char req[64];
+ GSM_Error error;
+ char Number[100];
+ int i;
+
+ sprintf(req, "AT+CCFC=");
+
+ switch (cd->DType) {
+ case GSM_CDV_AllTypes : strcat(req, "4"); break;
+ case GSM_CDV_Busy : strcat(req, "1"); break;
+ case GSM_CDV_NoAnswer : strcat(req, "2"); break;
+ case GSM_CDV_OutOfReach: strcat(req, "3"); break;
+ default : return GE_NOTIMPLEMENTED;
+ }
+
+ if (cd->Operation == GSM_CDV_Register) {
+ GSM_PackSemiOctetNumber(cd->Number,Number,false);
+ i=Number[0];
+
+ sprintf(req, "%s,%d,\"%s\",%i,,,%d", req,
+ cd->Operation,cd->Number,i,cd->Timeout);
+ } else
+ sprintf(req, "%s,%d", req, cd->Operation);
+
+ strcat(req, "\r\n");
+
+ CurrentCallDivert = cd;
+
+ error=NULL_SendMessageSequence
+ (100, &CurrentCallDivertError, strlen(req), 0x00, req);
+
+ CurrentCallDivert = NULL;
+
+ return error;
+}
+
+void Nat_ReplyGetNetworkInfo(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int i,current;
+ GSM_NetworkInfo NullNetworkInfo;
+
+ /* TODO: checking if phone really registered to network */
+
+ current=23;
+
+ /* Make sure we are expecting NetworkInfo frame */
+ if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: network info received\n"));
+#endif
+
+ NullNetworkInfo.NetworkCode[0]=0; //no exist
+
+ for (i=0;i<4;i++) NullNetworkInfo.CellID[i]=MessageBuffer[i+current];
+
+ NullNetworkInfo.CellID[4]=0;
+
+ current=current+7;
+
+ for (i=0;i<4;i++) NullNetworkInfo.LAC[i]=MessageBuffer[i+current];
+
+ NullNetworkInfo.LAC[4]=0;
+
+#ifdef DEBUG
+ fprintf(stdout, _(" CellID: %s\n"), NullNetworkInfo.CellID);
+ fprintf(stdout, _(" LAC: %s\n"), NullNetworkInfo.LAC);
+#endif
+
+ }
+
+ /* Make sure we are expecting NetworkInfo frame */
+ if (CurrentNetworkInfo && CurrentNetworkInfoError == GE_BUSY)
+ *CurrentNetworkInfo=NullNetworkInfo;
+
+ CurrentNetworkInfoError = GE_NONE;
+}
+
+GSM_Error Nat_GetNetworkInfo(GSM_NetworkInfo *NetworkInfo)
+{
+ GSM_Error error;
+
+ Protocol->SendMessage(10, 0x00, "AT+CREG=2\r");
+
+ CurrentNetworkInfo = NetworkInfo;
+
+ error=NULL_SendMessageSequence
+ (20, &CurrentNetworkInfoError, 9, 0x00, "AT+CREG?\r");
+
+ CurrentNetworkInfo = NULL;
+
+ return error;
+}
+
+void Nat_ReplyGetBatteryLevel(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: power source and battery info received\n"));
+#endif
+
+ CurrentPowerSource=atoi(MessageBuffer+15);
+ CurrentBatteryLevel=atoi(MessageBuffer+17);
+}
+
+GSM_Error Nat_GetBatteryLevel(GSM_BatteryUnits *units, float *level)
+{
+ int timeout=10;
+ int batt_level;
+
+ CurrentBatteryLevel=-1;
+
+ Protocol->SendMessage(7, 0x00, "AT+CBC\r");
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentBatteryLevel == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ /* Take copy in case it changes. */
+ batt_level = CurrentBatteryLevel;
+
+ if (batt_level != -1) {
+
+ /* Only units we handle at present are GBU_Arbitrary */
+ if (*units == GBU_Arbitrary) {
+ if (batt_level >= 70) { *level = 4; return (GE_NONE); }
+ if (batt_level >= 50) { *level = 3; return (GE_NONE); }
+ if (batt_level >= 30) { *level = 2; return (GE_NONE); }
+ if (batt_level >= 10) { *level = 1; return (GE_NONE); }
+ *level = 0;
+ return (GE_NONE);
+ }
+
+ return (GE_INTERNALERROR);
+ }
+ else
+ return (GE_NOLINK);
+}
+
+GSM_Error Nat_GetPowerSource(GSM_PowerSource * source)
+{
+ *source = CurrentPowerSource;
+ return (GE_NONE);
+}
+
+void Nat_ReplyGetRFLevel(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: RF level info received\n"));
+#endif
+ CurrentRFLevel=atoi(MessageBuffer+15);
+}
+
+GSM_Error Nat_GetRFLevel(GSM_RFUnits *units, float *level)
+{
+ int timeout=10;
+ int rf_level;
+
+ CurrentRFLevel=-1;
+
+ Protocol->SendMessage(7, 0x00, "AT+CSQ\r");
+
+ /* Wait for timeout or other error. */
+ while (timeout != 0 && CurrentRFLevel == -1 ) {
+
+ if (--timeout == 0)
+ return (GE_TIMEOUT);
+
+ usleep (100000);
+ }
+
+ /* Make copy in case it changes. */
+ rf_level = CurrentRFLevel;
+
+ if (rf_level == -1)
+ return (GE_NOLINK);
+
+ /* Now convert between the different units we support. */
+
+ if (*units == GRF_Arbitrary) {
+ if (CurrentRFLevel == 99) { *level = 0;return (GE_NONE); }
+ if (CurrentRFLevel > 23) { *level = 4;return (GE_NONE); }
+ if (CurrentRFLevel > 17) { *level = 3;return (GE_NONE); }
+ if (CurrentRFLevel > 11) { *level = 2;return (GE_NONE); }
+ if (CurrentRFLevel > 5) { *level = 1;return (GE_NONE); }
+ *level = 0;
+ return (GE_NONE);
+ }
+
+ /* CSQ units. */
+ if (*units == GRF_CSQ) {
+ if ((CurrentRFLevel <= 31) || (CurrentRFLevel >= 0))
+ *level = CurrentRFLevel;
+ else
+ *level = 99; /* Unknown/undefined */
+ return (GE_NONE);
+ }
+
+ /* Unit type is one we don't handle so return error */
+ return (GE_INTERNALERROR);
+}
+
+GSM_Error Nat_GetDisplayStatus(int *Status) {
+ char req[128];
+
+ sprintf(req, "AT+CIND?\r");
+
+ return NULL_SendMessageSequence
+ (50, &CurrentDisplayStatusError, strlen(req), 0x00, req);
+}
+
+GSM_Error Nat_PressKey(int key, int event)
+{
+ char req[128];
+
+ sprintf(req, "AT+CKPD=?\r");
+
+ return NULL_SendMessageSequence
+ (50, &CurrentPressKeyError, strlen(req), 0x00, req);
+}
+
+GSM_Error Nat_DialVoice(char *Number) {
+ char req[39] = "ATDT";
+
+ if (strlen(Number) > 32)
+ return (GE_INTERNALERROR);
+
+ strcat(req, Number);
+ strcat(req, ";\r");
+
+ return NULL_SendMessageSequence
+ (50, &CurrentDialVoiceError, 4+2+strlen(Number), 0x00, req);
+}
+
+void Nat_ReplyCancelCall(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: call hangup OK\n"));
+#endif
+
+ CurrentDialVoiceError=GE_NONE;
+}
+
+GSM_Error Nat_CancelCall(void)
+{
+ char req[] = "AT+CHUP\r";
+
+ return NULL_SendMessageSequence
+ (50, &CurrentDialVoiceError, strlen(req), 0x00, req);
+}
+
+GSM_Error Nat_SendDTMF(char *String)
+{
+ int n;
+ char req[80] = "AT+VTS=";
+
+ for (n = 0; n < 32; n++) {
+ if (String[n] == '\0') break;
+ if (n != 0) req[6 + 2 * n] = ',';
+ req[7 + 2 * n] = String[n];
+ }
+
+ strcat(req, ";\r");
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSendDTMFError,7+2+2*strlen(String) , 0x00, req);
+}
+
+GSM_Error Nat_EnterSecurityCode(GSM_SecurityCode SecurityCode)
+{
+ char req[128];
+
+ if ((SecurityCode.Type != GSCT_Pin)
+ && (SecurityCode.Type != GSCT_Pin2)) return (GE_NOTIMPLEMENTED);
+
+ sprintf(req, "AT+CPIN=\"%s\"\r", SecurityCode.Code);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSecurityCodeError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplyGetSecurityCodeStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ char *start;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: security code status received\n"));
+#endif
+
+ start = strchr(MessageBuffer, ':');
+ start+=2;
+
+ *CurrentSecurityCodeStatus = 0;
+
+ if (!strncmp(start, "READY", 5)) *CurrentSecurityCodeStatus = GSCT_None;
+
+ if (!strncmp(start, "SIM ", 4)) {
+ start += 4;
+ if (!strncmp(start, "PIN2", 4)) *CurrentSecurityCodeStatus = GSCT_Pin2;
+ if (!strncmp(start, "PUK2", 4)) *CurrentSecurityCodeStatus = GSCT_Puk2;
+ if (!strncmp(start, "PIN", 3)) *CurrentSecurityCodeStatus = GSCT_Pin;
+ if (!strncmp(start, "PUK", 3)) *CurrentSecurityCodeStatus = GSCT_Puk;
+ }
+
+ CurrentSecurityCodeError=GE_NONE;
+}
+
+GSM_Error Nat_GetSecurityCodeStatus(int *Status)
+{
+ CurrentSecurityCodeStatus = Status;
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSecurityCodeError, 9, 0x00, "AT+CPIN?\r");
+}
+
+void Nat_ReplyGetDateTime(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int current;
+
+ current=19;
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: date/time received\n"));
+#endif
+
+ if (MessageBuffer[current]==0x0d) {
+ CurrentDateTime->IsSet=false;
+ } else {
+ CurrentDateTime->IsSet=true;
+
+ ATDecodeDateTime(CurrentDateTime, MessageBuffer+(current));
+
+#ifdef DEBUG
+ fprintf(stdout,_(" %i/%i/%i %i:%i:%i\n"),
+ CurrentDateTime->Day,CurrentDateTime->Month,CurrentDateTime->Year,
+ CurrentDateTime->Hour,CurrentDateTime->Minute,CurrentDateTime->Second);
+#endif
+ }
+ CurrentDateTimeError=GE_NONE;
+}
+
+GSM_Error Nat_GetDateTime(GSM_DateTime *date_time)
+{
+ unsigned char req[9] = {"AT+CCLK?\r"};
+
+ CurrentDateTime=date_time;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentDateTimeError, 9, 0x00, req);
+}
+
+void Nat_ReplySetDateTime(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout,_("Message: date/time set OK\n"));
+#endif
+ CurrentSetDateTimeError=GE_NONE;
+}
+
+GSM_Error Nat_SetDateTime(GSM_DateTime *date_time)
+{
+ char req[128];
+
+ sprintf(req, "AT+CCLK=\"%02i/%02i/%02i,%02i:%02i:%02i+00\"\r",
+ date_time->Year-2000,date_time->Month,date_time->Day,
+ date_time->Hour,date_time->Minute,date_time->Second);
+
+ return NULL_SendMessageSequence
+ (20, &CurrentSetDateTimeError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplyGetAlarm(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int current;
+
+ current=19;
+#ifdef DEBUG
+ fprintf(stdout,_("Message: alarm info received\n"));
+#endif
+ if (MessageBuffer[current-1]==0x0d) {
+ CurrentAlarm->IsSet=false;
+ CurrentAlarm->Hour=0;
+ CurrentAlarm->Minute=0;
+ } else {
+ CurrentAlarm->IsSet=true;
+
+ ATDecodeDateTime(CurrentAlarm, MessageBuffer+(current));
+
+#ifdef DEBUG
+ fprintf(stdout,_(" %i:%i\n"),CurrentAlarm->Hour,CurrentAlarm->Minute);
+#endif
+ }
+ CurrentAlarmError=GE_NONE;
+}
+
+GSM_Error Nat_GetAlarm(int alarm_number, GSM_DateTime *date_time)
+{
+ unsigned char req[9] = {"AT+CALA?\r"};
+
+ CurrentAlarm=date_time;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentAlarmError, 9, 0x00, req);
+}
+
+/* FIXME: we should also allow to set the alarm off :-) */
+/* Doesn't work ? */
+GSM_Error Nat_SetAlarm(int alarm_number, GSM_DateTime *date_time)
+{
+ char req[128];
+ int i=0;
+
+ sprintf(req, "AT+CALA=\"%02i/%02i/%02i,%02i:%02i:%02i+00\",0,1\r",
+ i,i,i,date_time->Hour,date_time->Minute,i);
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSetAlarmError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplyGetSMSCenter(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int i,start;
+ unsigned char buffer[300];
+
+ start=18;
+
+ /* FIXME: support for all formats */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ for (i=1;i<strlen(buffer)-1;i++) buffer[i-1]=buffer[i];
+ buffer[i-1]=0;
+
+ /* FIXME: when SMSC in empty, I set default (for my network) */
+ /* Any better solution ? */
+// if (buffer[0]==0) strcpy(buffer,"+48602951111");
+ if (buffer[0]==0) strcpy(buffer,"+48601000310");
+
+ strcpy(CurrentMessageCenter->Number,buffer);
+
+ /* Some default values. Is it possible to get them ? */
+ CurrentMessageCenter->Name[0]=0;
+ CurrentMessageCenter->DefaultRecipient[0]=0;
+ CurrentMessageCenter->Format=GSMF_Text;
+ CurrentMessageCenter->Validity=GSMV_Max_Time;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMSC number received\n Number: '%s'\n"),buffer);
+#endif
+
+ CurrentMessageCenterError=GE_NONE;
+}
+
+/* We only get SMSC number */
+/* Is it possible to get more ? */
+GSM_Error Nat_GetSMSCenter(GSM_MessageCenter *MessageCenter)
+{
+ unsigned char req[] = {"AT+CSCA?\r"};
+
+ if (MessageCenter->No!=1) return GE_NOTSUPPORTED;
+
+ CurrentMessageCenter=MessageCenter;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMessageCenterError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplySetSMSCenter(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMSC number set OK\n"));
+#endif
+
+ CurrentMessageCenterError=GE_NONE;
+}
+
+GSM_Error Nat_SetSMSCenter(GSM_MessageCenter *MessageCenter)
+{
+ unsigned char req[50];
+
+ if (MessageCenter->No!=1) return GE_NOTSUPPORTED;
+
+ sprintf(req, "AT+CSCA=\"%s\"\r",MessageCenter->Number);
+
+ return NULL_SendMessageSequence
+ (50, &CurrentMessageCenterError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplySMSGetPDUType(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ if (strncmp("AT+CSDH=1\r",MessageBuffer,10)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: all SMS parameters will be displayed in text mode\n"));
+#endif
+ CurrentSMSMessageError=GE_NONE;
+ }
+ if (strncmp("AT+CMGF=0\r",MessageBuffer,10)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: set PDU mode for SMS\n"));
+#endif
+ CurrentSMSMessageError=GE_NONE;
+ }
+ if (strncmp("AT+CMGF=1\r",MessageBuffer,10)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: set text mode for SMS\n"));
+#endif
+ CurrentSMSMessageError=GE_NONE;
+ }
+}
+
+GSM_Error SMSGetPDUType()
+{
+ unsigned char req [10] = {"AT+CMGF=0\r"}; //sets PDU mode
+
+ unsigned char req2[10] = {"AT+CMGF=1\r"}; //sets text mode
+ unsigned char req3[10] = {"AT+CSDH=1\r"}; //shows all parameters in text mode
+
+ GSM_Error error;
+
+ error=NULL_SendMessageSequence (50, &CurrentSMSMessageError, 10, 0x00, req);
+ if (error==GE_NONE) {
+ SMSATCMGF=SMS_AT_PDU;
+ return GE_NONE;
+ }
+
+ error=NULL_SendMessageSequence (50, &CurrentSMSMessageError, 10, 0x00, req2);
+ if (error==GE_NONE) {
+ SMSATCMGF=SMS_AT_TEXT;
+
+ error=NULL_SendMessageSequence (50, &CurrentSMSMessageError, 10, 0x00, req3);
+ }
+
+ return error;
+}
+
+GSM_Error GSM_DecodeETSISMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int length)
+{
+ SMS_MessageType PDU=SMS_Deliver;
+ GSM_ETSISMSMessage ETSI;
+ int i,current=0,current2=0;
+
+ for(i=0;i<req[0]+1;i++) ETSI.SMSCNumber[i]=req[current++];
+
+ ETSI.firstbyte=req[current++];
+
+ /* See GSM 03.40 section 9.2.3.1 */
+ if ((ETSI.firstbyte & 0x03) == 0x01) PDU=SMS_Submit;
+ if ((ETSI.firstbyte & 0x03) == 0x02) PDU=SMS_Status_Report;
+
+ switch (PDU) {
+ case SMS_Submit:
+ SMS->Type = GST_SMS;
+ SMS->folder= GST_OUTBOX;
+ current++; //TPMR is ignored now
+ current2=((req[current])+1)/2+1;
+ for(i=0;i<current2+1;i++) ETSI.Number[i]=req[current++];
+ ETSI.TPPID=req[current++];
+ ETSI.TPDCS=req[current++];
+
+ /* See GSM 03.40 9.2.3.3 TPVP can not exist in frame */
+ if ((ETSI.firstbyte & 0x18)!=0) current++; //TPVP is ignored now
+
+ ETSI.TPUDL=req[current++];
+ current2=current;
+ for(i=current2;i<length;i++) ETSI.MessageText[i-current2]=req[current++];
+ break;
+ case SMS_Deliver:
+
+ SMS->Type = GST_SMS;
+ SMS->folder= GST_INBOX;
+ current2=((req[current])+1)/2+1;
+ for(i=0;i<current2+1;i++) ETSI.Number[i]=req[current++];
+ ETSI.TPPID=req[current++];
+ ETSI.TPDCS=req[current++];
+ for(i=0;i<7;i++) ETSI.DeliveryDateTime[i]=req[current++];
+ ETSI.TPUDL=req[current++];
+ current2=current;
+ for(i=current2;i<length;i++) ETSI.MessageText[i-current2]=req[current++];
+ break;
+ case SMS_Status_Report:
+
+ SMS->Type = GST_DR;
+ SMS->folder= GST_INBOX;
+ current++; //TPMR is ignored now
+ current2=((req[current])+1)/2+1;
+ for(i=0;i<current2+1;i++) ETSI.Number[i]=req[current++];
+ for(i=0;i<7;i++) ETSI.DeliveryDateTime[i]=req[current++];
+ for(i=0;i<7;i++) ETSI.SMSCDateTime[i]=req[current++];
+ ETSI.TPStatus=req[current];
+ break;
+ default:
+
+ break;
+ }
+
+ GSM_DecodeETSISMS(SMS, &ETSI);
+
+ return GE_NONE;
+}
+
+void Nat_ReplyGetSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int i,start,j,end;
+ unsigned char buffer[300],buffer2[300];
+ GSM_ETSISMSMessage ETSISMS;
+ GSM_DateTime DT;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message Received\n"));
+#endif
+ switch (SMSATCMGF) {
+ case SMS_AT_PDU: /* PDU mode */
+
+ start=5;
+ while(true) {
+ if (MessageBuffer[start]==' ' ) break;
+ start++;
+ }
+ start++;
+
+ if (MessageBuffer[start]=='0' || MessageBuffer[start]=='2')
+ CurrentSMSMessage->Status=GSS_NOTSENTREAD;
+ if (MessageBuffer[start]=='1' || MessageBuffer[start]=='3')
+ CurrentSMSMessage->Status=GSS_SENTREAD;
+
+ while(true) {
+ if (MessageBuffer[start]==0x0a) break;
+ start++;
+ }
+ start++;
+
+ /* We need to find last char of PDU text. We can't use MessageLength,
+ because sometimes some phones (like Siemens M20) return
+ some strange things after main PDU */
+ end=start+1;
+ while(true) {
+ if (MessageBuffer[end]==0x0a) break;
+ end++;
+ }
+
+ DecodeHexBin (buffer, MessageBuffer+start, end-start-1);
+
+ GSM_DecodeETSISMSFrame(CurrentSMSMessage,buffer,(end-start-1)/2);
+
+ CurrentSMSMessageError=GE_NONE;
+ break;
+ case SMS_AT_TEXT:
+ start=19;
+
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ if (!strcmp(buffer,"\"0\"") || !strcmp(buffer,"\"REC UNREAD\"")) {
+ CurrentSMSMessage->Type=GST_SMS;
+ CurrentSMSMessage->folder=GST_INBOX;
+ CurrentSMSMessage->SMSData=true;
+ CurrentSMSMessage->Status=GSS_NOTSENTREAD;
+ } else if (!strcmp(buffer,"\"1\"") || !strcmp(buffer,"\"REC READ\"")) {
+ CurrentSMSMessage->Type=GST_SMS;
+ CurrentSMSMessage->folder=GST_INBOX;
+ CurrentSMSMessage->SMSData=true;
+ CurrentSMSMessage->Status=GSS_SENTREAD;
+ } else if (!strcmp(buffer,"\"2\"") || !strcmp(buffer,"\"STO UNSENT\"")) {
+ CurrentSMSMessage->Type=GST_SMS;
+ CurrentSMSMessage->folder=GST_OUTBOX;
+ CurrentSMSMessage->SMSData=false;
+ CurrentSMSMessage->Status=GSS_NOTSENTREAD;
+ } else if (!strcmp(buffer,"\"3\"") || !strcmp(buffer,"\"STO SENT\"")) {
+ CurrentSMSMessage->Type=GST_SMS;
+ CurrentSMSMessage->folder=GST_OUTBOX;
+ CurrentSMSMessage->SMSData=false;
+ CurrentSMSMessage->Status=GSS_SENTREAD;
+ }
+
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ /* It's delivery report according to Nokia AT standards */
+ if (CurrentSMSMessage->folder==0 && buffer[0]!=0 && //GST_INBOX
+ buffer[0]!='"') {
+
+ /* ??? */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ /* Sender number */
+ /* FIXME: support for all formats */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ for (i=1;i<strlen(buffer)-1;i++) buffer[i-1]=buffer[i];
+ buffer[i-1]=0;
+ strcpy(CurrentSMSMessage->Sender,buffer);
+
+ /* ??? */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ /* Sending datetime */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ start+=ExtractOneParameter(MessageBuffer+start, buffer2);
+
+ for (i=1;i<strlen(buffer)+1;i++) buffer[i-1]=buffer[i];
+
+ i=strlen(buffer);
+ buffer[i++]=',';
+ for (j=0;j<strlen(buffer2);j++) buffer[i++]=buffer2[j];
+ buffer[i]=0;
+
+ ATDecodeDateTime(&CurrentSMSMessage->Time, buffer);
+
+ /* Date of SMSC response */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ start+=ExtractOneParameter(MessageBuffer+start, buffer2);
+
+ for (i=1;i<strlen(buffer)+1;i++) buffer[i-1]=buffer[i];
+
+ i=strlen(buffer);
+ buffer[i++]=',';
+ for (j=0;j<strlen(buffer2);j++) buffer[i++]=buffer2[j];
+ buffer[i]=0;
+
+ ATDecodeDateTime(&DT, buffer);
+
+ /* for compatiblity with GSM_DecodeETSISMSStatusReportData */
+ /* FIXME: TimeZone is cut */
+ DT.Year=DT.Year-2000;
+ GSM_EncodeSMSDateTime(&DT,ETSISMS.SMSCDateTime);
+
+ /* TPStatus */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ ETSISMS.TPStatus=0;
+ j=1;
+ for (i=strlen(buffer)-1;i>=0;i--) {
+ ETSISMS.TPStatus=ETSISMS.TPStatus+(buffer[i]-'0')*j;
+ j=j*10;
+ }
+
+ GSM_DecodeETSISMSStatusReportData(CurrentSMSMessage, &ETSISMS);
+
+ /* NO SMSC number */
+ CurrentSMSMessage->MessageCenter.Number[0]=0;
+
+ CurrentSMSMessage->Type = GST_DR;
+
+ /* FIXME: make support for it */
+ CurrentSMSMessage->ReplyViaSameSMSC=false;
+ } else {
+ /* Sender number */
+ /* FIXME: support for all formats */
+ for (i=1;i<strlen(buffer)-1;i++) buffer[i-1]=buffer[i];
+ buffer[i-1]=0;
+ strcpy(CurrentSMSMessage->Sender,buffer);
+
+ /* Sender number in alphanumeric format ? */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ if (strlen(buffer)!=0) strcpy(CurrentSMSMessage->Sender,buffer);
+
+ /* Sending datetime */
+ if (CurrentSMSMessage->folder==0) { //GST_INBOX
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ start+=ExtractOneParameter(MessageBuffer+start, buffer2);
+
+ for (i=1;i<strlen(buffer)+1;i++) buffer[i-1]=buffer[i];
+
+ i=strlen(buffer);
+ buffer[i++]=',';
+ for (j=0;j<strlen(buffer2);j++) buffer[i++]=buffer2[j];
+ buffer[i]=0;
+
+ ATDecodeDateTime(&CurrentSMSMessage->Time, buffer);
+ }
+
+ /* Sender number format */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ /* First byte */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ ETSISMS.firstbyte=0;
+ j=1;
+ for (i=strlen(buffer)-1;i>=0;i--) {
+ ETSISMS.firstbyte=ETSISMS.firstbyte+(buffer[i]-'0')*j;
+ j=j*10;
+ }
+
+ CurrentSMSMessage->ReplyViaSameSMSC=false;
+ /* GSM 03.40 section 9.2.3.17 (TP-Reply-Path) */
+ if ((ETSISMS.firstbyte & 128)==128)
+ CurrentSMSMessage->ReplyViaSameSMSC=true;
+
+ /* TP PID.No support now */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ /* TP DCS */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ ETSISMS.TPDCS=0;
+ j=1;
+ for (i=strlen(buffer)-1;i>=0;i--) {
+ ETSISMS.TPDCS=ETSISMS.TPDCS+(buffer[i]-'0')*j;
+ j=j*10;
+ }
+
+ if (CurrentSMSMessage->folder==1) { //GST_OUTBOX
+ /*TP VP */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ }
+
+ /* SMSC number */
+ /* FIXME: support for all formats */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ for (i=1;i<strlen(buffer)-1;i++) buffer[i-1]=buffer[i];
+ buffer[i-1]=0;
+ strcpy(CurrentSMSMessage->MessageCenter.Number,buffer);
+
+ /* Format of SMSC number */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+
+ /* TPUDL */
+ start+=ExtractOneParameter(MessageBuffer+start, buffer);
+ ETSISMS.TPUDL=0;
+ j=1;
+ for (i=strlen(buffer)-1;i>=0;i--) {
+ ETSISMS.TPUDL=ETSISMS.TPUDL+(buffer[i]-'0')*j;
+ j=j*10;
+ }
+
+ start++;
+
+ CurrentSMSMessage->Coding = GSM_Coding_Default;
+
+ /* GSM 03.40 section 9.2.3.10 (TP-Data-Coding-Scheme) and GSM 03.38 section 4 */
+ if ((ETSISMS.TPDCS & 0xf4) == 0xf4) CurrentSMSMessage->Coding=GSM_Coding_8bit;
+ if ((ETSISMS.TPDCS & 0x08) == 0x08) CurrentSMSMessage->Coding=GSM_Coding_Unicode;
+
+ switch (CurrentSMSMessage->Coding) {
+ case GSM_Coding_Default:
+ /* GSM 03.40 section 9.2.3.23 (TP-User-Data-Header-Indicator) */
+ /* If not SMS with UDH, it's coded normal */
+ /* If UDH available, treat it as Unicode or 8 bit */
+ if ((ETSISMS.firstbyte & 0x40)!=0x40) {
+ CurrentSMSMessage->UDHType=GSM_NoUDH;
+ for (i=0;i<ETSISMS.TPUDL;i++) {
+ if (i>GSM_MAX_SMS_LENGTH) break;
+ CurrentSMSMessage->MessageText[i]=MessageBuffer[i+start];
+ }
+ CurrentSMSMessage->Length=ETSISMS.TPUDL;
+ break;
+ }
+ case GSM_Coding_Unicode:
+ case GSM_Coding_8bit:
+ DecodeHexBin (ETSISMS.MessageText, MessageBuffer+start, ETSISMS.TPUDL*2);
+ GSM_DecodeETSISMSSubmitData(CurrentSMSMessage, &ETSISMS);
+ break;
+ }
+ CurrentSMSMessage->MessageText[CurrentSMSMessage->Length]=0;
+ }
+
+ CurrentSMSMessageError=GE_NONE;
+ }
+}
+
+GSM_Error Nat_GetSMSMessage(GSM_SMSMessage *message)
+{
+ unsigned char req2[20];
+ GSM_Error error;
+
+ if (SMSATCMGF==-1) {
+ error=SMSGetPDUType();
+ if (error!=GE_NONE) return error;
+ }
+
+ CurrentSMSMessage = message;
+
+ sprintf(req2, "AT+CMGR=%i\r",message->Location); //gets SMS
+
+ CurrentSMSMessage->MessageNumber=CurrentSMSMessage->Location;
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSMSMessageError, strlen(req2), 0x00, req2);
+}
+
+/* FIXME: do we need more than SMS_Submit and SMS_Deliver ? */
+GSM_Error GSM_EncodeETSISMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int *length, SMS_MessageType PDU)
+{
+ GSM_ETSISMSMessage ETSI;
+ int i,current=0;
+
+ GSM_EncodeETSISMS(SMS, &ETSI, PDU, length);
+
+ for (i=0;i<ETSI.SMSCNumber[0]+1;i++)
+ req[current++]=ETSI.SMSCNumber[i];
+
+ req[current++]=ETSI.firstbyte;
+
+ switch (PDU) {
+ case SMS_Submit:
+
+ req[current++]=0; //TPMR ignored now
+ for (i=0;i<((ETSI.Number[0]+1)/2+1)+1;i++) req[current++]=ETSI.Number[i];
+ req[current++]=0; //ETSI.TPPID;
+ req[current++]=ETSI.TPDCS;
+ req[current++]=ETSI.TPVP;
+ req[current++]=ETSI.TPUDL;
+ for(i=0;i<*length;i++) req[current++]=ETSI.MessageText[i];
+ break;
+ case SMS_Deliver:
+
+ for (i=0;i<((ETSI.Number[0]+1)/2+1)+1;i++) req[current++]=ETSI.Number[i];
+ req[current++]=0; //ETSI.TPPID;
+ req[current++]=ETSI.TPDCS;
+ for(i=0;i<7;i++) req[current++]=ETSI.DeliveryDateTime[i];
+ req[current++]=ETSI.TPUDL;
+ for(i=0;i<*length;i++) req[current++]=ETSI.MessageText[i];
+ break;
+ default:
+
+ break;
+ }
+
+ *length=current;
+
+ return GE_NONE;
+}
+
+void Nat_ReplyCSMP(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS parameters set OK\n"));
+#endif
+
+ CurrentSMSMessageError=GE_NONE;
+}
+
+GSM_Error Nat_SendSaveSMSMessage(GSM_SMSMessage *message,bool savesms)
+{
+ unsigned char req2[500];
+ unsigned char req3[256];
+ unsigned char req4[256];
+ unsigned char endchar[1];
+ GSM_Error error;
+ int length,stat,current=0;
+ SMS_MessageType PDU;
+ GSM_ETSISMSMessage ETSISMS;
+ GSM_MessageCenter SMSC;
+
+ if (SMSATCMGF==-1) {
+ error=SMSGetPDUType();
+ if (error!=GE_NONE) return error;
+ }
+
+ CurrentSMSMessage = message;
+
+ if (message->folder==0x00) { //GST_INBOX
+ PDU=SMS_Deliver;
+ stat=1;
+ if (message->Status==GSS_NOTSENTREAD) stat=0;
+ } else {
+ PDU=SMS_Submit;
+ stat=3;
+ if (message->Status==GSS_NOTSENTREAD) stat=2;
+ }
+
+ endchar[0]=26; //ctrl+z;
+
+ switch (SMSATCMGF) {
+ case SMS_AT_PDU: /* PDU mode */
+ GSM_EncodeETSISMSFrame(message, req3, &length, PDU);
+
+ if (savesms)
+ sprintf(req2, "AT+CMGW=%i,%i\r",(length-(req3[0]+1)),stat); //saves SMS
+ else
+ sprintf(req2, "AT+CMGS=%i\r",(length-(req3[0]+1))); //sends SMS
+
+ EncodeHexBin (req4, req3, length);
+ current=length*2;
+
+ Protocol->SendMessage(strlen(req2), 0x00, req2); usleep(500);
+
+ break;
+ case SMS_AT_TEXT:
+
+ if (ATMan!=AT_MAN_NOKIA) {
+ switch (CurrentSMSMessage->Coding) {
+ case GSM_Coding_Unicode:
+ case GSM_Coding_8bit:
+ return GE_NOTSUPPORTED;
+ default:
+ break;
+ }
+ }
+
+ GSM_EncodeETSISMS(message, &ETSISMS, PDU, &length);
+
+ sprintf(req4, "AT+CSMP=%i,%i,%i,%i\r",
+ ETSISMS.firstbyte, ETSISMS.TPVP,
+ ETSISMS.TPPID, ETSISMS.TPDCS);
+
+ error=NULL_SendMessageSequence
+ (50, &CurrentSMSMessageError, strlen(req4), 0x00, req4);
+ if (error!=GE_NONE) return error;
+
+ strcpy(SMSC.Number,message->MessageCenter.Number);
+ SMSC.No=1;
+ error=Nat_SetSMSCenter(&SMSC);
+ if (error!=GE_NONE) return error;
+
+ if (savesms) {
+ /* Tested AT implementations don't support alphanumeric numbers */
+ if ((CurrentSMSMessage->Destination[0]<'0' ||
+ CurrentSMSMessage->Destination[0]>'9') &&
+ CurrentSMSMessage->Destination[0]!='+')
+ {
+ CurrentSMSMessage->Destination[0]='1';
+ CurrentSMSMessage->Destination[1]=0;
+ }
+
+ sprintf(req4, "AT+CMGW=\"%s\"\r",CurrentSMSMessage->Destination);
+ } else {
+ /* Tested AT implementations don't support alphanumeric numbers */
+ if ((CurrentSMSMessage->Destination[0]<'0' ||
+ CurrentSMSMessage->Destination[0]>'9') &&
+ CurrentSMSMessage->Destination[0]!='+')
+ return GE_NOTSUPPORTED;
+
+ sprintf(req4, "AT+CMGS=\"%s\"\r",CurrentSMSMessage->Destination);
+ }
+
+ Protocol->SendMessage(strlen(req4), 0x00, req4); usleep(500);
+
+ switch (CurrentSMSMessage->Coding) {
+ case GSM_Coding_Default:
+ /* If not SMS with UDH, it's as normal text */
+ if (CurrentSMSMessage->UDHType==GSM_NoUDH) {
+ strcpy(req4,CurrentSMSMessage->MessageText);
+ current=strlen(req4);
+ break;
+ }
+ case GSM_Coding_Unicode:
+ case GSM_Coding_8bit:
+
+ EncodeHexBin (req4, ETSISMS.MessageText, length);
+ current=length*2;
+ break;
+ }
+
+ break;
+ }
+
+ Protocol->SendMessage(current, 0x00, req4); usleep(500);
+
+ return NULL_SendMessageSequence
+ (500, &CurrentSMSMessageError, 1, 0x00, endchar);
+}
+
+void Nat_ReplySaveSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ int i;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message saved\n"));
+#endif
+
+ i=MessageLength-10;
+ while(MessageBuffer[i]!=0x20) { i++; }
+
+ i++;
+ CurrentSMSMessage->MessageNumber=MessageBuffer[i]-'0';
+
+ i++;
+ if (MessageBuffer[i]!=0x0d)
+ CurrentSMSMessage->MessageNumber=
+ CurrentSMSMessage->MessageNumber*10+MessageBuffer[i]-'0';
+
+#ifdef DEBUG
+ fprintf(stdout, _(" location: %i\n"),CurrentSMSMessage->MessageNumber);
+#endif
+
+ CurrentSMSMessageError=GE_NONE;
+}
+
+GSM_Error Nat_SaveSMSMessage(GSM_SMSMessage *message)
+{
+ return Nat_SendSaveSMSMessage(message,true);
+}
+
+void Nat_ReplySendSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS Message sent OK\n"));
+#endif
+
+ CurrentSMSMessageError=GE_SMSSENDOK;
+}
+
+GSM_Error Nat_SendSMSMessage(GSM_SMSMessage *message)
+{
+ return Nat_SendSaveSMSMessage(message,false);
+}
+
+void Nat_ReplyDeleteSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS deleted OK\n"));
+#endif
+
+ CurrentSMSMessageError=GE_NONE;
+}
+
+GSM_Error Nat_DeleteSMSMessage(GSM_SMSMessage * message)
+{
+ char req[128];
+
+ sprintf(req, "AT+CMGD=%d\r", message->Location);
+
+ return NULL_SendMessageSequence
+ (50, &CurrentSMSMessageError, strlen(req), 0x00, req);
+}
+
+void Nat_ReplyGetSMSStatus(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+ char *start2;
+
+#ifdef DEBUG
+ fprintf(stdout, _("Message: SMS status received\n"));
+#endif
+
+ CurrentSMSStatus->UnRead=0;
+ CurrentSMSStatus->Number=0;
+
+ start2 = strstr(MessageBuffer, "+CPMS: ");
+ start2 += 7;
+
+ CurrentSMSStatus->Number=atoi(start2);
+
+ CurrentSMSStatusError=GE_NONE;
+}
+
+GSM_Error Nat_GetSMSStatus(GSM_SMSStatus *Status)
+{
+ CurrentSMSStatus=Status;
+
+ return NULL_SendMessageSequence
+ (10, &CurrentSMSStatusError, 13, 0x00, "AT+CPMS=\"SM\"\r");
+}
+
+struct AT_OneReply ATRepliesOK[] = {
+
+{"AT+CCFC=" ,Nat_ReplyCallDivert },
+{"AT+CGMI\r",Nat_ReplyGetManufacturer },
+{"AT+CPBS?" ,Nat_ReplyGetMemoryStatusCPBS },
+{"AT+CPBR=?",Nat_ReplyGetMemoryStatusCPBR },
+{"AT+CPBR=" ,Nat_ReplyGetMemoryLocation },
+{"AT+CPBW=" ,Nat_ReplyWritePhonebookLocation},
+{"AT+CPBS=" ,Nat_ReplyPBKSetMemoryType },
+{"AT+CSCS=\"HEX\"",Nat_ReplySetCharset },
+{"AT+CSCS=\"GSM\"",Nat_ReplySetCharset },
+{"AT+CSCA?" ,Nat_ReplyGetSMSCenter },
+{"AT+CSCA=" ,Nat_ReplySetSMSCenter },
+{"AT+CSDH=1\r",Nat_ReplySMSGetPDUType },
+{"AT+CMGF=0\r",Nat_ReplySMSGetPDUType },
+{"AT+CMGF=1\r",Nat_ReplySMSGetPDUType },
+{"AT+CMGR=" ,Nat_ReplyGetSMSMessage },
+{"AT+CSMP=" ,Nat_ReplyCSMP },
+{"AT+CMGW=" ,Nat_ReplySaveSMSMessage },
+{"AT+CMGS=" ,Nat_ReplySendSMSMessage },
+{"AT+CMGD=" ,Nat_ReplyDeleteSMSMessage },
+{"AT+CPMS=\"SM\"",Nat_ReplyGetSMSStatus },
+{"AT+CPIN?\r",Nat_ReplyGetSecurityCodeStatus},
+{"AT+CCLK?" ,Nat_ReplyGetDateTime },
+{"AT+CCLK=" ,Nat_ReplySetDateTime },
+{"AT+CALA?" ,Nat_ReplyGetAlarm },
+{"AT+CGMM\r",Nat_ReplyGetID },
+{"AT+CGMR\r",Nat_ReplyGetHW },
+{"AT+CREG?" ,Nat_ReplyGetNetworkInfo },
+{"AT+CGSN\r",Nat_ReplyGetIMEI },
+{"AT+CHUP" ,Nat_ReplyCancelCall },
+{"AT+CBC" ,Nat_ReplyGetBatteryLevel },
+{"AT+CSQ" ,Nat_ReplyGetRFLevel },
+
+{"",NULL}
+};
+
+void Nat_DispatchMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType) {
+
+ bool AnswerOK,AnswerError; //if last part is OK or ERROR
+
+ int i,start=0;
+
+ /* In 9210 first answer start with different, random bytes.
+ Here we try to find first AT to find start byte */
+ for (i=0;i<MessageLength-1;i++) {
+ if (strncmp("AT",MessageBuffer+i,2)==0) {
+ start=i;
+ break;
+ }
+ }
+
+ AnswerError=false;
+ if (strncmp("ERROR\r",MessageBuffer+(MessageLength-6),6)==0) AnswerError=true;
+
+ AnswerOK=false;
+ if (strncmp("OK\r",MessageBuffer+(MessageLength-3),3)==0) AnswerOK=true;
+
+ if (AnswerOK) {
+ i=0;
+ while (true) {
+ if (ATRepliesOK[i].ReplyFunction==NULL) break;
+ if (strncmp(ATRepliesOK[i].ReplyString,MessageBuffer+start,
+ strlen(ATRepliesOK[i].ReplyString))==0) {
+ ATRepliesOK[i].ReplyFunction(MessageLength-start,MessageBuffer+start,MessageType);
+ break;
+ }
+ i++;
+ }
+
+#ifdef DEBUG
+ if (ATRepliesOK[i].ReplyFunction==NULL)
+ fprintf(stdout,_("Message: unknown AT command\n"));
+#endif
+
+ if (strncmp("AT\r",MessageBuffer+start,3)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: used for setting DLR3 to FBUS - part 1 OK\n"));
+#endif
+ CurrentGetHWError=GE_NONE;
+ }
+ if (strncmp("AT&F\r",MessageBuffer+start,5)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: used for setting DLR3 to FBUS - part 2 OK\n"));
+#endif
+ CurrentGetHWError=GE_NONE;
+ }
+ if (strncmp("AT*NOKIAFBUS\r",MessageBuffer+start,13)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Setting DLR3 to FBUS - part 3 OK\n"));
+#endif
+ CurrentGetHWError=GE_NONE;
+ }
+ }
+
+ if (AnswerError) {
+ if (strncmp("AT*NOKIAFBUS\r",MessageBuffer+start,13)==0) {
+#ifdef DEBUG
+ fprintf(stdout, _("Message: Setting DLR3 to FBUS - part 3 ERROR\n"));
+#endif
+
+ CurrentGetHWError=GE_INTERNALERROR;
+ }
+ }
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for accessing functions on the sniff and similar
+ phones.
+
+*/
+
+/* "Turn on" prototypes in n-sniff.h */
+
+#define __n_sniff_c
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifndef WIN32
+
+ #include "devices/device.h"
+
+#endif
+
+/* Various header file */
+#ifndef VC6
+ #include "config.h"
+#endif
+#include "misc.h"
+#include "gsm-api.h"
+#include "gsm-common.h"
+#include "files/cfgreader.h"
+#include "newmodules/sniff/sniff.h"
+#include "newmodules/n6110.h"
+#include "newmodules/n7110.h"
+#include "gsm-networks.h"
+
+/* Global variables used by code in gsm-api.c to expose the functions
+ supported by this model of phone. */
+
+
+static char *realmodel; /* Model from .gnokiirc file. */
+static char *Port; /* Port from .gnokiirc file */
+static char *Initlength; /* Init length from .gnokiirc file */
+static char *Connection; /* Connection type from .gnokiirc file */
+static char *SynchronizeTime; /* If we set date and time from computer to phone (from .gnokiirc file) */
+static char *BinDir; /* Binaries directory from .gnokiirc file - not used here yet */
+static GSM_ConnectionType connectiontype;
+
+
+
+
+
+
+
+/* Here we initialise model specific functions. */
+
+GSM_Functions Nsniff_Functions = {
+ Nsniff_Initialise,
+ Nsniff_DispatchMessage,
+ NULL_Terminate,
+ NULL_KeepAlive,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED, NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED,
+ NOTSUPPORTED
+};
+
+
+
+/* for all these Phones we support sniff */
+
+GSM_Information Nsniff_Information = {
+ "3210sniff|3310sniff|3330sniff|5110sniff|5130sniff|5190sniff|6110sniff|6130sniff|6150sniff|6190sniff|8210sniff|8850sniff|6210sniff|6250sniff|7110sniff",
+ /* Supported models in FBUS */
+ "3210sniff|3310sniff|3330sniff|5110sniff|5130sniff|5190sniff|6110sniff|6130sniff|6150sniff|6190sniff|8210sniff|8850sniff|6210sniff|6250sniff|7110sniff",
+ /* Supported models in MBUS */
+ "",
+ /* Supported models in FBUS over infrared */
+ "",
+ /* Supported models in FBUS over DLR3 */
+ "",
+ "6210decode|6250decode|7110decode", /* Supported models in FBUS over Irda sockets */
+ "",
+ 4, /* Max RF Level */
+ 0, /* Min RF Level */
+ GRF_Arbitrary, /* RF level units */
+ 4, /* Max Battery Level */
+ 0, /* Min Battery Level */
+ GBU_Arbitrary, /* Battery level units */
+ GDT_None, /* No date/time support */
+ GDT_None, /* No alarm support */
+ 0 /* Max alarms = 0 */
+};
+
+/* Initialise variables and state machine. */
+GSM_Error Nsniff_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+
+ GSM_PhonebookEntry phonebook;
+ GSM_SpeedDial speed;
+ GSM_SMSMessage sms;
+ GSM_MemoryStatus status;
+ GSM_NetworkInfo netinfo;
+ GSM_SMSStatus smsstatus;
+ GSM_SMSFolders folders;
+ GSM_MessageCenter smsc;
+ int secstatus;
+ GSM_SecurityCode seccode;
+ GSM_DateTime date;
+ GSM_DateTime alarm;
+ GSM_CalendarNote note;
+ char netmon;
+ GSM_Bitmap logo;
+ GSM_Profile profile;
+ GSM_CBMessage cb;
+ GSM_Network netname;
+ GSM_BinRingtone binring;
+ GSM_AllSimlocks siml; if (Protocol->Initialise(port_device,initlength,connection,rlp_callback)!=GE_NONE)
+ {
+ return GE_NOTSUPPORTED;
+ }
+
+ CurrentLinkOK = true;
+
+ CurrentPhonebookEntry=&phonebook;
+ CurrentSpeedDialEntry=&speed;
+ CurrentSMSMessage=&sms;
+ CurrentMemoryStatus=&status;
+ CurrentNetworkInfo=&netinfo;
+ CurrentSMSStatus=&smsstatus;
+ CurrentSMSFolders=&folders;
+ CurrentMessageCenter=&smsc;
+ CurrentSecurityCodeStatus=&secstatus;
+ CurrentSecurityCode=&seccode;
+ CurrentDateTime=&date;
+ CurrentAlarm=&alarm;
+ CurrentCalendarNote=¬e;
+ CurrentNetmonitor=&netmon;
+ CurrentGetBitmap=&logo;
+ CurrentProfile=&profile;
+ CurrentCBMessage=&cb;
+ CurrentGetOperatorNameNetwork=&netname;
+ CurrentGetBinRingtone=&binring;
+ CurrentSimLock=⪝
+
+ /* Read config file, once again to get real model */
+ if (CFG_ReadConfig(&realmodel, &Port, &Initlength, &Connection, &BinDir, &SynchronizeTime,false) < 0) {
+ exit(-1);
+ }
+
+ connectiontype = GetConnectionTypeFromString(Connection);
+ return (GE_NONE);
+}
+
+
+void Nsniff_DispatchMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType)
+{
+
+/* switch to real Model */
+ if (CheckModel (N6110_Information, realmodel, connectiontype))
+ N6110_DispatchMessage( MessageLength, MessageBuffer, MessageType);
+
+ if (CheckModel (N7110_Information, realmodel, connectiontype))
+ N7110_DispatchMessage( MessageLength, MessageBuffer, MessageType);
+}
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to at commands on ericsson
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:14 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "gsm-common.h"
+#include "gsm-statemachine.h"
+#include "phones/generic.h"
+#include "phones/atgen.h"
+#include "phones/ateric.h"
+#include "links/atbus.h"
+#include "links/cbus.h"
+
+
+static GSM_Error GetMemoryStatus(GSM_Data *data, GSM_Statemachine *state)
+{
+ char req[128];
+ GSM_Error ret;
+
+ ret = AT_SetMemoryType(data->MemoryStatus->MemoryType, state);
+ if (ret != GE_NONE)
+ return ret;
+ sprintf(req, "AT+CPBR=?\r\n");
+ if (SM_SendMessage(state, 11, GOP_GetMemoryStatus, req) != GE_NONE)
+ return GE_NOTREADY;
+ ret = SM_Block(state, data, GOP_GetMemoryStatus);
+ return ret;
+}
+
+
+static GSM_Error ReplyMemoryStatus(int messagetype, unsigned char *buffer, int length, GSM_Data *data)
+{
+ AT_LineBuffer buf;
+ char *pos;
+
+ buf.line1 = buffer;
+ buf.length= length;
+ splitlines(&buf);
+ if (buf.line1 == NULL)
+ return GE_INVALIDMEMORYTYPE;
+ if (data->MemoryStatus) {
+ if (strstr(buf.line2,"+CPBR")) {
+ pos = strchr(buf.line2, '-');
+ if (pos) {
+ data->MemoryStatus->Used = atoi(++pos);
+ data->MemoryStatus->Free = 0;
+ } else {
+ return GE_NOTSUPPORTED;
+ }
+ }
+ }
+ return GE_NONE;
+}
+
+
+void AT_InitEricsson(GSM_Statemachine *state, char *foundmodel, char *setupmodel) {
+ AT_InsertRecvFunction(GOP_GetMemoryStatus, ReplyMemoryStatus);
+ AT_InsertSendFunction(GOP_GetMemoryStatus, GetMemoryStatus);
+}
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to at commands on nokia
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:14 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "gsm-common.h"
+#include "gsm-statemachine.h"
+#include "phones/generic.h"
+#include "phones/atgen.h"
+#include "phones/atnok.h"
+#include "links/atbus.h"
+#include "links/cbus.h"
+
+
+AT_SendFunctionType writephonebook;
+
+
+static GSM_Error WritePhonebook(GSM_Data *data, GSM_Statemachine *state)
+{
+ if (writephonebook == NULL)
+ return GE_UNKNOWN;
+ if (data->MemoryStatus->MemoryType == GMT_ME)
+ return GE_NOTSUPPORTED;
+ return (*writephonebook)(data, state);
+}
+
+
+void AT_InitNokia(GSM_Statemachine *state, char *foundmodel, char *setupmodel) {
+ /* block writing of phone memory on nokia phones other than */
+ /* 8210. if you write to the phonebook of a eg 7110 all extended */
+ /* information will be lost. */
+ if (strncasecmp("8210", foundmodel, 4))
+ writephonebook = AT_InsertSendFunction(GOP_WritePhonebook, WritePhonebook);
+}
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to at commands on siemens
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:14 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+*/
+
+#include <string.h>
+#include <stdlib.h>
+#include <ctype.h>
+
+#include "misc.h"
+#include "gsm-common.h"
+#include "gsm-statemachine.h"
+#include "phones/generic.h"
+#include "phones/atgen.h"
+#include "phones/atsie.h"
+#include "links/atbus.h"
+#include "links/cbus.h"
+
+
+AT_SendFunctionType writephonebook;
+
+
+static GSM_Error WritePhonebook(GSM_Data *data, GSM_Statemachine *state)
+{
+ GSM_PhonebookEntry newphone;
+ char *rptr, *wptr;
+
+ if (writephonebook == NULL)
+ return GE_UNKNOWN;
+ if (data->PhonebookEntry != NULL) {
+ memcpy(&newphone, data->PhonebookEntry, sizeof(GSM_PhonebookEntry));
+ rptr = data->PhonebookEntry->Name;
+ wptr = newphone.Name;
+ data->PhonebookEntry = &newphone;
+ }
+ return (*writephonebook)(data, state);
+}
+
+
+void AT_InitSiemens(GSM_Statemachine *state, char *foundmodel, char *setupmodel) {
+ /* names for s35 etc must be escaped */
+/*
+ if (foundmodel && !strncasecmp("35", foundmodel + 1, 2))
+ writephonebook = AT_InsertSendFunction(GOP_WritePhonebook, WritePhonebook);
+*/
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for support for AT protocol
+
+*/
+
+/* "Turn on" prototypes in AT.h */
+#define __AT_c
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+ #include <windows.h>
+ #include "misc_win32.h"
+#else
+ #include <ctype.h>
+#endif
+
+/* Various header file */
+#include "devices/device.h"
+#include "gsm-api.h"
+#include "protocol/at.h"
+
+GSM_Protocol AT_Functions = {
+ AT_Initialise,
+ AT_SendMessage,
+ AT_SendFrame,
+ AT_WritePhone,
+ AT_Terminate,
+ AT_RX_StateMachine
+};
+
+/* Local variables */
+u16 BufferCount;
+
+u16 MessageLength;
+
+u8 MessageBuffer[AT_MAX_RECEIVE_LENGTH * 6];
+
+static bool wascrlf = false;
+static char *linestart = MessageBuffer;
+
+/* N61_RX_DisplayMessage is called when a message we don't know about is
+ received so that the user can see what is going back and forth, and perhaps
+ shed some more light/explain another message type! */
+
+#ifdef DEBUG
+void AT_RX_DisplayMessage()
+{
+ fprintf(stdout, _("Phone\n"));
+
+ hexdump(MessageLength,MessageBuffer);
+}
+#endif /* DEBUG */
+
+/* Prepares the message header and sends it, prepends the message start byte
+ (0x1e) and other values according the value specified when called.
+ Calculates checksum and then sends the lot down the pipe... */
+int AT_SendFrame(u16 message_length, u8 message_type, u8 *buffer) {
+
+#ifdef DEBUG
+ int count;
+#endif
+
+ /* FIXME - we should check for the message length ... */
+
+#ifdef DEBUG
+ fprintf(stdout, _("PC: "));
+
+ for (count = 0; count < message_length-1; count++)
+ fprintf(stdout, "%c", buffer[count]);
+
+ fprintf(stdout, "\n");
+#endif /* DEBUG */
+
+ /* Send it out... */
+ if (!AT_WritePhone(message_length,buffer))
+ return (false);
+
+ return (true);
+}
+
+int AT_SendMessage(u16 message_length, u8 message_type, u8 *buffer) {
+
+ AT_SendFrame(message_length, message_type, buffer);
+
+ return (true);
+}
+
+int AT_SendAck(u8 message_type, u8 message_seq) {
+
+ return true;
+}
+
+/* Applications should call AT_Terminate to shut down the AT thread and
+ close the serial port. */
+void AT_Terminate(void)
+{
+ /* Request termination of thread */
+ CurrentRequestTerminate = true;
+
+ /* Close serial port. */
+ device_close();
+}
+
+/* RX_State machine for receive handling. Called once for each character
+ received from the phone/phone. */
+
+void AT_RX_StateMachine(unsigned char rx_byte) {
+
+ /* FIXME: Check for overflow */
+ MessageBuffer[BufferCount] = rx_byte;
+ MessageBuffer[BufferCount + 1] = '\0';
+
+// fprintf(stdout,_("%02x %c\n"),rx_byte,rx_byte);
+
+ if (wascrlf && (rx_byte != 10 && rx_byte != 13)) {
+ linestart = MessageBuffer + BufferCount;
+ wascrlf = false;
+ }
+
+ if ((rx_byte== 10 || rx_byte==13)) wascrlf = true;
+
+ if ((BufferCount > 0) && (10 == MessageBuffer[BufferCount])
+ && (13 == MessageBuffer[BufferCount-1])
+ && ((0 == strncmp("OK", linestart, 2))
+ || (0 == strncmp("ERROR", linestart, 5))
+ || (0 == strncmp("+CME ERROR:", linestart, 11))
+ || (0 == strncmp("+CMS ERROR:", linestart, 11)))) {
+
+ MessageLength=BufferCount;
+
+#ifdef DEBUG
+ AT_RX_DisplayMessage();
+#endif
+
+ GSM->DispatchMessage(MessageLength,MessageBuffer, 0x00);
+
+ BufferCount = 0;
+ linestart = MessageBuffer;
+ wascrlf = false;
+
+ } else BufferCount++;
+}
+
+/* Called by initialisation code to open comm port in asynchronous mode. */
+bool AT_OpenSerial(void)
+{
+// device_changespeed(115200);
+
+ device_changespeed(19200);
+
+ return (true);
+}
+
+/* Initialise variables and state machine. */
+GSM_Error AT_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+
+ if (!StartConnection (port_device,false,connection))
+ return GE_INTERNALERROR;
+
+ CurrentConnectionType = connection;
+
+ if (AT_OpenSerial() != true) return GE_INTERNALERROR;
+
+ BufferCount=0;
+
+ return (GE_NONE);
+}
+
+bool AT_WritePhone (u16 length, u8 *buffer) {
+ int i;
+
+ for (i=0;i<length;i++) {
+ if (device_write(buffer+i,1)!=1) return false;
+ /* For some phones like Siemens M20 we need to wait a little
+ after writing each char. Possible reason: these phones
+ can't receive so fast chars or there is bug here in mygnokii */
+ usleep(1);
+ }
+
+ return true;
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for support for FBUS protocol
+
+*/
+
+/* "Turn on" prototypes in fbus.h */
+#define __fbus_c
+
+/* System header files */
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+ #include <windows.h>
+ #include "misc_win32.h"
+#else
+ #include <ctype.h>
+#endif
+
+/* Various header file */
+#include "devices/device.h"
+#include "gsm-api.h"
+#include "protocol/fbus.h"
+#include "protocol/at.h"
+#include "newmodules/newat.h"
+#include "newmodules/n6110.h"
+#include "misc.h"
+
+GSM_Protocol FBUS_Functions = {
+ FBUS_Initialise,
+ FBUS_SendMessage,
+ FBUS_SendFrame,
+ NULL_WritePhone,
+ FBUS_Terminate,
+ FBUS_RX_StateMachine
+};
+
+/* Local variables */
+enum FBUS_RX_States RX_State;
+
+u8 MessageDestination, MessageSource;
+
+u16 BufferCount, MultiBufferCount;
+
+u16 MessageLength, MultiMessageLength;
+
+bool RX_Multiple = false;
+
+u8 MessageType,MultiMessageType;
+
+u8 MessageBuffer[FBUS_MAX_RECEIVE_LENGTH * 6],MultiMessageBuffer[FBUS_MAX_RECEIVE_LENGTH * 6];
+
+u8 RequestSequenceNumber = 0x00;
+
+#ifdef DEBUG
+char *N61_PrintDevice(int Device)
+{
+ switch (Device) {
+
+ case FBUS_DEVICE_PHONE:return _("Phone");
+ case FBUS_DEVICE_PC :return _("PC");
+ default :return _("Unknown");
+ }
+}
+#endif /* DEBUG */
+
+/* N61_RX_DisplayMessage is called when a message we don't know about is
+ received so that the user can see what is going back and forth, and perhaps
+ shed some more light/explain another message type! */
+void N61_RX_DisplayMessage()
+{
+#ifdef DEBUG
+ fprintf(stdout, _("Msg Dest: %s\n"), N61_PrintDevice(MessageDestination));
+ fprintf(stdout, _("Msg Source: %s\n"), N61_PrintDevice(MessageSource));
+ fprintf(stdout, _("Msg Type: %02x\n"), MessageType);
+
+ hexdump(MessageLength-2,MessageBuffer);
+#endif
+
+ AppendLog(MessageBuffer,MessageLength-2,true);
+}
+
+/* Prepares the message header and sends it, prepends the message start byte
+ (0x1e) and other values according the value specified when called.
+ Calculates checksum and then sends the lot down the pipe... */
+int FBUS_SendFrame(u16 message_length, u8 message_type, u8 *buffer) {
+
+ /* Originally out_buffer[FBUS_MAX_CONTENT_LENGTH + 2],
+ but it made problems with MBUS */
+ u8 out_buffer[1000];
+
+ int count, current=0;
+ unsigned char checksum;
+
+ /* FIXME - we should check for the message length ... */
+
+ /* Now construct the message header. */
+
+ if (CurrentConnectionType==GCT_FBUS)
+ out_buffer[current++] = FBUS_FRAME_ID; /* Start of the frame indicator */
+ else
+ out_buffer[current++] = FBUS_IR_FRAME_ID; /* Start of the frame indicator */
+
+ out_buffer[current++] = FBUS_DEVICE_PHONE; /* Destination */
+
+ out_buffer[current++] = FBUS_DEVICE_PC; /* Source */
+
+ out_buffer[current++] = message_type; /* Type */
+
+ out_buffer[current++] = 0; /* Length1 */
+ out_buffer[current++] = message_length; /* Length2 */
+
+ /* Copy in data if any. */
+ if (message_length != 0) {
+ memcpy(out_buffer + current, buffer, message_length);
+ current+=message_length;
+ }
+
+ /* If the message length is odd we should add pad byte 0x00 */
+ if (message_length % 2)
+ out_buffer[current++]=0x00;
+
+ /* Now calculate checksums over entire message and append to message. */
+
+ /* Odd bytes */
+ checksum = 0;
+ for (count = 0; count < current; count+=2)
+ checksum ^= out_buffer[count];
+
+ out_buffer[current++] = checksum;
+
+ /* Even bytes */
+ checksum = 0;
+ for (count = 1; count < current; count+=2)
+ checksum ^= out_buffer[count];
+
+ out_buffer[current++] = checksum;
+
+#ifdef DEBUG
+ NULL_TX_DisplayMessage(current, out_buffer);
+#endif /* DEBUG */
+
+ /* Send it out... */
+ if (!NULL_WritePhone(current,out_buffer))
+ return (false);
+
+ return (true);
+}
+
+int FBUS_SendMessage(u16 message_length, u8 message_type, u8 *buffer) {
+
+ u8 seqnum;
+
+ u8 frame_buffer[FBUS_MAX_CONTENT_LENGTH + 2];
+
+ u8 nom, lml; /* number of messages, last message len */
+ int i;
+
+ seqnum = 0x40 + RequestSequenceNumber;
+ RequestSequenceNumber = (RequestSequenceNumber + 1) & 0x07;
+
+ if (message_length > FBUS_MAX_CONTENT_LENGTH) {
+
+ nom = (message_length + FBUS_MAX_CONTENT_LENGTH - 1)
+ / FBUS_MAX_CONTENT_LENGTH;
+ lml = message_length - ((nom - 1) * FBUS_MAX_CONTENT_LENGTH);
+
+ for (i = 0; i < nom - 1; i++) {
+
+ memcpy(frame_buffer, buffer + (i * FBUS_MAX_CONTENT_LENGTH),
+ FBUS_MAX_CONTENT_LENGTH);
+ frame_buffer[FBUS_MAX_CONTENT_LENGTH] = nom - i;
+ frame_buffer[FBUS_MAX_CONTENT_LENGTH + 1] = seqnum;
+
+ FBUS_SendFrame(FBUS_MAX_CONTENT_LENGTH + 2, message_type,
+ frame_buffer);
+
+ seqnum = RequestSequenceNumber;
+ RequestSequenceNumber = (RequestSequenceNumber + 1) & 0x07;
+ }
+
+ memcpy(frame_buffer, buffer + ((nom - 1) * FBUS_MAX_CONTENT_LENGTH), lml);
+ frame_buffer[lml] = 0x01;
+ frame_buffer[lml + 1] = seqnum;
+ FBUS_SendFrame(lml + 2, message_type, frame_buffer);
+
+ } else {
+
+ memcpy(frame_buffer, buffer, message_length);
+ frame_buffer[message_length] = 0x01;
+ frame_buffer[message_length + 1] = seqnum;
+ FBUS_SendFrame(message_length + 2, message_type, frame_buffer);
+ }
+
+ return (true);
+}
+
+int FBUS_SendAck(u8 message_type, u8 message_seq) {
+
+ unsigned char request[6];
+
+ request[0] = message_type;
+ request[1] = message_seq;
+
+#ifdef DEBUG
+ fprintf(stdout, _("[Sending Ack of type %02x, seq: %x]\n"), message_type, message_seq);
+#endif /* DEBUG */
+
+ return FBUS_SendFrame(2, FBUS_FRTYPE_ACK, request);
+}
+
+/* Applications should call FBUS_Terminate to shut down the FBUS thread and
+ close the serial port. */
+void FBUS_Terminate(void)
+{
+ /* Request termination of thread */
+ CurrentRequestTerminate = true;
+
+ /* Close serial port. */
+ device_close();
+}
+
+/* RX_State machine for receive handling. Called once for each character
+ received from the phone/phone. */
+
+void FBUS_RX_StateMachine(unsigned char rx_byte) {
+
+ static struct timeval time_now, time_last, time_diff;
+
+ static int checksum[2];
+
+ int i=0;
+
+// if (CurrentConnectionType==GCT_DLR3) {
+// AT_RX_StateMachine(rx_byte);
+// } else {
+
+#ifdef DEBUG
+ /* For model sniff only display received bytes */
+ if (strcmp(GSM_Info->FBUSModels, "sniff"))
+ {
+#endif
+
+ /* XOR the byte with the current checksum */
+ checksum[BufferCount&1] ^= rx_byte;
+
+ switch (RX_State) {
+
+ /* Messages from the phone start with an 0x1e (FBUS) or 0x1c (IR) or 0x1f (MBUS).
+ We use this to "synchronise" with the incoming data stream. However,
+ if we see something else, we assume we have lost sync and we require
+ a gap of at least 5ms before we start looking again. This is because
+ the data part of the frame could contain a byte which looks like the
+ sync byte */
+
+ case FBUS_RX_Discarding:
+
+#ifndef VC6
+ gettimeofday(&time_now, NULL);
+ timersub(&time_now, &time_last, &time_diff);
+ if (time_diff.tv_sec == 0 && time_diff.tv_usec < 5000) {
+ time_last = time_now; /* no gap seen, continue discarding */
+ break;
+ }
+ /* else fall through to... */
+#endif
+
+ case FBUS_RX_Sync:
+
+ if ((CurrentConnectionType==GCT_FBUS && rx_byte == FBUS_FRAME_ID) ||
+ ((CurrentConnectionType==GCT_Infrared ||
+ CurrentConnectionType==GCT_Tekram) && rx_byte == FBUS_IR_FRAME_ID)) {
+
+ BufferCount = 0;
+
+ RX_State = FBUS_RX_GetDestination;
+
+ /* Initialize checksums. */
+ checksum[0] = rx_byte;
+ checksum[1] = 0;
+ } else {
+ /* Lost frame sync */
+ RX_State = FBUS_RX_Discarding;
+#ifndef VC6
+ gettimeofday(&time_last, NULL);
+#endif
+ }
+ break;
+
+ case FBUS_RX_GetDestination:
+
+ MessageDestination=rx_byte;
+ RX_State = FBUS_RX_GetSource;
+
+ /* When there is a checksum error and things get out of sync we have to manage to resync */
+ /* If doing a data call at the time, finding a 0x1e etc is really quite likely in the data stream */
+ /* Then all sorts of horrible things happen because the packet length etc is wrong... */
+ /* Therefore we test here for a destination of 0x0c and return to the top if it is not */
+ if (rx_byte!=FBUS_DEVICE_PC && strstr(GSM_Info->FBUSModels, "sniff")==NULL) {
+ RX_State=FBUS_RX_Sync;
+#ifdef DEBUG
+ fprintf(stdout,"The fbus stream is out of sync - expected 0x0c, got %2x\n",rx_byte);
+#endif
+ AppendLogText("SYNC\n",false);
+ }
+
+ break;
+
+ case FBUS_RX_GetSource:
+
+ MessageSource=rx_byte;
+ RX_State = FBUS_RX_GetType;
+
+ /* Source should be 0x00 */
+ if (rx_byte!=FBUS_DEVICE_PHONE && strstr(GSM_Info->FBUSModels, "sniff")==NULL) {
+ RX_State=FBUS_RX_Sync;
+#ifdef DEBUG
+ fprintf(stdout,"The fbus stream is out of sync - expected 0x00, got %2x\n",rx_byte);
+#endif
+ AppendLogText("SYNC\n",false);
+ }
+
+ break;
+
+ case FBUS_RX_GetType:
+
+ MessageType=rx_byte;
+
+ RX_State = FBUS_RX_GetLength1;
+
+ break;
+
+ case FBUS_RX_GetLength1:
+
+ MessageLength = 0;
+
+ RX_State = FBUS_RX_GetLength2;
+
+ break;
+
+ case FBUS_RX_GetLength2:
+
+ /* MW:Here are problems with conversion. For chars 0-127 it's OK, for
+ higher not (probably because rx_byte is char type) - improtant
+ for MBUS. So, I make it double and strange - generally it should be
+ more simple and make simple convert rx_byte into MessageLength */
+#if defined(__svr4__) || defined(__FreeBSD__)
+ if (rx_byte!=0) {
+ for (i=0;i<rx_byte;i++)
+ MessageLength=MessageLength++;
+ }
+#else
+ MessageLength = rx_byte;
+#endif
+
+ RX_State = FBUS_RX_GetMessage;
+
+ break;
+
+ case FBUS_RX_GetMessage:
+
+ MessageBuffer[BufferCount] = rx_byte;
+ BufferCount ++;
+
+ if (BufferCount>FBUS_MAX_RECEIVE_LENGTH*6) {
+#ifdef DEBUG
+ fprintf(stdout, "FB61: Message buffer overun - resetting\n");
+#endif
+ AppendLogText("OVERUN\n",false);
+ RX_Multiple=false;
+ RX_State = FBUS_RX_Sync;
+ break;
+ }
+
+ /* If this is the last byte, it's the checksum. */
+ if (BufferCount == MessageLength+(MessageLength%2)+2) {
+
+ /* Is the checksum correct? */
+ if (checksum[0] == checksum[1]) {
+
+ if (RX_Multiple) {
+
+ if (MessageType==MultiMessageType) {
+
+ if (MessageLength+MultiMessageLength>FBUS_MAX_RECEIVE_LENGTH*6) {
+#ifdef DEBUG
+ fprintf(stdout, "FB61: Message buffer overun - resetting\n");
+#endif
+ AppendLogText("OVERUN\n",false);
+ RX_Multiple=false;
+ RX_State = FBUS_RX_Sync;
+ break;
+ }
+
+ /* We copy next part of multiframe message into special buffer */
+ for (i=0;i<MessageLength;i++) {
+ MultiMessageBuffer[i+MultiMessageLength]=MessageBuffer[i];
+ }
+ MultiMessageLength=MultiMessageLength+MessageLength-2;
+
+ FBUS_SendAck(MessageType, MessageBuffer[MessageLength-1] & 0x0f);
+
+ if ((MessageLength > 1) && (MessageBuffer[MessageLength-2] != 0x01))
+ {
+ } else {
+ for (i=0;i<MultiMessageLength+2;i++) {
+ MessageBuffer[i]=MultiMessageBuffer[i];
+ }
+ MessageLength=MultiMessageLength+2;
+ RX_Multiple=false;
+
+ /* Do not debug Ack and RLP frames to detail. */
+ if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1)
+ N61_RX_DisplayMessage();
+
+ GSM->DispatchMessage(MessageLength-2, MessageBuffer, MessageType);
+ }
+
+ } else {
+
+ /* We do not want to send ACK of ACKs and ACK of RLP frames. */
+ if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1) {
+ FBUS_SendAck(MessageType, MessageBuffer[MessageLength-1] & 0x0f);
+
+ if ((MessageLength > 1) && (MessageBuffer[MessageLength-2] != 0x01))
+ {
+#ifdef DEBUG
+ fprintf(stdout,_("Multiframe message in multiframe message !\n"));
+ fprintf(stdout,_("Please report it !\n"));
+#endif
+ RX_State = FBUS_RX_Sync;
+ }
+ }
+ }
+ } else {
+
+ /* We do not want to send ACK of ACKs and ACK of RLP frames. */
+ if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1) {
+ FBUS_SendAck(MessageType, MessageBuffer[MessageLength-1] & 0x0f);
+
+ if ((MessageLength > 1) && (MessageBuffer[MessageLength-2] != 0x01))
+ {
+ /* We copy previous part of multiframe message into special buffer */
+ RX_Multiple = true;
+ for (i=0;i<MessageLength-2;i++) {
+ MultiMessageBuffer[i]=MessageBuffer[i];
+ }
+ MultiMessageLength=MessageLength-2;
+ MultiMessageType=MessageType;
+ }
+ }
+
+ if (!RX_Multiple && MessageDestination!=FBUS_DEVICE_PHONE ) {
+ /* Do not debug Ack and RLP frames to detail. */
+ if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1)
+ N61_RX_DisplayMessage();
+
+ GSM->DispatchMessage(MessageLength-2, MessageBuffer, MessageType);
+ }
+
+#ifdef DEBUG
+ /* When make debug and message is to phone display it */
+ if (MessageDestination==FBUS_DEVICE_PHONE) {
+ for (i=MessageLength;i>=0;i--)
+ MessageBuffer[i+6]=MessageBuffer[i];
+ MessageBuffer[0]=FBUS_FRAME_ID;
+ MessageBuffer[1]=FBUS_DEVICE_PHONE;
+ MessageBuffer[2]=FBUS_DEVICE_PC;
+ MessageBuffer[3]=MessageType;
+ MessageBuffer[4]=0;
+ MessageBuffer[5]=MessageLength;
+ MessageLength=MessageLength+8;
+ if (MessageLength % 2) MessageLength++;
+ NULL_TX_DisplayMessage(MessageLength, MessageBuffer);
+ }
+#endif
+ }
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Bad checksum %02x (should be %02x), msg len=%i !\n"),checksum[0],checksum[1],MessageLength);
+#endif /* DEBUG */
+ AppendLogText("CHECKSUM\n",false);
+
+ /* Just to be sure! */
+ RX_Multiple=false;
+ }
+ RX_State = FBUS_RX_Sync;
+ }
+ break;
+ }
+
+#ifdef DEBUG
+ } else {
+ if (isprint(rx_byte))
+ fprintf(stdout, "[%02x%c]", rx_byte, rx_byte);
+ else
+ fprintf(stdout, "[%02x ]", rx_byte);
+
+ }
+#endif
+
+// }
+}
+
+/* Called by initialisation code to open comm port in asynchronous mode. */
+bool FBUS_OpenSerial(void)
+{
+ /* Uncomment, if want to test first method for DLR3 */
+// unsigned char req[3] = {"AT\r"};
+// unsigned char req2[5] = {"AT&F\r"};
+// unsigned char req3[13] = {"AT*NOKIAFBUS\r"};
+
+// GSM_Error error;
+
+// GSM_Information *GSMINFOCOPY;
+// GSM_Functions *GSMCOPY;
+
+ switch (CurrentConnectionType) {
+ case GCT_FBUS:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Setting cable for FBUS communication...\n"));
+#endif /* DEBUG */
+
+ device_changespeed(115200);
+
+ /* Colin wrote:
+ The data suite cable has some electronics built into the connector. This of
+ course needs a power supply of some sorts to operate properly.
+
+ In this case power is drawn off the handshaking lines of the PC. DTR has to
+ be set and RTS have to be cleared, thus if you use a terminal program (that
+ does not set the handshaking lines to these conditions) you will get weird
+ results. It will not set them like this since if Request To Send (RTS) is
+ not set the other party will not send any data (in hardware handshaking)
+ and if DTS is not set (handshaking = none) the cable will not receive
+ power. */
+ /* clearing the RTS bit and setting the DTR bit*/
+ device_setdtrrts(1, 0);
+
+ break;
+ case GCT_DLR3:
+
+#ifdef DEBUG
+ fprintf(stdout, _("Setting DLR3 cable for FBUS communication...\n"));
+#endif /* DEBUG */
+
+ /* There are 2 ways to init DLR in FBUS: Here is first described by
+ Reuben Harris [reuben.harris@snowvalley.com] and used in Logo Manager,
+ 1. Firstly set the connection baud to 19200, DTR off, RTS off,
+ Parity on, one stop bit,
+ 2. Send "AT\r\n". The response should be "AT\r\n\r\nOK\r\n".
+ 3. Send "AT&F\r\n". The response should be "AT&F\r\n\r\nOK\r\n".
+ 4. Send "AT*NOKIAFBUS\r\n". The response should be
+ "AT*NOKIAFBUS\r\n\r\nOK\r\n".
+ 5. Set speed to 115200
+
+ This is one should be used by us, because seems to be compatible with more
+ phones. But we make something wrong and often phones don't want to start transmision */
+
+ /* Uncomment and test if want */
+// device_changespeed(19200);
+
+ /*leave RTS low, DTR low for duration of session.*/
+// device_setdtrrts(0, 0);
+
+ /* Making copy of pointers */
+// GSMCOPY = GSM;
+// GSMINFOCOPY =GSM_Info;
+
+ /* Set pointers to relevant addresses - new "AT" module here is required */
+// GSM = &Nat_Functions;
+// GSM_Info = &Nat_Information;
+
+ /* Note: We change Protocol inside function pointed by it.
+ That's why in FBUS_RX_StateMachine we must check it (changing
+ Protocol is not enough), This is for correct work and be sure... */
+// Protocol = &AT_Functions;
+
+// error=N6110_SendMessageSequence (50, &CurrentGetHWError, 3, 0x00, req);
+// if (error!=GE_NONE) return false;
+
+// error=N6110_SendMessageSequence (50, &CurrentGetHWError, 5, 0x00, req2);
+// if (error!=GE_NONE) return false;
+
+// error=N6110_SendMessageSequence (50, &CurrentGetHWError, 13, 0x00, req3);
+// if (error!=GE_NONE) return false;
+
+ /* Returning to old protocol */
+// Protocol = &FBUS_Functions;
+
+ /* Returning to old module */
+// GSM = GSMCOPY;
+// GSM_Info = GSMINFOCOPY;
+
+// device_changespeed(115200);
+
+ /* Second method for DLR3:
+ Used by some 7110 soft, but not compatible with some other
+ phones supporting DLR3 - 7160, NCP2.0
+ Used in this moment in mygnokii
+ */
+
+ device_changespeed(115200);
+
+ /*leave RTS low, DTR low for duration of session.*/
+ device_setdtrrts(0, 0);
+
+ usleep(100000);
+
+ CurrentConnectionType=GCT_FBUS;
+
+ break;
+ case GCT_Infrared:
+ /* It's more complicated and not done here */
+ break;
+
+ case GCT_Tekram:
+ /* It's more complicated and not done here */
+ break;
+
+ default:
+#ifdef DEBUG
+ fprintf(stdout,_("Wrong connection type for fbus module. Inform marcin-wiacek@topnet.pl about it\n"));
+#endif
+ break;
+ }
+
+ return (true);
+}
+
+/* Initialise variables and state machine. */
+GSM_Error FBUS_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+
+ if (!StartConnection (port_device,false,connection))
+ return GE_INTERNALERROR;
+
+ CurrentConnectionType = connection;
+
+ if (FBUS_OpenSerial() != true) return GE_INTERNALERROR;
+
+ return (GE_NONE);
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for support for fbusirda protocol
+
+*/
+
+/* "Turn on" prototypes in fbusirda.h */
+#define __fbusirda_c
+
+/* System header files */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+ #include <windows.h>
+ #include "misc_win32.h"
+#else
+ #include <ctype.h>
+#endif
+
+/* Various header file */
+#include "devices/device.h"
+#include "gsm-api.h"
+#include "protocol/fbusirda.h"
+#include "protocol/fbus.h"
+#include "misc.h"
+
+GSM_Protocol FBUSIRDA_Functions = {
+ FBUSIRDA_Initialise,
+ FBUSIRDA_SendMessage,
+ FBUSIRDA_SendFrame,
+ FBUSIRDA_WritePhone,
+ FBUSIRDA_Terminate,
+ FBUSIRDA_RX_StateMachine
+};
+
+/* Local variables */
+enum FBUS_RX_States RX_State;
+
+u8 MessageDestination, MessageSource;
+
+u16 BufferCount;
+
+u16 MessageLength;
+
+u8 MessageType;
+
+u8 MessageBuffer[FBUS_MAX_RECEIVE_LENGTH * 6];
+
+#ifdef DEBUG
+char *FBUSIRDA_PrintDevice(int Device)
+{
+ switch (Device) {
+
+ case FBUS_DEVICE_PHONE:
+ return _("Phone");
+
+ case FBUS_DEVICE_PC:
+ return _("PC");
+
+ default:
+ return _("Unknown");
+
+ }
+}
+
+/* FBUSIRDA_RX_DisplayMessage is called when a message we don't know about is
+ received so that the user can see what is going back and forth, and perhaps
+ shed some more light/explain another message type! */
+void FBUSIRDA_RX_DisplayMessage()
+{
+ fprintf(stdout, _("Msg Source: %s\n"), FBUSIRDA_PrintDevice(MessageSource));
+ fprintf(stdout, _("Msg Dest: %s\n"), FBUSIRDA_PrintDevice(MessageDestination));
+ fprintf(stdout, _("Msg Type: %02x\n"), MessageType);
+
+ hexdump( MessageLength, MessageBuffer);
+}
+#endif /* DEBUG */
+
+/* Prepares the message header and sends it, prepends the message start byte
+ (0x1e) and other values according the value specified when called.
+ Calculates checksum and then sends the lot down the pipe... */
+int FBUSIRDA_SendFrame(u16 message_length, u8 message_type, u8 *buffer) {
+ u8 out_buffer[FBUSIRDA_MAX_CONTENT_LENGTH + 2];
+
+ int current=0;
+ int header=0;
+
+ /* FIXME - we should check for the message length ... */
+
+ /* Now construct the message header. */
+
+ out_buffer[current++] = FBUSIRDA_FRAME_ID; /* Start of the frame indicator */
+
+ out_buffer[current++] = FBUS_DEVICE_PHONE; /* Destination */
+
+ out_buffer[current++] = FBUS_DEVICE_PC; /* Source */
+
+ out_buffer[current++] = message_type; /* Type */
+
+ out_buffer[current++] = message_length/256; /* Length1 */
+ out_buffer[current++] = message_length%256; /* Length2 */
+
+ /* Copy in data if any. */
+
+ if (message_length != 0) {
+ memcpy(out_buffer + current, buffer, message_length);
+ header = current;
+ current+=message_length;
+ }
+
+#ifdef DEBUG
+ NULL_TX_DisplayMessage( current, out_buffer);
+#endif /* DEBUG */
+
+ /* Send it out... */
+ return ( FBUSIRDA_WritePhone(current,out_buffer) - header);
+
+}
+
+int FBUSIRDA_SendMessage(u16 message_length, u8 message_type, u8 *buffer) {
+
+ u8 frame_buffer[FBUSIRDA_MAX_CONTENT_LENGTH + 2];
+ u16 ret;
+
+ memcpy(frame_buffer, buffer, message_length);
+ ret = FBUSIRDA_SendFrame(message_length, message_type, frame_buffer);
+
+ if (ret != message_length)
+ {
+ printf("CAUTION: FBUSIRDA_SendFrame return written %d bytes of %d !\n",ret, message_length);
+ return(false);
+ }
+ else
+ return (true);
+}
+
+int FBUSIRDA_SendAck(u8 message_type, u8 message_seq) {
+ return(true);
+}
+
+/* Applications should call MBUS_Terminate to shut down the MBUS thread and
+ close the serial port. */
+void FBUSIRDA_Terminate(void)
+{
+ /* Request termination of thread */
+ CurrentRequestTerminate = true;
+
+ /* Close serial port. */
+ device_close();
+}
+
+/* RX_State machine for receive handling. Called once for each character
+ received from the phone/phone. */
+void FBUSIRDA_RX_StateMachine(unsigned char rx_byte) {
+
+ unsigned char max;
+
+ int i;
+
+ i=0;
+
+ switch (RX_State) {
+
+ case FBUS_RX_Discarding:
+ break;
+
+ /* Messages from the phone start with an 0x14 (IRDA, Nokia:PhoNet).
+ We use this to "synchronise" with the incoming data stream. */
+
+ case FBUS_RX_Sync:
+
+ if (rx_byte == FBUSIRDA_FRAME_ID) {
+ BufferCount = 0;
+ RX_State = FBUS_RX_GetDestination;
+ }
+
+ break;
+
+ case FBUS_RX_GetDestination:
+
+ MessageDestination=rx_byte;
+ RX_State = FBUS_RX_GetSource;
+
+ /* When there is a checksum error and things get out of sync we have to manage to resync */
+ /* If doing a data call at the time, finding a 0x1e etc is really quite likely in the data stream */
+ /* Then all sorts of horrible things happen because the packet length etc is wrong... */
+ /* Therefore we test here for a destination of 0x0c and return to the top if it is not */
+
+#ifdef DEBUG
+ if (strstr(GSM_Info->IrdaModels,"decode")!=NULL)
+ {
+ if (rx_byte!=FBUS_DEVICE_PC && rx_byte!=FBUS_DEVICE_PHONE )
+ {
+ RX_State=FBUS_RX_Sync;
+ fprintf(stdout,"decode: expected FBUS_DEVICE_PC/FBUS_DEVICE_PHONE, got %2x\n",rx_byte);
+ }
+ }//decode Model
+ else
+ {
+#endif
+ if (rx_byte!=FBUS_DEVICE_PC)
+ {
+ RX_State=FBUS_RX_Sync;
+#ifdef DEBUG
+ fprintf(stdout,"The FBUSIRDA stream is out of sync - expected FBUS_DEVICE_PC, got %2x\n",rx_byte);
+#endif
+ }
+#ifdef DEBUG
+ }//not decode Model
+#endif
+
+ break;
+
+ case FBUS_RX_GetSource:
+
+ MessageSource=rx_byte;
+ RX_State = FBUS_RX_GetType;
+
+#ifdef DEBUG
+ if (strstr(GSM_Info->IrdaModels,"decode")!=NULL)
+ {
+ if (rx_byte!=FBUS_DEVICE_PC && rx_byte!=FBUS_DEVICE_PHONE )
+ {
+ RX_State=FBUS_RX_Sync;
+ fprintf(stdout,"decode: expected FBUS_DEVICE_PC/FBUS_DEVICE_PHONE, got %2x\n",rx_byte);
+ }
+ }//decode Model
+ else
+ {
+#endif
+ if (rx_byte!=FBUS_DEVICE_PHONE)
+ {
+ RX_State=FBUS_RX_Sync;
+#ifdef DEBUG
+ fprintf(stdout,"The FBUSIRDA stream is out of sync - expected FBUS_DEVICE_PHONE, got %2x\n",rx_byte);
+#endif
+ }
+#ifdef DEBUG
+ }//not decode Model
+#endif
+
+ break;
+
+ case FBUS_RX_GetType:
+
+ MessageType=rx_byte;
+ RX_State = FBUS_RX_GetLength1;
+
+ break;
+
+ case FBUS_RX_GetLength1:
+
+ MessageLength=0;
+
+ /* MW:Here are problems with conversion. For chars 0-127 it's OK, for
+ higher not (probably because rx_byte is char type) - improtant
+ for MBUS. So, I make it double and strange - generally it should be
+ more simple and make simple convert rx_byte into MessageLength */
+ if (rx_byte!=0) {
+ max=rx_byte;
+ MessageLength=max*256;
+ }
+
+ RX_State = FBUS_RX_GetLength2;
+
+ break;
+
+ case FBUS_RX_GetLength2:
+
+ /* MW:Here are problems with conversion. For chars 0-127 it's OK, for
+ higher not (probably because rx_byte is char type) - important
+ for MBUS. So, I make it double and strange - generally it should be
+ more simple and make simple convert rx_byte into MessageLength */
+#if defined(__svr4__) || defined(__FreeBSD__)
+ if (rx_byte!=0) {
+ for (i=0;i<rx_byte;i++)
+ MessageLength=MessageLength++;
+ }
+#else
+ if (rx_byte!=0) {
+ max=rx_byte;
+ MessageLength=MessageLength+max;
+ }
+#endif
+
+ RX_State = FBUS_RX_GetMessage;
+
+ break;
+
+ case FBUS_RX_GetMessage:
+
+ MessageBuffer[BufferCount] = rx_byte;
+ BufferCount ++;
+
+ if (BufferCount == MessageLength)
+ {
+ if (MessageSource == FBUS_DEVICE_PHONE)
+ {
+#ifdef DEBUG
+ FBUSIRDA_RX_DisplayMessage();
+#endif /* DEBUG */
+ GSM->DispatchMessage(MessageLength, MessageBuffer, MessageType);
+ }
+ else
+ {
+#ifdef DEBUG
+ /* for --decodefile */
+ fprintf(stdout, _("Msg Source: %s\n"), FBUSIRDA_PrintDevice(MessageSource));
+ fprintf(stdout, _("Msg Dest: %s\n"), FBUSIRDA_PrintDevice(MessageDestination));
+ fprintf(stdout, _("Msg Type: %02x\n"), MessageType);
+ hexdump( MessageLength, MessageBuffer);
+#endif /* DEBUG */
+ }
+
+ RX_State = FBUS_RX_Sync;
+ }
+ break;
+ }
+}
+
+/* Called by initialisation code to open comm port in asynchronous mode. */
+bool FBUSIRDA_OpenSerial(void)
+{
+#ifdef DEBUG
+ fprintf(stdout, _("Setting FBUS Irda communication...\n"));
+#endif /* DEBUG */
+
+ return (true);
+
+}
+
+/* Initialise variables and state machine. */
+GSM_Error FBUSIRDA_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+ CurrentConnectionType = connection;
+
+ if (!StartConnection(port_device,false,connection)) {
+ return GE_INTERNALERROR;
+ }
+ RX_State=FBUS_RX_Sync;
+
+ return (GE_NONE);
+}
+
+bool FBUSIRDA_WritePhone (u16 length, u8 *buffer) {
+
+ if (!CurrentDisableKeepAlive)
+ usleep(150);
+
+ return (device_write(buffer,length));
+}
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for support for MBUS protocol
+
+*/
+
+/* "Turn on" prototypes in MBUS.h */
+#define __MBUS_c
+
+/* System header files */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#ifdef WIN32
+ #include <windows.h>
+ #include "misc_win32.h"
+#else
+ #include <ctype.h>
+#endif
+
+/* Various header file */
+#include "devices/device.h"
+#include "gsm-api.h"
+#include "protocol/mbus.h"
+#include "protocol/fbus.h"
+
+GSM_Protocol MBUS_Functions = {
+ MBUS_Initialise,
+ MBUS_SendMessage,
+ MBUS_SendFrame,
+ MBUS_WritePhone,
+ MBUS_Terminate,
+ MBUS_RX_StateMachine
+};
+
+/* Local variables */
+enum FBUS_RX_States RX_State;
+
+u8 MessageDestination, MessageSource;
+
+u16 BufferCount;
+
+u16 MessageLength;
+
+u8 MessageType;
+
+u8 MessageBuffer[MBUS_MAX_RECEIVE_LENGTH * 6];
+
+static u8 RequestSequenceNumber = 0x00;
+
+#ifdef DEBUG
+char *MBUS_PrintDevice(int Device)
+{
+ switch (Device) {
+
+ case FBUS_DEVICE_PHONE:
+ return _("Phone");
+
+ case MBUS_DEVICE_PC1:
+ return _("PC");
+
+ case MBUS_DEVICE_PC2:
+ return _("PC");
+
+ default:
+ return _("Unknown");
+
+ }
+}
+
+/* N61_RX_DisplayMessage is called when a message we don't know about is
+ received so that the user can see what is going back and forth, and perhaps
+ shed some more light/explain another message type! */
+void MBUS_RX_DisplayMessage()
+{
+ fprintf(stdout, _("Msg Dest: %s\n"), MBUS_PrintDevice(MessageDestination));
+ fprintf(stdout, _("Msg Source: %s\n"), MBUS_PrintDevice(MessageSource));
+ fprintf(stdout, _("Msg Type: %02x\n"), MessageType);
+
+ hexdump(MessageLength,MessageBuffer);
+}
+
+#endif /* DEBUG */
+
+/* Prepares the message header and sends it, prepends the message start byte
+ (0x1e) and other values according the value specified when called.
+ Calculates checksum and then sends the lot down the pipe... */
+int MBUS_SendFrame(u16 message_length, u8 message_type, u8 *buffer) {
+ u8 out_buffer[MBUS_MAX_CONTENT_LENGTH + 2];
+
+ int count, current=0;
+ unsigned char checksum;
+
+ /* FIXME - we should check for the message length ... */
+
+ /* Now construct the message header. */
+
+ out_buffer[current++] = MBUS_FRAME_ID; /* Start of the frame indicator */
+
+ out_buffer[current++] = FBUS_DEVICE_PHONE; /* Destination */
+
+ out_buffer[current++] = MBUS_DEVICE_PC1; /* Source */
+
+ out_buffer[current++] = message_type; /* Type */
+
+ out_buffer[current++] = (message_length-1)/256; /* Length1 */
+ out_buffer[current++] = (message_length-1)%256; /* Length2 */
+
+ /* Copy in data if any. */
+
+ if (message_length != 0) {
+ memcpy(out_buffer + current, buffer, message_length);
+ current+=message_length;
+ }
+
+ /* Now calculate checksum over entire message and append to message. */
+
+ /* All bytes */
+ checksum = 0;
+ for (count = 0; count < current; count++)
+ checksum ^= out_buffer[count];
+
+ out_buffer[current++] = checksum;
+
+#ifdef DEBUG
+ NULL_TX_DisplayMessage(current, out_buffer);
+#endif /* DEBUG */
+
+ /* Send it out... */
+ if (!MBUS_WritePhone(current,out_buffer))
+ return (false);
+
+ return (true);
+}
+
+int MBUS_SendMessage(u16 message_length, u8 message_type, u8 *buffer) {
+
+ u8 frame_buffer[MBUS_MAX_CONTENT_LENGTH + 2];
+
+ RequestSequenceNumber++;
+
+ memcpy(frame_buffer, buffer, message_length);
+ frame_buffer[message_length] = RequestSequenceNumber;
+ MBUS_SendFrame(message_length + 1, message_type, frame_buffer);
+
+ return (true);
+}
+
+int MBUS_SendAck(u8 message_type, u8 message_seq) {
+
+ unsigned char request[6];
+
+ int count;
+
+ request[0]=MBUS_FRAME_ID;
+ request[1]=FBUS_DEVICE_PHONE;
+ request[2]=MBUS_DEVICE_PC1;
+ request[3]=FBUS_FRTYPE_ACK;
+ request[4] = message_seq;
+ request[5]=0;
+
+ /* Checksum */
+ for (count = 0; count < 5; count++)
+ request[5] ^= request[count];
+
+#ifdef DEBUG
+ fprintf(stdout, _("[Sending Ack of type %02x, seq: %x]\n"), message_type, message_seq);
+
+ NULL_TX_DisplayMessage(5, request);
+#endif /* DEBUG */
+
+ if (!MBUS_WritePhone(6, request)) {
+#ifdef DEBUG
+ fprintf(stdout,_("Sending ACK failed %i !\n"),count);
+#endif
+ return (false);
+ }
+
+ return(true);
+}
+
+/* Applications should call MBUS_Terminate to shut down the MBUS thread and
+ close the serial port. */
+void MBUS_Terminate(void)
+{
+ /* Request termination of thread */
+ CurrentRequestTerminate = true;
+
+ /* RTS low */
+ device_setdtrrts(0, 0);
+
+ /* Close serial port. */
+ device_close();
+}
+
+/* RX_State machine for receive handling. Called once for each character
+ received from the phone/phone. */
+void MBUS_RX_StateMachine(unsigned char rx_byte) {
+
+ static struct timeval time_now, time_last, time_diff;
+
+ unsigned char max;
+
+ static int checksum[2];
+
+#if defined(__svr4__) || defined(__FreeBSD__) || defined(DEBUG)
+ int i=0;
+#endif
+
+#ifdef DEBUG
+ if (strcmp(GSM_Info->MBUSModels, "mbussniff"))
+ {
+#endif
+
+ checksum[0]=checksum[1];
+ checksum[1] ^= rx_byte;
+
+ switch (RX_State) {
+
+ /* Messages from the phone start with an 0x1f (MBUS).
+ We use this to "synchronise" with the incoming data stream. However,
+ if we see something else, we assume we have lost sync and we require
+ a gap of at least 5ms before we start looking again. This is because
+ the data part of the frame could contain a byte which looks like the
+ sync byte */
+ case FBUS_RX_Discarding:
+#ifndef VC6
+ gettimeofday(&time_now, NULL);
+ timersub(&time_now, &time_last, &time_diff);
+ if (time_diff.tv_sec == 0 && time_diff.tv_usec < 5000) {
+ time_last = time_now; /* no gap seen, continue discarding */
+ break;
+ }
+ /* else fall through to... */
+#endif
+
+ case FBUS_RX_Sync:
+
+ if (rx_byte == MBUS_FRAME_ID) {
+
+ BufferCount = 0;
+
+ RX_State = FBUS_RX_GetDestination;
+
+ /* Initialize checksum. */
+ checksum[1] = MBUS_FRAME_ID;
+ } else {
+ /* Lost frame sync */
+ RX_State = FBUS_RX_Discarding;
+#ifndef VC6
+ gettimeofday(&time_last, NULL);
+#endif
+ }
+
+ break;
+
+ case FBUS_RX_GetDestination:
+
+ MessageDestination=rx_byte;
+ RX_State = FBUS_RX_GetSource;
+
+ /* When there is a checksum error and things get out of sync we have to manage to resync */
+ /* If doing a data call at the time, finding a 0x1e etc is really quite likely in the data stream */
+ /* Then all sorts of horrible things happen because the packet length etc is wrong... */
+ /* Therefore we test here for a destination of 0x0c and return to the top if it is not */
+ /* The same testing for MBUS. Only one change: MBUS returns, what we send.
+ So, the byte can be 0x10 (destination MBUS) or 0x00 (phone) */
+ if (rx_byte!=MBUS_DEVICE_PC1 && rx_byte!=MBUS_DEVICE_PC2 && rx_byte!=FBUS_DEVICE_PHONE) {
+ RX_State=FBUS_RX_Sync;
+#ifdef DEBUG
+ fprintf(stdout,"The mbus stream is out of sync - expected 0x10 or 0x00, got %2x\n",rx_byte);
+#endif
+ }
+
+ break;
+
+ case FBUS_RX_GetSource:
+
+ MessageSource=rx_byte;
+ RX_State = FBUS_RX_GetType;
+
+ /* Source should be 0x00 or 0x10 */
+ if (rx_byte!=FBUS_DEVICE_PHONE && rx_byte!=MBUS_DEVICE_PC1 && rx_byte!=MBUS_DEVICE_PC2) {
+ RX_State=FBUS_RX_Sync;
+#ifdef DEBUG
+ fprintf(stdout,"The mbus stream is out of sync - expected 0x00 or 0x10, got %2x\n",rx_byte);
+#endif
+ }
+
+ break;
+
+ case FBUS_RX_GetType:
+
+ MessageType=rx_byte;
+
+ RX_State = FBUS_RX_GetLength1;
+
+ break;
+
+ case FBUS_RX_GetLength1:
+
+ MessageLength=0;
+
+ /* MW:Here are problems with conversion. For chars 0-127 it's OK, for
+ higher not (probably because rx_byte is char type) - improtant
+ for MBUS. So, I make it double and strange - generally it should be
+ more simple and make simple convert rx_byte into MessageLength */
+ if (rx_byte!=0) {
+ max=rx_byte;
+ MessageLength=max*256;
+ }
+
+ RX_State = FBUS_RX_GetLength2;
+
+ break;
+
+ case FBUS_RX_GetLength2:
+
+ /* MW:Here are problems with conversion. For chars 0-127 it's OK, for
+ higher not (probably because rx_byte is char type) - improtant
+ for MBUS. So, I make it double and strange - generally it should be
+ more simple and make simple convert rx_byte into MessageLength */
+#if defined(__svr4__) || defined(__FreeBSD__)
+ if (rx_byte!=0) {
+ for (i=0;i<rx_byte;i++)
+ MessageLength=MessageLength++;
+ }
+#else
+ if (rx_byte!=0) {
+ max=rx_byte;
+ MessageLength=MessageLength+max;
+ }
+#endif
+
+ RX_State = FBUS_RX_GetMessage;
+
+ /* In MBUS ACK ends here */
+ if (MessageType==FBUS_FRTYPE_ACK)
+ {
+#ifdef DEBUG
+ fprintf(stdout, _("[Received Ack from phone]\n"));
+#endif /* DEBUG */
+ RX_State = FBUS_RX_Sync;
+ }
+
+ break;
+
+ case FBUS_RX_GetMessage:
+
+ MessageBuffer[BufferCount] = rx_byte;
+ BufferCount ++;
+
+ /* If this is the last byte, it's the checksum. */
+ if (BufferCount == MessageLength+2) {
+
+ /* Is the checksum correct? */
+ if (checksum[0] == rx_byte) {
+
+ /* We do not want to send ACK of ACKs and ACK of RLP frames. */
+ if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1
+ && (MessageDestination==MBUS_DEVICE_PC1 || MessageDestination==MBUS_DEVICE_PC2)) {
+ MBUS_SendAck(MessageType, MessageBuffer[BufferCount-2]);
+ }
+
+ /* We don't write info about messages sent to phone */
+ if (MessageDestination!=FBUS_DEVICE_PHONE) {
+#ifdef DEBUG
+ /* Do not debug Ack and RLP frames to detail. */
+ if (MessageType != FBUS_FRTYPE_ACK && MessageType != 0xf1)
+ MBUS_RX_DisplayMessage();
+#endif /* DEBUG */
+
+ GSM->DispatchMessage(MessageLength, MessageBuffer, MessageType);
+
+ } else {
+#ifdef DEBUG
+ if (strstr(GSM_Info->MBUSModels, "sniff") != NULL) {
+ fprintf(stdout, _("PC: "));
+
+ fprintf(stdout, "%02x:", MBUS_FRAME_ID);
+ fprintf(stdout, "%02x:", MBUS_DEVICE_PC1);
+ fprintf(stdout, "%02x:", FBUS_DEVICE_PHONE);
+ fprintf(stdout, "%02x:", MessageType);
+ fprintf(stdout, "%02x:", MessageLength/256);
+ fprintf(stdout, "%02x:", MessageLength%256);
+
+// NULL_TX_DisplayMessage(current, out_buffer);
+
+ for (i = 0; i < BufferCount; i++)
+ fprintf(stdout, "%02x:", MessageBuffer[i]);
+
+ fprintf(stdout, "\n");
+ }
+#endif /* DEBUG */
+ }
+ } else {
+#ifdef DEBUG
+ fprintf(stdout, _("Bad checksum %02x (should be %02x), msg len=%i !\n"),rx_byte,checksum[0],MessageLength);
+#endif /* DEBUG */
+ }
+ RX_State = FBUS_RX_Sync;
+ }
+ break;
+ }
+
+#ifdef DEBUG
+
+ } else {
+ if (isprint(rx_byte))
+ fprintf(stdout, "[%02x%c]", rx_byte, rx_byte);
+ else
+ fprintf(stdout, "[%02x ]", rx_byte);
+
+ }
+
+#endif
+}
+
+/* Called by initialisation code to open comm port in asynchronous mode. */
+bool MBUS_OpenSerial(void)
+{
+#ifdef DEBUG
+ fprintf(stdout, _("Setting MBUS communication...\n"));
+#endif /* DEBUG */
+
+ device_changespeed(9600);
+
+ usleep(100);
+
+ if (strstr(GSM_Info->MBUSModels, "sniff") == NULL) {
+
+ /* leave RTS high, DTR low for duration of session. */
+ device_setdtrrts(0, 1);
+
+ usleep(100);
+ }
+
+ return (true);
+
+}
+
+/* Initialise variables and state machine. */
+GSM_Error MBUS_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame))
+{
+ if (!StartConnection (port_device,true,connection))
+ return GE_INTERNALERROR;
+
+ CurrentConnectionType = connection;
+
+ if (MBUS_OpenSerial() != true) {
+ /* Fail so sit here till calling code works out there is a problem. */
+// while (!CurrentRequestTerminate)
+// usleep (100000);
+
+ return GE_INTERNALERROR;
+ }
+
+ return (GE_NONE);
+}
+
+bool MBUS_WritePhone (u16 length, u8 *buffer) {
+
+ if (!CurrentDisableKeepAlive)
+ usleep(150);
+
+ if (device_write(buffer,length)!=length)
+ return false;
+ else
+ return true;
+}
--- /dev/null
+#! /bin/sh
+# Guess values for system-dependent variables and create Makefiles.
+# Generated by Autoconf 2.52.
+#
+# Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+# Free Software Foundation, Inc.
+# This configure script is free software; the Free Software Foundation
+# gives unlimited permission to copy, distribute and modify it.
+
+# Avoid depending upon Character Ranges.
+as_cr_letters='abcdefghijklmnopqrstuvwxyz'
+as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'
+as_cr_Letters=$as_cr_letters$as_cr_LETTERS
+as_cr_digits='0123456789'
+as_cr_alnum=$as_cr_Letters$as_cr_digits
+
+# Sed expression to map a string onto a valid variable name.
+as_tr_sh="sed y%*+%pp%;s%[^_$as_cr_alnum]%_%g"
+
+# Sed expression to map a string onto a valid CPP name.
+as_tr_cpp="sed y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g"
+
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+# Name of the host.
+# hostname on some systems (SVR3.2, Linux) returns a bogus exit status,
+# so uname gets run too.
+ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`
+
+exec 6>&1
+
+#
+# Initializations.
+#
+ac_default_prefix=/usr/local
+cross_compiling=no
+subdirs=
+MFLAGS= MAKEFLAGS=
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+# Maximum number of lines to put in a shell here document.
+# This variable seems obsolete. It should probably be removed, and
+# only ac_max_sed_lines should be used.
+: ${ac_max_here_lines=38}
+
+ac_unique_file="gnokii/gnokii.c"
+ac_default_prefix="/usr/local"
+# Factoring default headers for most tests.
+ac_includes_default="\
+#include <stdio.h>
+#if HAVE_SYS_TYPES_H
+# include <sys/types.h>
+#endif
+#if HAVE_SYS_STAT_H
+# include <sys/stat.h>
+#endif
+#if STDC_HEADERS
+# include <stdlib.h>
+# include <stddef.h>
+#else
+# if HAVE_STDLIB_H
+# include <stdlib.h>
+# endif
+#endif
+#if HAVE_STRING_H
+# if !STDC_HEADERS && HAVE_MEMORY_H
+# include <memory.h>
+# endif
+# include <string.h>
+#endif
+#if HAVE_STRINGS_H
+# include <strings.h>
+#endif
+#if HAVE_INTTYPES_H
+# include <inttypes.h>
+#else
+# if HAVE_STDINT_H
+# include <stdint.h>
+# endif
+#endif
+#if HAVE_UNISTD_H
+# include <unistd.h>
+#endif"
+
+# Initialize some variables set by options.
+ac_init_help=
+ac_init_version=false
+# The variables have the same names as the options, with
+# dashes changed to underlines.
+cache_file=/dev/null
+exec_prefix=NONE
+no_create=
+no_recursion=
+prefix=NONE
+program_prefix=NONE
+program_suffix=NONE
+program_transform_name=s,x,x,
+silent=
+site=
+srcdir=
+verbose=
+x_includes=NONE
+x_libraries=NONE
+
+# Installation directory options.
+# These are left unexpanded so users can "make install exec_prefix=/foo"
+# and all the variables that are supposed to be based on exec_prefix
+# by default will actually change.
+# Use braces instead of parens because sh, perl, etc. also accept them.
+bindir='${exec_prefix}/bin'
+sbindir='${exec_prefix}/sbin'
+libexecdir='${exec_prefix}/lib'
+datadir='${prefix}/share'
+sysconfdir='${prefix}/etc'
+sharedstatedir='${prefix}/com'
+localstatedir='/var/lib'
+libdir='${exec_prefix}/lib'
+includedir='${prefix}/include'
+oldincludedir='/usr/include'
+infodir='${prefix}/share/info'
+mandir='${prefix}/man'
+
+# Identity of this package.
+PACKAGE_NAME=
+PACKAGE_TARNAME=
+PACKAGE_VERSION=
+PACKAGE_STRING=
+PACKAGE_BUGREPORT=
+
+ac_prev=
+for ac_option
+do
+ # If the previous option needs an argument, assign it.
+ if test -n "$ac_prev"; then
+ eval "$ac_prev=\$ac_option"
+ ac_prev=
+ continue
+ fi
+
+ ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'`
+
+ # Accept the important Cygnus configure options, so we can diagnose typos.
+
+ case $ac_option in
+
+ -bindir | --bindir | --bindi | --bind | --bin | --bi)
+ ac_prev=bindir ;;
+ -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)
+ bindir=$ac_optarg ;;
+
+ -build | --build | --buil | --bui | --bu)
+ ac_prev=build_alias ;;
+ -build=* | --build=* | --buil=* | --bui=* | --bu=*)
+ build_alias=$ac_optarg ;;
+
+ -cache-file | --cache-file | --cache-fil | --cache-fi \
+ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)
+ ac_prev=cache_file ;;
+ -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \
+ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)
+ cache_file=$ac_optarg ;;
+
+ --config-cache | -C)
+ cache_file=config.cache ;;
+
+ -datadir | --datadir | --datadi | --datad | --data | --dat | --da)
+ ac_prev=datadir ;;
+ -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \
+ | --da=*)
+ datadir=$ac_optarg ;;
+
+ -disable-* | --disable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ eval "enable_$ac_feature=no" ;;
+
+ -enable-* | --enable-*)
+ ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid feature name: $ac_feature" >&2
+ { (exit 1); exit 1; }; }
+ ac_feature=`echo $ac_feature | sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "enable_$ac_feature='$ac_optarg'" ;;
+
+ -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \
+ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \
+ | --exec | --exe | --ex)
+ ac_prev=exec_prefix ;;
+ -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \
+ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \
+ | --exec=* | --exe=* | --ex=*)
+ exec_prefix=$ac_optarg ;;
+
+ -gas | --gas | --ga | --g)
+ # Obsolete; use --with-gas.
+ with_gas=yes ;;
+
+ -help | --help | --hel | --he | -h)
+ ac_init_help=long ;;
+ -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)
+ ac_init_help=recursive ;;
+ -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)
+ ac_init_help=short ;;
+
+ -host | --host | --hos | --ho)
+ ac_prev=host_alias ;;
+ -host=* | --host=* | --hos=* | --ho=*)
+ host_alias=$ac_optarg ;;
+
+ -includedir | --includedir | --includedi | --included | --include \
+ | --includ | --inclu | --incl | --inc)
+ ac_prev=includedir ;;
+ -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \
+ | --includ=* | --inclu=* | --incl=* | --inc=*)
+ includedir=$ac_optarg ;;
+
+ -infodir | --infodir | --infodi | --infod | --info | --inf)
+ ac_prev=infodir ;;
+ -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)
+ infodir=$ac_optarg ;;
+
+ -libdir | --libdir | --libdi | --libd)
+ ac_prev=libdir ;;
+ -libdir=* | --libdir=* | --libdi=* | --libd=*)
+ libdir=$ac_optarg ;;
+
+ -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \
+ | --libexe | --libex | --libe)
+ ac_prev=libexecdir ;;
+ -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \
+ | --libexe=* | --libex=* | --libe=*)
+ libexecdir=$ac_optarg ;;
+
+ -localstatedir | --localstatedir | --localstatedi | --localstated \
+ | --localstate | --localstat | --localsta | --localst \
+ | --locals | --local | --loca | --loc | --lo)
+ ac_prev=localstatedir ;;
+ -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \
+ | --localstate=* | --localstat=* | --localsta=* | --localst=* \
+ | --locals=* | --local=* | --loca=* | --loc=* | --lo=*)
+ localstatedir=$ac_optarg ;;
+
+ -mandir | --mandir | --mandi | --mand | --man | --ma | --m)
+ ac_prev=mandir ;;
+ -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)
+ mandir=$ac_optarg ;;
+
+ -nfp | --nfp | --nf)
+ # Obsolete; use --without-fp.
+ with_fp=no ;;
+
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c)
+ no_create=yes ;;
+
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)
+ no_recursion=yes ;;
+
+ -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \
+ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \
+ | --oldin | --oldi | --old | --ol | --o)
+ ac_prev=oldincludedir ;;
+ -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \
+ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \
+ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)
+ oldincludedir=$ac_optarg ;;
+
+ -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)
+ ac_prev=prefix ;;
+ -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)
+ prefix=$ac_optarg ;;
+
+ -program-prefix | --program-prefix | --program-prefi | --program-pref \
+ | --program-pre | --program-pr | --program-p)
+ ac_prev=program_prefix ;;
+ -program-prefix=* | --program-prefix=* | --program-prefi=* \
+ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)
+ program_prefix=$ac_optarg ;;
+
+ -program-suffix | --program-suffix | --program-suffi | --program-suff \
+ | --program-suf | --program-su | --program-s)
+ ac_prev=program_suffix ;;
+ -program-suffix=* | --program-suffix=* | --program-suffi=* \
+ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)
+ program_suffix=$ac_optarg ;;
+
+ -program-transform-name | --program-transform-name \
+ | --program-transform-nam | --program-transform-na \
+ | --program-transform-n | --program-transform- \
+ | --program-transform | --program-transfor \
+ | --program-transfo | --program-transf \
+ | --program-trans | --program-tran \
+ | --progr-tra | --program-tr | --program-t)
+ ac_prev=program_transform_name ;;
+ -program-transform-name=* | --program-transform-name=* \
+ | --program-transform-nam=* | --program-transform-na=* \
+ | --program-transform-n=* | --program-transform-=* \
+ | --program-transform=* | --program-transfor=* \
+ | --program-transfo=* | --program-transf=* \
+ | --program-trans=* | --program-tran=* \
+ | --progr-tra=* | --program-tr=* | --program-t=*)
+ program_transform_name=$ac_optarg ;;
+
+ -q | -quiet | --quiet | --quie | --qui | --qu | --q \
+ | -silent | --silent | --silen | --sile | --sil)
+ silent=yes ;;
+
+ -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)
+ ac_prev=sbindir ;;
+ -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \
+ | --sbi=* | --sb=*)
+ sbindir=$ac_optarg ;;
+
+ -sharedstatedir | --sharedstatedir | --sharedstatedi \
+ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \
+ | --sharedst | --shareds | --shared | --share | --shar \
+ | --sha | --sh)
+ ac_prev=sharedstatedir ;;
+ -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \
+ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \
+ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \
+ | --sha=* | --sh=*)
+ sharedstatedir=$ac_optarg ;;
+
+ -site | --site | --sit)
+ ac_prev=site ;;
+ -site=* | --site=* | --sit=*)
+ site=$ac_optarg ;;
+
+ -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)
+ ac_prev=srcdir ;;
+ -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)
+ srcdir=$ac_optarg ;;
+
+ -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \
+ | --syscon | --sysco | --sysc | --sys | --sy)
+ ac_prev=sysconfdir ;;
+ -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \
+ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)
+ sysconfdir=$ac_optarg ;;
+
+ -target | --target | --targe | --targ | --tar | --ta | --t)
+ ac_prev=target_alias ;;
+ -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)
+ target_alias=$ac_optarg ;;
+
+ -v | -verbose | --verbose | --verbos | --verbo | --verb)
+ verbose=yes ;;
+
+ -version | --version | --versio | --versi | --vers | -V)
+ ac_init_version=: ;;
+
+ -with-* | --with-*)
+ ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package| sed 's/-/_/g'`
+ case $ac_option in
+ *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;;
+ *) ac_optarg=yes ;;
+ esac
+ eval "with_$ac_package='$ac_optarg'" ;;
+
+ -without-* | --without-*)
+ ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid package name: $ac_package" >&2
+ { (exit 1); exit 1; }; }
+ ac_package=`echo $ac_package | sed 's/-/_/g'`
+ eval "with_$ac_package=no" ;;
+
+ --x)
+ # Obsolete; use --with-x.
+ with_x=yes ;;
+
+ -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \
+ | --x-incl | --x-inc | --x-in | --x-i)
+ ac_prev=x_includes ;;
+ -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \
+ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)
+ x_includes=$ac_optarg ;;
+
+ -x-libraries | --x-libraries | --x-librarie | --x-librari \
+ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)
+ ac_prev=x_libraries ;;
+ -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \
+ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)
+ x_libraries=$ac_optarg ;;
+
+ -*) { echo "$as_me: error: unrecognized option: $ac_option
+Try \`$0 --help' for more information." >&2
+ { (exit 1); exit 1; }; }
+ ;;
+
+ *=*)
+ ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='`
+ # Reject names that are not valid shell variable names.
+ expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null &&
+ { echo "$as_me: error: invalid variable name: $ac_envvar" >&2
+ { (exit 1); exit 1; }; }
+ ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`
+ eval "$ac_envvar='$ac_optarg'"
+ export $ac_envvar ;;
+
+ *)
+ # FIXME: should be removed in autoconf 3.0.
+ echo "$as_me: WARNING: you should use --build, --host, --target" >&2
+ expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null &&
+ echo "$as_me: WARNING: invalid host type: $ac_option" >&2
+ : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}
+ ;;
+
+ esac
+done
+
+if test -n "$ac_prev"; then
+ ac_option=--`echo $ac_prev | sed 's/_/-/g'`
+ { echo "$as_me: error: missing argument to $ac_option" >&2
+ { (exit 1); exit 1; }; }
+fi
+
+# Be sure to have absolute paths.
+for ac_var in exec_prefix prefix
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* | NONE | '' ) ;;
+ *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# Be sure to have absolute paths.
+for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \
+ localstatedir libdir includedir oldincludedir infodir mandir
+do
+ eval ac_val=$`echo $ac_var`
+ case $ac_val in
+ [\\/$]* | ?:[\\/]* ) ;;
+ *) { echo "$as_me: error: expected an absolute path for --$ac_var: $ac_val" >&2
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# There might be people who depend on the old broken behavior: `$host'
+# used to hold the argument of --host etc.
+build=$build_alias
+host=$host_alias
+target=$target_alias
+
+# FIXME: should be removed in autoconf 3.0.
+if test "x$host_alias" != x; then
+ if test "x$build_alias" = x; then
+ cross_compiling=maybe
+ echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host.
+ If a cross compiler is detected then cross compile mode will be used." >&2
+ elif test "x$build_alias" != "x$host_alias"; then
+ cross_compiling=yes
+ fi
+fi
+
+ac_tool_prefix=
+test -n "$host_alias" && ac_tool_prefix=$host_alias-
+
+test "$silent" = yes && exec 6>/dev/null
+
+# Find the source files, if location was not specified.
+if test -z "$srcdir"; then
+ ac_srcdir_defaulted=yes
+ # Try the directory containing this script, then its parent.
+ ac_prog=$0
+ ac_confdir=`echo "$ac_prog" | sed 's%[\\/][^\\/][^\\/]*$%%'`
+ test "x$ac_confdir" = "x$ac_prog" && ac_confdir=.
+ srcdir=$ac_confdir
+ if test ! -r $srcdir/$ac_unique_file; then
+ srcdir=..
+ fi
+else
+ ac_srcdir_defaulted=no
+fi
+if test ! -r $srcdir/$ac_unique_file; then
+ if test "$ac_srcdir_defaulted" = yes; then
+ { echo "$as_me: error: cannot find sources in $ac_confdir or .." >&2
+ { (exit 1); exit 1; }; }
+ else
+ { echo "$as_me: error: cannot find sources in $srcdir" >&2
+ { (exit 1); exit 1; }; }
+ fi
+fi
+srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'`
+ac_env_build_alias_set=${build_alias+set}
+ac_env_build_alias_value=$build_alias
+ac_cv_env_build_alias_set=${build_alias+set}
+ac_cv_env_build_alias_value=$build_alias
+ac_env_host_alias_set=${host_alias+set}
+ac_env_host_alias_value=$host_alias
+ac_cv_env_host_alias_set=${host_alias+set}
+ac_cv_env_host_alias_value=$host_alias
+ac_env_target_alias_set=${target_alias+set}
+ac_env_target_alias_value=$target_alias
+ac_cv_env_target_alias_set=${target_alias+set}
+ac_cv_env_target_alias_value=$target_alias
+ac_env_CC_set=${CC+set}
+ac_env_CC_value=$CC
+ac_cv_env_CC_set=${CC+set}
+ac_cv_env_CC_value=$CC
+ac_env_CFLAGS_set=${CFLAGS+set}
+ac_env_CFLAGS_value=$CFLAGS
+ac_cv_env_CFLAGS_set=${CFLAGS+set}
+ac_cv_env_CFLAGS_value=$CFLAGS
+ac_env_LDFLAGS_set=${LDFLAGS+set}
+ac_env_LDFLAGS_value=$LDFLAGS
+ac_cv_env_LDFLAGS_set=${LDFLAGS+set}
+ac_cv_env_LDFLAGS_value=$LDFLAGS
+ac_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_env_CPPFLAGS_value=$CPPFLAGS
+ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set}
+ac_cv_env_CPPFLAGS_value=$CPPFLAGS
+ac_env_CPP_set=${CPP+set}
+ac_env_CPP_value=$CPP
+ac_cv_env_CPP_set=${CPP+set}
+ac_cv_env_CPP_value=$CPP
+
+#
+# Report the --help message.
+#
+if test "$ac_init_help" = "long"; then
+ # Omit some internal or obsolete options to make the list less imposing.
+ # This message is too long to be a string in the A/UX 3.1 sh.
+ cat <<EOF
+\`configure' configures this package to adapt to many kinds of systems.
+
+Usage: $0 [OPTION]... [VAR=VALUE]...
+
+To assign environment variables (e.g., CC, CFLAGS...), specify them as
+VAR=VALUE. See below for descriptions of some of the useful variables.
+
+Defaults for the options are specified in brackets.
+
+Configuration:
+ -h, --help display this help and exit
+ --help=short display options specific to this package
+ --help=recursive display the short help of all the included packages
+ -V, --version display version information and exit
+ -q, --quiet, --silent do not print \`checking...' messages
+ --cache-file=FILE cache test results in FILE [disabled]
+ -C, --config-cache alias for \`--cache-file=config.cache'
+ -n, --no-create do not create output files
+ --srcdir=DIR find the sources in DIR [configure dir or \`..']
+
+EOF
+
+ cat <<EOF
+Installation directories:
+ --prefix=PREFIX install architecture-independent files in PREFIX
+ [$ac_default_prefix]
+ --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX
+ [PREFIX]
+
+By default, \`make install' will install all the files in
+\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify
+an installation prefix other than \`$ac_default_prefix' using \`--prefix',
+for instance \`--prefix=\$HOME'.
+
+For better control, use the options below.
+
+Fine tuning of the installation directories:
+ --bindir=DIR user executables [EPREFIX/bin]
+ --sbindir=DIR system admin executables [EPREFIX/sbin]
+ --libexecdir=DIR program executables [EPREFIX/libexec]
+ --datadir=DIR read-only architecture-independent data [PREFIX/share]
+ --sysconfdir=DIR read-only single-machine data [PREFIX/etc]
+ --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com]
+ --localstatedir=DIR modifiable single-machine data [PREFIX/var]
+ --libdir=DIR object code libraries [EPREFIX/lib]
+ --includedir=DIR C header files [PREFIX/include]
+ --oldincludedir=DIR C header files for non-gcc [/usr/include]
+ --infodir=DIR info documentation [PREFIX/info]
+ --mandir=DIR man documentation [PREFIX/man]
+EOF
+
+ cat <<\EOF
+
+X features:
+ --x-includes=DIR X include files are in DIR
+ --x-libraries=DIR X library files are in DIR
+
+System types:
+ --build=BUILD configure for building on BUILD [guessed]
+ --host=HOST build programs to run on HOST [BUILD]
+ --target=TARGET configure for building compilers for TARGET [HOST]
+EOF
+fi
+
+if test -n "$ac_init_help"; then
+
+ cat <<\EOF
+
+Optional Features:
+ --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no)
+ --enable-FEATURE[=ARG] include FEATURE [ARG=yes]
+ --enable-debug compile with debug code
+ --enable-xdebug compile with xdebug code
+ --enable-rlpdebug compile with RLP debug code
+ --disable-nls do not use NLS
+ --enable-security enable all security features
+ --enable-win32 if you want win32 suport
+
+Optional Packages:
+ --with-PACKAGE[=ARG] use PACKAGE [ARG=yes]
+ --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no)
+ --with-libintl=DIR specifies the base NLS
+ --with-locale-dir=DIR Location of the locale file(s)
+ PREFIX/share/locale
+ --with-libpthread=DIR specifies the base libpthread
+ --with-getopt=DIR specifies the getopt library location directory
+ --with-x use the X Window System
+ --with-xgnokiidir=DIR specifies the base for xgnokii
+
+Some influential environment variables:
+ CC C compiler command
+ CFLAGS C compiler flags
+ LDFLAGS linker flags, e.g. -L<lib dir> if you have libraries in a
+ nonstandard directory <lib dir>
+ CPPFLAGS C/C++ preprocessor flags, e.g. -I<include dir> if you have
+ headers in a nonstandard directory <include dir>
+ CPP C preprocessor
+
+Use these variables to override the choices made by `configure' or to help
+it to find libraries and programs with nonstandard names/locations.
+
+EOF
+fi
+
+if test "$ac_init_help" = "recursive"; then
+ # If there are subdirs, report their specific --help.
+ ac_popdir=`pwd`
+ for ac_subdir in : $ac_subdirs_all; do test "x$ac_subdir" = x: && continue
+ cd $ac_subdir
+ # A "../" for each directory in /$ac_subdir.
+ ac_dots=`echo $ac_subdir |
+ sed 's,^\./,,;s,[^/]$,&/,;s,[^/]*/,../,g'`
+
+ case $srcdir in
+ .) # No --srcdir option. We are building in place.
+ ac_sub_srcdir=$srcdir ;;
+ [\\/]* | ?:[\\/]* ) # Absolute path.
+ ac_sub_srcdir=$srcdir/$ac_subdir ;;
+ *) # Relative path.
+ ac_sub_srcdir=$ac_dots$srcdir/$ac_subdir ;;
+ esac
+
+ # Check for guested configure; otherwise get Cygnus style configure.
+ if test -f $ac_sub_srcdir/configure.gnu; then
+ echo
+ $SHELL $ac_sub_srcdir/configure.gnu --help=recursive
+ elif test -f $ac_sub_srcdir/configure; then
+ echo
+ $SHELL $ac_sub_srcdir/configure --help=recursive
+ elif test -f $ac_sub_srcdir/configure.ac ||
+ test -f $ac_sub_srcdir/configure.in; then
+ echo
+ $ac_configure --help
+ else
+ echo "$as_me: WARNING: no configuration information is in $ac_subdir" >&2
+ fi
+ cd $ac_popdir
+ done
+fi
+
+test -n "$ac_init_help" && exit 0
+if $ac_init_version; then
+ cat <<\EOF
+configure
+generated by GNU Autoconf 2.52
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This configure script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it.
+EOF
+ exit 0
+fi
+exec 5>config.log
+cat >&5 <<EOF
+This file contains any messages produced by compilers while
+running configure, to aid debugging if configure makes a mistake.
+
+It was created by $as_me, which was
+generated by GNU Autoconf 2.52. Invocation command line was
+
+ $ $0 $@
+
+EOF
+{
+cat <<_ASUNAME
+## ---------- ##
+## Platform. ##
+## ---------- ##
+
+hostname = `(hostname || uname -n) 2>/dev/null | sed 1q`
+uname -m = `(uname -m) 2>/dev/null || echo unknown`
+uname -r = `(uname -r) 2>/dev/null || echo unknown`
+uname -s = `(uname -s) 2>/dev/null || echo unknown`
+uname -v = `(uname -v) 2>/dev/null || echo unknown`
+
+/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`
+/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown`
+
+/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown`
+/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown`
+/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`
+hostinfo = `(hostinfo) 2>/dev/null || echo unknown`
+/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown`
+/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown`
+/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown`
+
+PATH = $PATH
+
+_ASUNAME
+} >&5
+
+cat >&5 <<EOF
+## ------------ ##
+## Core tests. ##
+## ------------ ##
+
+EOF
+
+# Keep a trace of the command line.
+# Strip out --no-create and --no-recursion so they do not pile up.
+# Also quote any args containing shell meta-characters.
+ac_configure_args=
+ac_sep=
+for ac_arg
+do
+ case $ac_arg in
+ -no-create | --no-create | --no-creat | --no-crea | --no-cre \
+ | --no-cr | --no-c) ;;
+ -no-recursion | --no-recursion | --no-recursio | --no-recursi \
+ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;;
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"`
+ ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'"
+ ac_sep=" " ;;
+ *) ac_configure_args="$ac_configure_args$ac_sep$ac_arg"
+ ac_sep=" " ;;
+ esac
+ # Get rid of the leading space.
+done
+
+# When interrupted or exit'd, cleanup temporary files, and complete
+# config.log. We remove comments because anyway the quotes in there
+# would cause problems or look ugly.
+trap 'exit_status=$?
+ # Save into config.log some information that might help in debugging.
+ echo >&5
+ echo "## ----------------- ##" >&5
+ echo "## Cache variables. ##" >&5
+ echo "## ----------------- ##" >&5
+ echo >&5
+ # The following way of writing the cache mishandles newlines in values,
+{
+ (set) 2>&1 |
+ case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ sed -n \
+ "s/'"'"'/'"'"'\\\\'"'"''"'"'/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p"
+ ;;
+ *)
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} >&5
+ sed "/^$/d" confdefs.h >conftest.log
+ if test -s conftest.log; then
+ echo >&5
+ echo "## ------------ ##" >&5
+ echo "## confdefs.h. ##" >&5
+ echo "## ------------ ##" >&5
+ echo >&5
+ cat conftest.log >&5
+ fi
+ (echo; echo) >&5
+ test "$ac_signal" != 0 &&
+ echo "$as_me: caught signal $ac_signal" >&5
+ echo "$as_me: exit $exit_status" >&5
+ rm -rf conftest* confdefs* core core.* *.core conf$$* $ac_clean_files &&
+ exit $exit_status
+ ' 0
+for ac_signal in 1 2 13 15; do
+ trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal
+done
+ac_signal=0
+
+# confdefs.h avoids OS command line length limits that DEFS can exceed.
+rm -rf conftest* confdefs.h
+# AIX cpp loses on an empty file, so make sure it contains at least a newline.
+echo >confdefs.h
+
+# Let the site file select an alternate cache file if it wants to.
+# Prefer explicitly selected file to automatically selected ones.
+if test -z "$CONFIG_SITE"; then
+ if test "x$prefix" != xNONE; then
+ CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site"
+ else
+ CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site"
+ fi
+fi
+for ac_site_file in $CONFIG_SITE; do
+ if test -r "$ac_site_file"; then
+ { echo "$as_me:888: loading site script $ac_site_file" >&5
+echo "$as_me: loading site script $ac_site_file" >&6;}
+ cat "$ac_site_file" >&5
+ . "$ac_site_file"
+ fi
+done
+
+if test -r "$cache_file"; then
+ # Some versions of bash will fail to source /dev/null (special
+ # files actually), so we avoid doing that.
+ if test -f "$cache_file"; then
+ { echo "$as_me:899: loading cache $cache_file" >&5
+echo "$as_me: loading cache $cache_file" >&6;}
+ case $cache_file in
+ [\\/]* | ?:[\\/]* ) . $cache_file;;
+ *) . ./$cache_file;;
+ esac
+ fi
+else
+ { echo "$as_me:907: creating cache $cache_file" >&5
+echo "$as_me: creating cache $cache_file" >&6;}
+ >$cache_file
+fi
+
+# Check that the precious variables saved in the cache have kept the same
+# value.
+ac_cache_corrupted=false
+for ac_var in `(set) 2>&1 |
+ sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do
+ eval ac_old_set=\$ac_cv_env_${ac_var}_set
+ eval ac_new_set=\$ac_env_${ac_var}_set
+ eval ac_old_val="\$ac_cv_env_${ac_var}_value"
+ eval ac_new_val="\$ac_env_${ac_var}_value"
+ case $ac_old_set,$ac_new_set in
+ set,)
+ { echo "$as_me:923: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,set)
+ { echo "$as_me:927: error: \`$ac_var' was not set in the previous run" >&5
+echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;}
+ ac_cache_corrupted=: ;;
+ ,);;
+ *)
+ if test "x$ac_old_val" != "x$ac_new_val"; then
+ { echo "$as_me:933: error: \`$ac_var' has changed since the previous run:" >&5
+echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;}
+ { echo "$as_me:935: former value: $ac_old_val" >&5
+echo "$as_me: former value: $ac_old_val" >&2;}
+ { echo "$as_me:937: current value: $ac_new_val" >&5
+echo "$as_me: current value: $ac_new_val" >&2;}
+ ac_cache_corrupted=:
+ fi;;
+ esac
+ # Pass precious variables to config.status. It doesn't matter if
+ # we pass some twice (in addition to the command line arguments).
+ if test "$ac_new_set" = set; then
+ case $ac_new_val in
+ *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*)
+ ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"`
+ ac_configure_args="$ac_configure_args '$ac_arg'"
+ ;;
+ *) ac_configure_args="$ac_configure_args $ac_var=$ac_new_val"
+ ;;
+ esac
+ fi
+done
+if $ac_cache_corrupted; then
+ { echo "$as_me:956: error: changes in the environment can compromise the build" >&5
+echo "$as_me: error: changes in the environment can compromise the build" >&2;}
+ { { echo "$as_me:958: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5
+echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in
+ *c*,-n*) ECHO_N= ECHO_C='
+' ECHO_T=' ' ;;
+ *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;;
+ *) ECHO_N= ECHO_C='\c' ECHO_T= ;;
+esac
+echo "#! $SHELL" >conftest.sh
+echo "exit 0" >>conftest.sh
+chmod +x conftest.sh
+if { (echo "$as_me:978: PATH=\".;.\"; conftest.sh") >&5
+ (PATH=".;."; conftest.sh) 2>&5
+ ac_status=$?
+ echo "$as_me:981: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ ac_path_separator=';'
+else
+ ac_path_separator=:
+fi
+PATH_SEPARATOR="$ac_path_separator"
+rm -f conftest.sh
+
+ac_aux_dir=
+for ac_dir in config $srcdir/config; do
+ if test -f $ac_dir/install-sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install-sh -c"
+ break
+ elif test -f $ac_dir/install.sh; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/install.sh -c"
+ break
+ elif test -f $ac_dir/shtool; then
+ ac_aux_dir=$ac_dir
+ ac_install_sh="$ac_aux_dir/shtool install -c"
+ break
+ fi
+done
+if test -z "$ac_aux_dir"; then
+ { { echo "$as_me:1007: error: cannot find install-sh or install.sh in config $srcdir/config" >&5
+echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+ac_config_guess="$SHELL $ac_aux_dir/config.guess"
+ac_config_sub="$SHELL $ac_aux_dir/config.sub"
+ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure.
+
+# Make sure we can run config.sub.
+$ac_config_sub sun4 >/dev/null 2>&1 ||
+ { { echo "$as_me:1017: error: cannot run $ac_config_sub" >&5
+echo "$as_me: error: cannot run $ac_config_sub" >&2;}
+ { (exit 1); exit 1; }; }
+
+echo "$as_me:1021: checking build system type" >&5
+echo $ECHO_N "checking build system type... $ECHO_C" >&6
+if test "${ac_cv_build+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_build_alias=$build_alias
+test -z "$ac_cv_build_alias" &&
+ ac_cv_build_alias=`$ac_config_guess`
+test -z "$ac_cv_build_alias" &&
+ { { echo "$as_me:1030: error: cannot guess build type; you must specify one" >&5
+echo "$as_me: error: cannot guess build type; you must specify one" >&2;}
+ { (exit 1); exit 1; }; }
+ac_cv_build=`$ac_config_sub $ac_cv_build_alias` ||
+ { { echo "$as_me:1034: error: $ac_config_sub $ac_cv_build_alias failed." >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed." >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1039: result: $ac_cv_build" >&5
+echo "${ECHO_T}$ac_cv_build" >&6
+build=$ac_cv_build
+build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+echo "$as_me:1046: checking host system type" >&5
+echo $ECHO_N "checking host system type... $ECHO_C" >&6
+if test "${ac_cv_host+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_host_alias=$host_alias
+test -z "$ac_cv_host_alias" &&
+ ac_cv_host_alias=$ac_cv_build_alias
+ac_cv_host=`$ac_config_sub $ac_cv_host_alias` ||
+ { { echo "$as_me:1055: error: $ac_config_sub $ac_cv_host_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1060: result: $ac_cv_host" >&5
+echo "${ECHO_T}$ac_cv_host" >&6
+host=$ac_cv_host
+host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+echo "$as_me:1067: checking target system type" >&5
+echo $ECHO_N "checking target system type... $ECHO_C" >&6
+if test "${ac_cv_target+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_target_alias=$target_alias
+test "x$ac_cv_target_alias" = "x" &&
+ ac_cv_target_alias=$ac_cv_host_alias
+ac_cv_target=`$ac_config_sub $ac_cv_target_alias` ||
+ { { echo "$as_me:1076: error: $ac_config_sub $ac_cv_target_alias failed" >&5
+echo "$as_me: error: $ac_config_sub $ac_cv_target_alias failed" >&2;}
+ { (exit 1); exit 1; }; }
+
+fi
+echo "$as_me:1081: result: $ac_cv_target" >&5
+echo "${ECHO_T}$ac_cv_target" >&6
+target=$ac_cv_target
+target_cpu=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'`
+target_vendor=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'`
+target_os=`echo $ac_cv_target | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'`
+
+# The aliases save the names the user supplied, while $host etc.
+# will get canonicalized.
+test -n "$target_alias" &&
+ test "$program_prefix$program_suffix$program_transform_name" = \
+ NONENONEs,x,x, &&
+ program_prefix=${target_alias}-
+
+CFLAGS="-O2 -Wall"
+ALL_LINGUAS="cs de et fi nl sk pl it"
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}gcc; ac_word=$2
+echo "$as_me:1106: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}gcc"
+echo "$as_me:1121: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1129: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1132: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "gcc", so it can be a program name with args.
+set dummy gcc; ac_word=$2
+echo "$as_me:1141: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="gcc"
+echo "$as_me:1156: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:1164: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:1167: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args.
+set dummy ${ac_tool_prefix}cc; ac_word=$2
+echo "$as_me:1180: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="${ac_tool_prefix}cc"
+echo "$as_me:1195: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1203: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1206: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$ac_cv_prog_CC"; then
+ ac_ct_CC=$CC
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1215: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="cc"
+echo "$as_me:1230: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:1238: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:1241: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ CC=$ac_ct_CC
+else
+ CC="$ac_cv_prog_CC"
+fi
+
+fi
+if test -z "$CC"; then
+ # Extract the first word of "cc", so it can be a program name with args.
+set dummy cc; ac_word=$2
+echo "$as_me:1254: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_prog_rejected=no
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then
+ ac_prog_rejected=yes
+ continue
+fi
+ac_cv_prog_CC="cc"
+echo "$as_me:1274: found $ac_dir/$ac_word" >&5
+break
+done
+
+if test $ac_prog_rejected = yes; then
+ # We found a bogon in the path, so make sure we never use it.
+ set dummy $ac_cv_prog_CC
+ shift
+ if test $# != 0; then
+ # We chose a different compiler from the bogus one.
+ # However, it has the same basename, so the bogon will be chosen
+ # first if we set CC to just the basename; use the full file name.
+ shift
+ set dummy "$ac_dir/$ac_word" ${1+"$@"}
+ shift
+ ac_cv_prog_CC="$@"
+ fi
+fi
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1296: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1299: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+fi
+if test -z "$CC"; then
+ if test -n "$ac_tool_prefix"; then
+ for ac_prog in cl
+ do
+ # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args.
+set dummy $ac_tool_prefix$ac_prog; ac_word=$2
+echo "$as_me:1310: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$CC"; then
+ ac_cv_prog_CC="$CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_CC="$ac_tool_prefix$ac_prog"
+echo "$as_me:1325: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+CC=$ac_cv_prog_CC
+if test -n "$CC"; then
+ echo "$as_me:1333: result: $CC" >&5
+echo "${ECHO_T}$CC" >&6
+else
+ echo "$as_me:1336: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$CC" && break
+ done
+fi
+if test -z "$CC"; then
+ ac_ct_CC=$CC
+ for ac_prog in cl
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1349: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_ac_ct_CC+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$ac_ct_CC"; then
+ ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_ac_ct_CC="$ac_prog"
+echo "$as_me:1364: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+ac_ct_CC=$ac_cv_prog_ac_ct_CC
+if test -n "$ac_ct_CC"; then
+ echo "$as_me:1372: result: $ac_ct_CC" >&5
+echo "${ECHO_T}$ac_ct_CC" >&6
+else
+ echo "$as_me:1375: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$ac_ct_CC" && break
+done
+
+ CC=$ac_ct_CC
+fi
+
+fi
+
+test -z "$CC" && { { echo "$as_me:1387: error: no acceptable cc found in \$PATH" >&5
+echo "$as_me: error: no acceptable cc found in \$PATH" >&2;}
+ { (exit 1); exit 1; }; }
+
+# Provide some information about the compiler.
+echo "$as_me:1392:" \
+ "checking for C compiler version" >&5
+ac_compiler=`set X $ac_compile; echo $2`
+{ (eval echo "$as_me:1395: \"$ac_compiler --version </dev/null >&5\"") >&5
+ (eval $ac_compiler --version </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:1398: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:1400: \"$ac_compiler -v </dev/null >&5\"") >&5
+ (eval $ac_compiler -v </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:1403: \$? = $ac_status" >&5
+ (exit $ac_status); }
+{ (eval echo "$as_me:1405: \"$ac_compiler -V </dev/null >&5\"") >&5
+ (eval $ac_compiler -V </dev/null >&5) 2>&5
+ ac_status=$?
+ echo "$as_me:1408: \$? = $ac_status" >&5
+ (exit $ac_status); }
+
+cat >conftest.$ac_ext <<_ACEOF
+#line 1412 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files a.out a.exe"
+# Try to create an executable without -o first, disregard a.out.
+# It will help us diagnose broken compilers, and finding out an intuition
+# of exeext.
+echo "$as_me:1428: checking for C compiler default output" >&5
+echo $ECHO_N "checking for C compiler default output... $ECHO_C" >&6
+ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'`
+if { (eval echo "$as_me:1431: \"$ac_link_default\"") >&5
+ (eval $ac_link_default) 2>&5
+ ac_status=$?
+ echo "$as_me:1434: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # Find the output, starting from the most likely. This scheme is
+# not robust to junk in `.', hence go to wildcards (a.*) only as a last
+# resort.
+for ac_file in `ls a.exe conftest.exe 2>/dev/null;
+ ls a.out conftest 2>/dev/null;
+ ls a.* conftest.* 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+ a.out ) # We found the default executable, but exeext='' is most
+ # certainly right.
+ break;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ # FIXME: I believe we export ac_cv_exeext for Libtool --akim.
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:1457: error: C compiler cannot create executables" >&5
+echo "$as_me: error: C compiler cannot create executables" >&2;}
+ { (exit 77); exit 77; }; }
+fi
+
+ac_exeext=$ac_cv_exeext
+echo "$as_me:1463: result: $ac_file" >&5
+echo "${ECHO_T}$ac_file" >&6
+
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1468: checking whether the C compiler works" >&5
+echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6
+# FIXME: These cross compiler hacks should be removed for Autoconf 3.0
+# If not cross compiling, check that we can run a simple program.
+if test "$cross_compiling" != yes; then
+ if { ac_try='./$ac_file'
+ { (eval echo "$as_me:1474: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1477: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cross_compiling=no
+ else
+ if test "$cross_compiling" = maybe; then
+ cross_compiling=yes
+ else
+ { { echo "$as_me:1484: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&5
+echo "$as_me: error: cannot run C compiled programs.
+If you meant to cross compile, use \`--host'." >&2;}
+ { (exit 1); exit 1; }; }
+ fi
+ fi
+fi
+echo "$as_me:1492: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+
+rm -f a.out a.exe conftest$ac_cv_exeext
+ac_clean_files=$ac_clean_files_save
+# Check the compiler produces executables we can run. If not, either
+# the compiler is broken, or we cross compile.
+echo "$as_me:1499: checking whether we are cross compiling" >&5
+echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6
+echo "$as_me:1501: result: $cross_compiling" >&5
+echo "${ECHO_T}$cross_compiling" >&6
+
+echo "$as_me:1504: checking for executable suffix" >&5
+echo $ECHO_N "checking for executable suffix... $ECHO_C" >&6
+if { (eval echo "$as_me:1506: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:1509: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ # If both `conftest.exe' and `conftest' are `present' (well, observable)
+# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will
+# work properly (i.e., refer to `conftest.exe'), while it won't with
+# `rm'.
+for ac_file in `(ls conftest.exe; ls conftest; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.o | *.obj | *.xcoff | *.tds | *.d | *.pdb ) ;;
+ *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'`
+ export ac_cv_exeext
+ break;;
+ * ) break;;
+ esac
+done
+else
+ { { echo "$as_me:1525: error: cannot compute EXEEXT: cannot compile and link" >&5
+echo "$as_me: error: cannot compute EXEEXT: cannot compile and link" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest$ac_cv_exeext
+echo "$as_me:1531: result: $ac_cv_exeext" >&5
+echo "${ECHO_T}$ac_cv_exeext" >&6
+
+rm -f conftest.$ac_ext
+EXEEXT=$ac_cv_exeext
+ac_exeext=$EXEEXT
+echo "$as_me:1537: checking for object suffix" >&5
+echo $ECHO_N "checking for object suffix... $ECHO_C" >&6
+if test "${ac_cv_objext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1543 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.o conftest.obj
+if { (eval echo "$as_me:1555: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1558: \$? = $ac_status" >&5
+ (exit $ac_status); }; then
+ for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do
+ case $ac_file in
+ *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb ) ;;
+ *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'`
+ break;;
+ esac
+done
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ { echo "$as_me:1570: error: cannot compute OBJEXT: cannot compile" >&5
+echo "$as_me: error: cannot compute OBJEXT: cannot compile" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+rm -f conftest.$ac_cv_objext conftest.$ac_ext
+fi
+echo "$as_me:1577: result: $ac_cv_objext" >&5
+echo "${ECHO_T}$ac_cv_objext" >&6
+OBJEXT=$ac_cv_objext
+ac_objext=$OBJEXT
+echo "$as_me:1581: checking whether we are using the GNU C compiler" >&5
+echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6
+if test "${ac_cv_c_compiler_gnu+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1587 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+#ifndef __GNUC__
+ choke me
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1602: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1605: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:1608: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1611: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_compiler_gnu=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_compiler_gnu=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_cv_c_compiler_gnu=$ac_compiler_gnu
+
+fi
+echo "$as_me:1623: result: $ac_cv_c_compiler_gnu" >&5
+echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6
+GCC=`test $ac_compiler_gnu = yes && echo yes`
+ac_test_CFLAGS=${CFLAGS+set}
+ac_save_CFLAGS=$CFLAGS
+CFLAGS="-g"
+echo "$as_me:1629: checking whether $CC accepts -g" >&5
+echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_g+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1635 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1647: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1650: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:1653: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1656: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_g=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_prog_cc_g=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:1666: result: $ac_cv_prog_cc_g" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_g" >&6
+if test "$ac_test_CFLAGS" = set; then
+ CFLAGS=$ac_save_CFLAGS
+elif test $ac_cv_prog_cc_g = yes; then
+ if test "$GCC" = yes; then
+ CFLAGS="-g -O2"
+ else
+ CFLAGS="-g"
+ fi
+else
+ if test "$GCC" = yes; then
+ CFLAGS="-O2"
+ else
+ CFLAGS=
+ fi
+fi
+# Some people use a C++ compiler to compile C. Since we use `exit',
+# in C++ we need to declare it. In case someone uses the same compiler
+# for both compiling C and C++ we need to have the C++ compiler decide
+# the declaration of exit, since it's the most demanding environment.
+cat >conftest.$ac_ext <<_ACEOF
+#ifndef __cplusplus
+ choke me
+#endif
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1693: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1696: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:1699: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1702: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ for ac_declaration in \
+ ''\
+ '#include <stdlib.h>' \
+ 'extern "C" void std::exit (int) throw (); using std::exit;' \
+ 'extern "C" void std::exit (int); using std::exit;' \
+ 'extern "C" void exit (int) throw ();' \
+ 'extern "C" void exit (int);' \
+ 'void exit (int);'
+do
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1714 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1727: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1730: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:1733: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1736: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+continue
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1746 "configure"
+#include "confdefs.h"
+$ac_declaration
+int
+main ()
+{
+exit (42);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:1758: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:1761: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:1764: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:1767: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+rm -f conftest*
+if test -n "$ac_declaration"; then
+ echo '#ifdef __cplusplus' >>confdefs.h
+ echo $ac_declaration >>confdefs.h
+ echo '#endif' >>confdefs.h
+fi
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+echo "$as_me:1799: checking how to run the C preprocessor" >&5
+echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6
+# On Suns, sometimes $CPP names a directory.
+if test -n "$CPP" && test -d "$CPP"; then
+ CPP=
+fi
+if test -z "$CPP"; then
+ if test "${ac_cv_prog_CPP+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # Double quotes because CPP needs to be expanded
+ for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp"
+ do
+ ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1820 "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:1825: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:1831: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1854 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:1858: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:1864: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ break
+fi
+
+ done
+ ac_cv_prog_CPP=$CPP
+
+fi
+ CPP=$ac_cv_prog_CPP
+else
+ ac_cv_prog_CPP=$CPP
+fi
+echo "$as_me:1901: result: $CPP" >&5
+echo "${ECHO_T}$CPP" >&6
+ac_preproc_ok=false
+for ac_c_preproc_warn_flag in '' yes
+do
+ # Use a header file that comes with gcc, so configuring glibc
+ # with a fresh cross-compiler works.
+ # On the NeXT, cc -E runs the code through the compiler's parser,
+ # not just through cpp. "Syntax error" is here to catch this case.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1911 "configure"
+#include "confdefs.h"
+#include <assert.h>
+ Syntax error
+_ACEOF
+if { (eval echo "$as_me:1916: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:1922: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ :
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Broken: fails on valid input.
+continue
+fi
+rm -f conftest.err conftest.$ac_ext
+
+ # OK, works on sane cases. Now check whether non-existent headers
+ # can be detected and how.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 1945 "configure"
+#include "confdefs.h"
+#include <ac_nonexistent.h>
+_ACEOF
+if { (eval echo "$as_me:1949: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:1955: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # Broken: success on invalid input.
+continue
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ # Passes both tests.
+ac_preproc_ok=:
+break
+fi
+rm -f conftest.err conftest.$ac_ext
+
+done
+# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.
+rm -f conftest.err conftest.$ac_ext
+if $ac_preproc_ok; then
+ :
+else
+ { { echo "$as_me:1983: error: C preprocessor \"$CPP\" fails sanity check" >&5
+echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+for ac_prog in flex lex
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:1998: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_LEX+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$LEX"; then
+ ac_cv_prog_LEX="$LEX" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_LEX="$ac_prog"
+echo "$as_me:2013: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+LEX=$ac_cv_prog_LEX
+if test -n "$LEX"; then
+ echo "$as_me:2021: result: $LEX" >&5
+echo "${ECHO_T}$LEX" >&6
+else
+ echo "$as_me:2024: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$LEX" && break
+done
+test -n "$LEX" || LEX=":"
+
+if test -z "$LEXLIB"
+then
+ echo "$as_me:2034: checking for yywrap in -lfl" >&5
+echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6
+if test "${ac_cv_lib_fl_yywrap+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lfl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 2042 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char yywrap ();
+int
+main ()
+{
+yywrap ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2061: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2064: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2067: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2070: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_fl_yywrap=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_fl_yywrap=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:2081: result: $ac_cv_lib_fl_yywrap" >&5
+echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6
+if test $ac_cv_lib_fl_yywrap = yes; then
+ LEXLIB="-lfl"
+else
+ echo "$as_me:2086: checking for yywrap in -ll" >&5
+echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6
+if test "${ac_cv_lib_l_yywrap+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-ll $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 2094 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char yywrap ();
+int
+main ()
+{
+yywrap ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2113: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2116: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2119: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2122: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_l_yywrap=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_l_yywrap=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:2133: result: $ac_cv_lib_l_yywrap" >&5
+echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6
+if test $ac_cv_lib_l_yywrap = yes; then
+ LEXLIB="-ll"
+fi
+
+fi
+
+fi
+
+if test "x$LEX" != "x:"; then
+ echo "$as_me:2144: checking lex output file root" >&5
+echo $ECHO_N "checking lex output file root... $ECHO_C" >&6
+if test "${ac_cv_prog_lex_root+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # The minimal lex program is just a single line: %%. But some broken lexes
+# (Solaris, I think it was) want two %% lines, so accommodate them.
+echo '%%
+%%' | $LEX
+if test -f lex.yy.c; then
+ ac_cv_prog_lex_root=lex.yy
+elif test -f lexyy.c; then
+ ac_cv_prog_lex_root=lexyy
+else
+ { { echo "$as_me:2158: error: cannot find output from $LEX; giving up" >&5
+echo "$as_me: error: cannot find output from $LEX; giving up" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+fi
+echo "$as_me:2163: result: $ac_cv_prog_lex_root" >&5
+echo "${ECHO_T}$ac_cv_prog_lex_root" >&6
+LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root
+
+echo "$as_me:2167: checking whether yytext is a pointer" >&5
+echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6
+if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # POSIX says lex can declare yytext either as a pointer or an array; the
+# default is implementation-dependent. Figure out which it is, since
+# not all implementations provide the %pointer and %array declarations.
+ac_cv_prog_lex_yytext_pointer=no
+echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c
+ac_save_LIBS=$LIBS
+LIBS="$LIBS $LEXLIB"
+cat >conftest.$ac_ext <<_ACEOF
+`cat $LEX_OUTPUT_ROOT.c`
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2183: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2186: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2189: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2192: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_lex_yytext_pointer=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_save_LIBS
+rm -f "${LEX_OUTPUT_ROOT}.c"
+
+fi
+echo "$as_me:2204: result: $ac_cv_prog_lex_yytext_pointer" >&5
+echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6
+if test $ac_cv_prog_lex_yytext_pointer = yes; then
+
+cat >>confdefs.h <<\EOF
+#define YYTEXT_POINTER 1
+EOF
+
+fi
+
+fi
+# Extract the first word of "rm", so it can be a program name with args.
+set dummy rm; ac_word=$2
+echo "$as_me:2217: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_RM+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $RM in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_RM="$RM" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_RM="$ac_dir/$ac_word"
+ echo "$as_me:2234: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_RM" && ac_cv_path_RM="no"
+ ;;
+esac
+fi
+RM=$ac_cv_path_RM
+
+if test -n "$RM"; then
+ echo "$as_me:2246: result: $RM" >&5
+echo "${ECHO_T}$RM" >&6
+else
+ echo "$as_me:2249: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+# Extract the first word of "find", so it can be a program name with args.
+set dummy find; ac_word=$2
+echo "$as_me:2255: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_FIND+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $FIND in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_FIND="$FIND" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_FIND="$ac_dir/$ac_word"
+ echo "$as_me:2272: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_FIND" && ac_cv_path_FIND="no"
+ ;;
+esac
+fi
+FIND=$ac_cv_path_FIND
+
+if test -n "$FIND"; then
+ echo "$as_me:2284: result: $FIND" >&5
+echo "${ECHO_T}$FIND" >&6
+else
+ echo "$as_me:2287: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+for ac_prog in gmake make
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:2295: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_prog_MAKE+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test -n "$MAKE"; then
+ ac_cv_prog_MAKE="$MAKE" # Let the user override the test.
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ $as_executable_p "$ac_dir/$ac_word" || continue
+ac_cv_prog_MAKE="$ac_prog"
+echo "$as_me:2310: found $ac_dir/$ac_word" >&5
+break
+done
+
+fi
+fi
+MAKE=$ac_cv_prog_MAKE
+if test -n "$MAKE"; then
+ echo "$as_me:2318: result: $MAKE" >&5
+echo "${ECHO_T}$MAKE" >&6
+else
+ echo "$as_me:2321: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$MAKE" && break
+done
+
+# Find a good install program. We prefer a C program (faster),
+# so one script is as good as another. But avoid the broken or
+# incompatible versions:
+# SysV /etc/install, /usr/sbin/install
+# SunOS /usr/etc/install
+# IRIX /sbin/install
+# AIX /bin/install
+# AmigaOS /C/install, which installs bootblocks on floppy discs
+# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag
+# AFS /usr/afsws/bin/install, which mishandles nonexistent args
+# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
+# ./install, which can be erroneously created by make from ./install.sh.
+echo "$as_me:2340: checking for a BSD compatible install" >&5
+echo $ECHO_N "checking for a BSD compatible install... $ECHO_C" >&6
+if test -z "$INSTALL"; then
+if test "${ac_cv_path_install+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ for ac_dir in $PATH; do
+ IFS=$ac_save_IFS
+ # Account for people who put trailing slashes in PATH elements.
+ case $ac_dir/ in
+ / | ./ | .// | /cC/* \
+ | /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* \
+ | /usr/ucb/* ) ;;
+ *)
+ # OSF1 and SCO ODT 3.0 have their own names for install.
+ # Don't use installbsd from OSF since it installs stuff as root
+ # by default.
+ for ac_prog in ginstall scoinst install; do
+ if $as_executable_p "$ac_dir/$ac_prog"; then
+ if test $ac_prog = install &&
+ grep dspmsg "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+ # AIX install. It has an incompatible calling convention.
+ :
+ elif test $ac_prog = install &&
+ grep pwplus "$ac_dir/$ac_prog" >/dev/null 2>&1; then
+ # program-specific install script used by HP pwplus--don't use.
+ :
+ else
+ ac_cv_path_install="$ac_dir/$ac_prog -c"
+ break 2
+ fi
+ fi
+ done
+ ;;
+ esac
+ done
+
+fi
+ if test "${ac_cv_path_install+set}" = set; then
+ INSTALL=$ac_cv_path_install
+ else
+ # As a last resort, use the slow shell script. We don't cache a
+ # path for INSTALL within a source directory, because that will
+ # break other packages using the cache if that directory is
+ # removed, or if the path is relative.
+ INSTALL=$ac_install_sh
+ fi
+fi
+echo "$as_me:2389: result: $INSTALL" >&5
+echo "${ECHO_T}$INSTALL" >&6
+
+# Use test -z because SunOS4 sh mishandles braces in ${var-val}.
+# It thinks the first close brace ends the variable substitution.
+test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
+
+test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}'
+
+test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
+
+test x"$prefix" = xNONE && prefix="$ac_default_prefix"
+
+# Check whether --enable-debug or --disable-debug was given.
+if test "${enable_debug+set}" = set; then
+ enableval="$enable_debug"
+ CFLAGS="-g -Wall"
+ cat >>confdefs.h <<\EOF
+#define DEBUG 1
+EOF
+
+ debug="yes"
+else
+ debug="no"
+
+fi;
+
+# Check whether --enable-xdebug or --disable-xdebug was given.
+if test "${enable_xdebug+set}" = set; then
+ enableval="$enable_xdebug"
+ cat >>confdefs.h <<\EOF
+#define XDEBUG 1
+EOF
+
+ xdebug="yes"
+else
+ xdebug="no"
+
+fi;
+
+# Check whether --enable-rlpdebug or --disable-rlpdebug was given.
+if test "${enable_rlpdebug+set}" = set; then
+ enableval="$enable_rlpdebug"
+ cat >>confdefs.h <<\EOF
+#define RLP_DEBUG 1
+EOF
+
+ rlpdebug="yes"
+else
+ rlpdebug="no"
+
+fi;
+
+LIBS=""
+NLS_LIBS=""
+NLS_CFLAGS=""
+
+# Check whether --with-libintl or --without-libintl was given.
+if test "${with_libintl+set}" = set; then
+ withval="$with_libintl"
+ if test "x$withval" = "xyes"; then
+ { echo "$as_me:2450: WARNING: Usage is --with-libintl=DIR" >&5
+echo "$as_me: WARNING: Usage is --with-libintl=DIR" >&2;}
+ else
+ NLS_LIBS="-L$withval/lib"
+ NLS_CFLAGS="-I$withval/include"
+ fi
+
+fi;
+
+# Check whether --enable-nls or --disable-nls was given.
+if test "${enable_nls+set}" = set; then
+ enableval="$enable_nls"
+ USE_NLS=$enableval
+else
+ USE_NLS=yes
+
+fi;
+
+if test "$USE_NLS" = "yes"; then
+ echo "$as_me:2469: checking whether ${MAKE-make} sets \${MAKE}" >&5
+echo $ECHO_N "checking whether ${MAKE-make} sets \${MAKE}... $ECHO_C" >&6
+set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,./+-,__p_,'`
+if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.make <<\EOF
+all:
+ @echo 'ac_maketemp="${MAKE}"'
+EOF
+# GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=`
+if test -n "$ac_maketemp"; then
+ eval ac_cv_prog_make_${ac_make}_set=yes
+else
+ eval ac_cv_prog_make_${ac_make}_set=no
+fi
+rm -f conftest.make
+fi
+if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then
+ echo "$as_me:2489: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ SET_MAKE=
+else
+ echo "$as_me:2493: result: no" >&5
+echo "${ECHO_T}no" >&6
+ SET_MAKE="MAKE=${MAKE-make}"
+fi
+
+for ac_header in locale.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:2501: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 2507 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:2511: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:2517: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:2536: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+for ac_func in setlocale
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:2549: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 2555 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2586: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2589: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2592: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2595: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:2605: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ CPPFLAGS="$CPPFLAGS $NLS_CFLAGS"
+ cat >conftest.$ac_ext <<_ACEOF
+#line 2617 "configure"
+#include "confdefs.h"
+#include <libintl.h>
+_ACEOF
+if { (eval echo "$as_me:2621: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:2627: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_LIBINTL_H 1
+EOF
+
+ echo "$as_me:2642: result: checking for libintl.h... yes" >&5
+echo "${ECHO_T}checking for libintl.h... yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ { echo "$as_me:2647: WARNING: not found header file: libintl.h !!!" >&5
+echo "$as_me: WARNING: not found header file: libintl.h !!!" >&2;}
+ USE_NLS=no
+
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+
+if test "$USE_NLS" = "yes"; then
+ echo "$as_me:2656: checking for gettext" >&5
+echo $ECHO_N "checking for gettext... $ECHO_C" >&6
+if test "${ac_cv_func_gettext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 2662 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char gettext (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_gettext) || defined (__stub___gettext)
+choke me
+#else
+f = gettext;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2693: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2696: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2699: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2702: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_gettext=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_gettext=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:2712: result: $ac_cv_func_gettext" >&5
+echo "${ECHO_T}$ac_cv_func_gettext" >&6
+if test $ac_cv_func_gettext = yes; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_LIBINTL 1
+EOF
+
+else
+ echo "$as_me:2720: checking for gettext in -lintl" >&5
+echo $ECHO_N "checking for gettext in -lintl... $ECHO_C" >&6
+if test "${ac_cv_lib_intl_gettext+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl $NLS_LIBS
+ $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 2729 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char gettext ();
+int
+main ()
+{
+gettext ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2748: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2751: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2754: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2757: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_intl_gettext=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_intl_gettext=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:2768: result: $ac_cv_lib_intl_gettext" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_gettext" >&6
+if test $ac_cv_lib_intl_gettext = yes; then
+ NLS_LIBS="$NLS_LIBS -lintl"
+ cat >>confdefs.h <<\EOF
+#define HAVE_LIBINTL 1
+EOF
+
+else
+ { echo "$as_me:2777: WARNING: not found library: intl !!!" >&5
+echo "$as_me: WARNING: not found library: intl !!!" >&2;}
+ USE_NLS=no
+fi
+
+fi
+
+fi
+
+if test "$USE_NLS" = "yes"; then
+
+ LOCALEDIR='${prefix}/share/locale'
+
+# Check whether --with-locale-dir or --without-locale-dir was given.
+if test "${with_locale_dir+set}" = set; then
+ withval="$with_locale_dir"
+ if test x$withval = xyes; then
+ { echo "$as_me:2794: WARNING: Usage is: --with-locale-dir=basedir" >&5
+echo "$as_me: WARNING: Usage is: --with-locale-dir=basedir" >&2;}
+ else
+ if test x$withval = xno; then
+ { echo "$as_me:2798: WARNING: Usage is: --with-locale-dir=basedir" >&5
+echo "$as_me: WARNING: Usage is: --with-locale-dir=basedir" >&2;}
+ else
+ LOCALEDIR=$withval
+ fi
+ fi
+
+fi;
+
+ # Extract the first word of "msgfmt", so it can be a program name with args.
+set dummy msgfmt; ac_word=$2
+echo "$as_me:2809: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_MSGFMT="$ac_dir/$ac_word"
+ echo "$as_me:2826: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+MSGFMT=$ac_cv_path_MSGFMT
+
+if test -n "$MSGFMT"; then
+ echo "$as_me:2838: result: $MSGFMT" >&5
+echo "${ECHO_T}$MSGFMT" >&6
+else
+ echo "$as_me:2841: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test -n "$MSGFMT"; then
+
+for ac_func in dcgettext
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:2850: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 2856 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:2887: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:2890: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:2893: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:2896: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:2906: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+ # Extract the first word of "gmsgfmt", so it can be a program name with args.
+set dummy gmsgfmt; ac_word=$2
+echo "$as_me:2918: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GMSGFMT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $GMSGFMT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_GMSGFMT="$ac_dir/$ac_word"
+ echo "$as_me:2935: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT"
+ ;;
+esac
+fi
+GMSGFMT=$ac_cv_path_GMSGFMT
+
+if test -n "$GMSGFMT"; then
+ echo "$as_me:2947: result: $GMSGFMT" >&5
+echo "${ECHO_T}$GMSGFMT" >&6
+else
+ echo "$as_me:2950: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ # Extract the first word of "xgettext", so it can be a program name with args.
+set dummy xgettext; ac_word=$2
+echo "$as_me:2956: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_XGETTEXT+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $XGETTEXT in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_XGETTEXT="$ac_dir/$ac_word"
+ echo "$as_me:2973: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT="$XGETTEXT"
+ ;;
+esac
+fi
+XGETTEXT=$ac_cv_path_XGETTEXT
+
+if test -n "$XGETTEXT"; then
+ echo "$as_me:2985: result: $XGETTEXT" >&5
+echo "${ECHO_T}$XGETTEXT" >&6
+else
+ echo "$as_me:2988: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ # Extract the first word of "msgmerge", so it can be a program name with args.
+set dummy msgmerge; ac_word=$2
+echo "$as_me:2994: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_MSGMERGE+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $MSGMERGE in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_MSGMERGE="$ac_dir/$ac_word"
+ echo "$as_me:3011: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE="$MSGMERGE"
+ ;;
+esac
+fi
+MSGMERGE=$ac_cv_path_MSGMERGE
+
+if test -n "$MSGMERGE"; then
+ echo "$as_me:3023: result: $MSGMERGE" >&5
+echo "${ECHO_T}$MSGMERGE" >&6
+else
+ echo "$as_me:3026: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ if test -n "$XGETTEXT"; then
+ if $XGETTEXT --omit-header /dev/null 2> /dev/null; then
+ : ;
+ else
+ echo "$as_me:3034: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+ XGETTEXT=""
+ fi
+ fi
+
+ if test -n "$XGETTEXT"; then
+ if $XGETTEXT --help > /dev/null 2> /dev/null; then
+ : ;
+ else
+ echo "$as_me:3044: result: found xgettext program is not GNU xgettext; ignore it" >&5
+echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6
+ XGETTEXT=""
+ fi
+ fi
+
+ if test -n "$MSGFMT"; then
+ if $MSGFMT < /dev/null 2> /dev/null; then
+ echo "$as_me:3052: result: found msgfmt program is not GNU msgfmt; NLS will not be installed" >&5
+echo "${ECHO_T}found msgfmt program is not GNU msgfmt; NLS will not be installed" >&6
+ MSGFMT=""
+ fi
+ fi
+
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3059 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+ extern int _nl_msg_cat_cntr;
+ return _nl_msg_cat_cntr
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3072: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3075: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3078: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3081: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ CATOBJEXT=.gmo
+ DATADIRNAME=share
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ CATOBJEXT=.mo
+ DATADIRNAME=lib
+
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+ INSTOBJEXT=.mo
+ fi
+
+ if test -n "$ALL_LINGUAS"; then
+ for lang in $ALL_LINGUAS; do
+ CATALOGS="$CATALOGS $lang$CATOBJEXT"
+ done
+ fi
+
+fi
+
+if test x"$MSGFMT" = x; then
+ USE_NLS=no
+fi
+
+if test x"$USE_NLS" = xyes; then
+ cat >>confdefs.h <<\EOF
+#define USE_NLS 1
+EOF
+
+fi
+
+# Check whether --with-libpthread or --without-libpthread was given.
+if test "${with_libpthread+set}" = set; then
+ withval="$with_libpthread"
+ if test x$withval = xyes
+ then
+ { echo "$as_me:3120: WARNING: Usage is: --with-libpthread=DIR" >&5
+echo "$as_me: WARNING: Usage is: --with-libpthread=DIR" >&2;}
+ else
+ PTHREAD_LIBS="-L$withval/lib/"
+ PTHREAD_CFLAGS="-I$withval/include/"
+ fi
+
+fi;
+
+PTHREAD_LIBS_SAVE="$PTHREAD_LIBS"
+PTHREAD_LIBS=error
+echo "$as_me:3131: checking for pthread_attr_init in -lpthread" >&5
+echo $ECHO_N "checking for pthread_attr_init in -lpthread... $ECHO_C" >&6
+if test "${ac_cv_lib_pthread_pthread_attr_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpthread $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 3139 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pthread_attr_init ();
+int
+main ()
+{
+pthread_attr_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3158: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3161: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3164: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3167: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_pthread_pthread_attr_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_pthread_pthread_attr_init=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:3178: result: $ac_cv_lib_pthread_pthread_attr_init" >&5
+echo "${ECHO_T}$ac_cv_lib_pthread_pthread_attr_init" >&6
+if test $ac_cv_lib_pthread_pthread_attr_init = yes; then
+
+ PTHREAD_CFLAGS="$PTHREAD_CFLAGS -D_REENTRANT"
+ PTHREAD_LIBS="$PTHREAD_LIBS_SAVE -lpthread"
+fi
+
+if test "x$PTHREAD_LIBS" = xerror; then
+ echo "$as_me:3187: checking for pthread_attr_init in -lc_r" >&5
+echo $ECHO_N "checking for pthread_attr_init in -lc_r... $ECHO_C" >&6
+if test "${ac_cv_lib_c_r_pthread_attr_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lc_r $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 3195 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pthread_attr_init ();
+int
+main ()
+{
+pthread_attr_init ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3214: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3217: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3220: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3223: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_c_r_pthread_attr_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_c_r_pthread_attr_init=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:3234: result: $ac_cv_lib_c_r_pthread_attr_init" >&5
+echo "${ECHO_T}$ac_cv_lib_c_r_pthread_attr_init" >&6
+if test $ac_cv_lib_c_r_pthread_attr_init = yes; then
+
+ PTHREAD_CFLAGS="$PTHREAD_CFLAGS -D_THREAD_SAFE"
+ PTHREAD_LIBS="-pthread"
+fi
+
+fi
+
+if test "x$PTHREAD_LIBS" = xerror; then
+ echo "$as_me:3245: checking for pthread_attr_init" >&5
+echo $ECHO_N "checking for pthread_attr_init... $ECHO_C" >&6
+if test "${ac_cv_func_pthread_attr_init+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3251 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char pthread_attr_init (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char pthread_attr_init ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_pthread_attr_init) || defined (__stub___pthread_attr_init)
+choke me
+#else
+f = pthread_attr_init;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3282: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3285: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3288: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3291: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_pthread_attr_init=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_pthread_attr_init=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:3301: result: $ac_cv_func_pthread_attr_init" >&5
+echo "${ECHO_T}$ac_cv_func_pthread_attr_init" >&6
+if test $ac_cv_func_pthread_attr_init = yes; then
+ PTHREAD_LIBS=""
+else
+ { { echo "$as_me:3306: error: not found library: pthread !!!" >&5
+echo "$as_me: error: not found library: pthread !!!" >&2;}
+ { (exit 1); exit 1; }; }
+fi
+
+fi
+
+echo "$as_me:3313: checking for tm_gmtoff in struct tm" >&5
+echo $ECHO_N "checking for tm_gmtoff in struct tm... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line 3316 "configure"
+#include "confdefs.h"
+#include <time.h>
+int
+main ()
+{
+struct tm t; t.tm_gmtoff = 0
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3328: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3331: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3334: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3337: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ echo "$as_me:3339: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+ cat >>confdefs.h <<\EOF
+#define HAVE_TM_GMTON 1
+EOF
+
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+echo "$as_me:3348: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+echo "$as_me:3353: checking for timersub" >&5
+echo $ECHO_N "checking for timersub... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line 3356 "configure"
+#include "confdefs.h"
+#include <sys/time.h>
+int
+main ()
+{
+timersub(NULL, NULL, NULL)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3368: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3371: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3374: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3377: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_TIMEOPS 1
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define HAVE_TIMEOPS 1
+EOF
+
+ echo "$as_me:3387: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+echo "$as_me:3392: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+have_termios="no"
+echo "$as_me:3398: checking for cfsetspeed in termios.h" >&5
+echo $ECHO_N "checking for cfsetspeed in termios.h... $ECHO_C" >&6
+cat >conftest.$ac_ext <<_ACEOF
+#line 3401 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int
+main ()
+{
+struct termios t; cfsetspeed(&t, B9600);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3413: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3416: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3419: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3422: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_CFSETSPEED 1
+EOF
+
+ have_termios="yes"
+ echo "$as_me:3429: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+echo "$as_me:3434: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+if test $have_termios = "no"; then
+ echo "$as_me:3440: checking for cfsetispeed and cfsetospeed in termios.h" >&5
+echo $ECHO_N "checking for cfsetispeed and cfsetospeed in termios.h... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3443 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int
+main ()
+{
+struct termios t; cfsetispeed(&t, B9600); cfsetospeed(&t, B9600);
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3455: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3458: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3461: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3464: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_CFSETISPEED 1
+EOF
+
+ cat >>confdefs.h <<\EOF
+#define HAVE_CFSETOSPEED 1
+EOF
+
+ have_termios="yes"
+ echo "$as_me:3475: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+echo "$as_me:3480: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+
+ if test $have_termios = "no"; then
+ echo "$as_me:3486: checking for c_ispeed and c_ospeed in struct termios" >&5
+echo $ECHO_N "checking for c_ispeed and c_ospeed in struct termios... $ECHO_C" >&6
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3489 "configure"
+#include "confdefs.h"
+#include <termios.h>
+int
+main ()
+{
+struct termios t; t.c_iflag = B9600; t.c_oflag = B9600;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3501: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3504: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3507: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3510: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_TERMIOS_CSPEED 1
+EOF
+
+ echo "$as_me:3516: result: yes" >&5
+echo "${ECHO_T}yes" >&6
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+echo "$as_me:3521: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+ fi
+fi
+
+echo "$as_me:3528: checking for getopt.h" >&5
+echo $ECHO_N "checking for getopt.h... $ECHO_C" >&6
+if test "${ac_cv_header_getopt_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3534 "configure"
+#include "confdefs.h"
+#include <getopt.h>
+_ACEOF
+if { (eval echo "$as_me:3538: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:3544: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_getopt_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_header_getopt_h=no
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:3563: result: $ac_cv_header_getopt_h" >&5
+echo "${ECHO_T}$ac_cv_header_getopt_h" >&6
+if test $ac_cv_header_getopt_h = yes; then
+ :
+else
+ CFLAGS="$CFLAGS -I../getopt"
+fi
+
+# Check whether --with-gnugetopt or --without-gnugetopt was given.
+if test "${with_gnugetopt+set}" = set; then
+ withval="$with_gnugetopt"
+ if test x$withval=yes; then
+ { echo "$as_me:3575: WARNING: Usage is: --with-getopt=DIR" >&5
+echo "$as_me: WARNING: Usage is: --with-getopt=DIR" >&2;}
+ else
+ GETOPT_LIBS="-L$withval"
+ fi
+
+fi;
+
+OWN_GETOPT=""
+echo "$as_me:3584: checking for getopt_long" >&5
+echo $ECHO_N "checking for getopt_long... $ECHO_C" >&6
+if test "${ac_cv_func_getopt_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3590 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char getopt_long (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char getopt_long ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_getopt_long) || defined (__stub___getopt_long)
+choke me
+#else
+f = getopt_long;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3621: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3624: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3627: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3630: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_getopt_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_getopt_long=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:3640: result: $ac_cv_func_getopt_long" >&5
+echo "${ECHO_T}$ac_cv_func_getopt_long" >&6
+if test $ac_cv_func_getopt_long = yes; then
+ :
+else
+
+ LIBS="$LIBS $GETOPT_LIBS"
+ echo "$as_me:3647: checking for getopt_long in -lgnugetopt" >&5
+echo $ECHO_N "checking for getopt_long in -lgnugetopt... $ECHO_C" >&6
+if test "${ac_cv_lib_gnugetopt_getopt_long+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lgnugetopt $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 3655 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char getopt_long ();
+int
+main ()
+{
+getopt_long ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3674: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3677: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3680: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3683: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_gnugetopt_getopt_long=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_gnugetopt_getopt_long=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:3694: result: $ac_cv_lib_gnugetopt_getopt_long" >&5
+echo "${ECHO_T}$ac_cv_lib_gnugetopt_getopt_long" >&6
+if test $ac_cv_lib_gnugetopt_getopt_long = yes; then
+ LIBS="$LIBS -lgnugetopt"
+else
+ OWN_GETOPT="1"
+fi
+
+fi
+
+if test "$no_x" = yes -o "$with_x" = "no"; then
+ x_support="no"
+ XPM_CFLAGS=""
+ XPM_LIBS=""
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+else
+ echo "$as_me:3711: checking for X" >&5
+echo $ECHO_N "checking for X... $ECHO_C" >&6
+
+# Check whether --with-x or --without-x was given.
+if test "${with_x+set}" = set; then
+ withval="$with_x"
+
+fi;
+# $have_x is `yes', `no', `disabled', or empty when we do not yet know.
+if test "x$with_x" = xno; then
+ # The user explicitly disabled X.
+ have_x=disabled
+else
+ if test "x$x_includes" != xNONE && test "x$x_libraries" != xNONE; then
+ # Both variables are already set.
+ have_x=yes
+ else
+ if test "${ac_cv_have_x+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ # One or both of the vars are not set, and there is no cached value.
+ac_x_includes=no ac_x_libraries=no
+rm -fr conftest.dir
+if mkdir conftest.dir; then
+ cd conftest.dir
+ # Make sure to not put "make" in the Imakefile rules, since we grep it out.
+ cat >Imakefile <<'EOF'
+acfindx:
+ @echo 'ac_im_incroot="${INCROOT}"; ac_im_usrlibdir="${USRLIBDIR}"; ac_im_libdir="${LIBDIR}"'
+EOF
+ if (xmkmf) >/dev/null 2>/dev/null && test -f Makefile; then
+ # GNU make sometimes prints "make[1]: Entering...", which would confuse us.
+ eval `${MAKE-make} acfindx 2>/dev/null | grep -v make`
+ # Open Windows xmkmf reportedly sets LIBDIR instead of USRLIBDIR.
+ for ac_extension in a so sl; do
+ if test ! -f $ac_im_usrlibdir/libX11.$ac_extension &&
+ test -f $ac_im_libdir/libX11.$ac_extension; then
+ ac_im_usrlibdir=$ac_im_libdir; break
+ fi
+ done
+ # Screen out bogus values from the imake configuration. They are
+ # bogus both because they are the default anyway, and because
+ # using them would break gcc on systems where it needs fixed includes.
+ case $ac_im_incroot in
+ /usr/include) ;;
+ *) test -f "$ac_im_incroot/X11/Xos.h" && ac_x_includes=$ac_im_incroot;;
+ esac
+ case $ac_im_usrlibdir in
+ /usr/lib | /lib) ;;
+ *) test -d "$ac_im_usrlibdir" && ac_x_libraries=$ac_im_usrlibdir ;;
+ esac
+ fi
+ cd ..
+ rm -fr conftest.dir
+fi
+
+# Standard set of common directories for X headers.
+# Check X11 before X11Rn because it is often a symlink to the current release.
+ac_x_header_dirs='
+/usr/X11/include
+/usr/X11R6/include
+/usr/X11R5/include
+/usr/X11R4/include
+
+/usr/include/X11
+/usr/include/X11R6
+/usr/include/X11R5
+/usr/include/X11R4
+
+/usr/local/X11/include
+/usr/local/X11R6/include
+/usr/local/X11R5/include
+/usr/local/X11R4/include
+
+/usr/local/include/X11
+/usr/local/include/X11R6
+/usr/local/include/X11R5
+/usr/local/include/X11R4
+
+/usr/X386/include
+/usr/x386/include
+/usr/XFree86/include/X11
+
+/usr/include
+/usr/local/include
+/usr/unsupported/include
+/usr/athena/include
+/usr/local/x11r5/include
+/usr/lpp/Xamples/include
+
+/usr/openwin/include
+/usr/openwin/share/include'
+
+if test "$ac_x_includes" = no; then
+ # Guess where to find include files, by looking for Intrinsic.h.
+ # First, try using that file with no special directory specified.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3808 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+_ACEOF
+if { (eval echo "$as_me:3812: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:3818: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ # We can compile using X headers with no special include directory.
+ac_x_includes=
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ for ac_dir in $ac_x_header_dirs; do
+ if test -r "$ac_dir/X11/Intrinsic.h"; then
+ ac_x_includes=$ac_dir
+ break
+ fi
+done
+fi
+rm -f conftest.err conftest.$ac_ext
+fi # $ac_x_includes = no
+
+if test "$ac_x_libraries" = no; then
+ # Check for the libraries.
+ # See if we find them without any special options.
+ # Don't add to $LIBS permanently.
+ ac_save_LIBS=$LIBS
+ LIBS="-lXt $LIBS"
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3851 "configure"
+#include "confdefs.h"
+#include <X11/Intrinsic.h>
+int
+main ()
+{
+XtMalloc (0)
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:3863: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:3866: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:3869: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:3872: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ LIBS=$ac_save_LIBS
+# We can link X programs with no special library path.
+ac_x_libraries=
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+LIBS=$ac_save_LIBS
+for ac_dir in `echo "$ac_x_includes $ac_x_header_dirs" | sed s/include/lib/g`
+do
+ # Don't even attempt the hair of trying to link an X program!
+ for ac_extension in a so sl; do
+ if test -r $ac_dir/libXt.$ac_extension; then
+ ac_x_libraries=$ac_dir
+ break 2
+ fi
+ done
+done
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi # $ac_x_libraries = no
+
+if test "$ac_x_includes" = no || test "$ac_x_libraries" = no; then
+ # Didn't find X anywhere. Cache the known absence of X.
+ ac_cv_have_x="have_x=no"
+else
+ # Record where we found X for the cache.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$ac_x_includes ac_x_libraries=$ac_x_libraries"
+fi
+fi
+
+ fi
+ eval "$ac_cv_have_x"
+fi # $with_x != no
+
+if test "$have_x" != yes; then
+ echo "$as_me:3910: result: $have_x" >&5
+echo "${ECHO_T}$have_x" >&6
+ no_x=yes
+else
+ # If each of the values was on the command line, it overrides each guess.
+ test "x$x_includes" = xNONE && x_includes=$ac_x_includes
+ test "x$x_libraries" = xNONE && x_libraries=$ac_x_libraries
+ # Update the cache value to reflect the command line values.
+ ac_cv_have_x="have_x=yes \
+ ac_x_includes=$x_includes ac_x_libraries=$x_libraries"
+ echo "$as_me:3920: result: libraries $x_libraries, headers $x_includes" >&5
+echo "${ECHO_T}libraries $x_libraries, headers $x_includes" >&6
+fi
+
+ CPPFLAGS="$CPPFLAGS -I$x_includes"
+
+for ac_header in X11/xpm.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:3929: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 3935 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:3939: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:3945: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:3964: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+ XPMINC="yes"
+else
+ XPMINC="no"
+fi
+done
+
+ if test "x$XPMINC" = "xno"; then
+ x_support="no"
+ XPM_CFLAGS=""
+ XPM_LIBS=""
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ { echo "$as_me:3982: WARNING: Cannot find include X11/xpm.h" >&5
+echo "$as_me: WARNING: Cannot find include X11/xpm.h" >&2;}
+ { echo "$as_me:3984: WARNING: Disabling xgnokii." >&5
+echo "$as_me: WARNING: Disabling xgnokii." >&2;}
+ elif test "x$x_libraries" = "xNONE"; then
+ x_support="no"
+ XPM_CFLAGS=""
+ XPM_LIBS=""
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ { echo "$as_me:3992: WARNING: Cannot find library libX11." >&5
+echo "$as_me: WARNING: Cannot find library libX11." >&2;}
+ { echo "$as_me:3994: WARNING: Disabling xgnokii." >&5
+echo "$as_me: WARNING: Disabling xgnokii." >&2;}
+ else
+ echo "$as_me:3997: checking for XpmWriteFileFromXpmImage in -lXpm" >&5
+echo $ECHO_N "checking for XpmWriteFileFromXpmImage in -lXpm... $ECHO_C" >&6
+if test "${ac_cv_lib_Xpm_XpmWriteFileFromXpmImage+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lXpm -L$x_libraries -lX11
+ $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 4006 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char XpmWriteFileFromXpmImage ();
+int
+main ()
+{
+XpmWriteFileFromXpmImage ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:4025: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4028: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:4031: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4034: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_Xpm_XpmWriteFileFromXpmImage=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_Xpm_XpmWriteFileFromXpmImage=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4045: result: $ac_cv_lib_Xpm_XpmWriteFileFromXpmImage" >&5
+echo "${ECHO_T}$ac_cv_lib_Xpm_XpmWriteFileFromXpmImage" >&6
+if test $ac_cv_lib_Xpm_XpmWriteFileFromXpmImage = yes; then
+ XPM_CFLAGS="-I$x_includes" XPM_LIBS="-L$x_libraries -lX11 -lXpm"
+ cat >>confdefs.h <<\EOF
+#define XPM 1
+EOF
+
+else
+ { echo "$as_me:4054: WARNING: Cannot found library libXpm - disabling XPM support." >&5
+echo "$as_me: WARNING: Cannot found library libXpm - disabling XPM support." >&2;}
+fi
+
+ for ac_prog in gtk-config gtk12-config
+do
+ # Extract the first word of "$ac_prog", so it can be a program name with args.
+set dummy $ac_prog; ac_word=$2
+echo "$as_me:4062: checking for $ac_word" >&5
+echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6
+if test "${ac_cv_path_GTK_CONFIG+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ case $GTK_CONFIG in
+ [\\/]* | ?:[\\/]*)
+ ac_cv_path_GTK_CONFIG="$GTK_CONFIG" # Let the user override the test with a path.
+ ;;
+ *)
+ ac_save_IFS=$IFS; IFS=$ac_path_separator
+ac_dummy="$PATH"
+for ac_dir in $ac_dummy; do
+ IFS=$ac_save_IFS
+ test -z "$ac_dir" && ac_dir=.
+ if $as_executable_p "$ac_dir/$ac_word"; then
+ ac_cv_path_GTK_CONFIG="$ac_dir/$ac_word"
+ echo "$as_me:4079: found $ac_dir/$ac_word" >&5
+ break
+fi
+done
+
+ ;;
+esac
+fi
+GTK_CONFIG=$ac_cv_path_GTK_CONFIG
+
+if test -n "$GTK_CONFIG"; then
+ echo "$as_me:4090: result: $GTK_CONFIG" >&5
+echo "${ECHO_T}$GTK_CONFIG" >&6
+else
+ echo "$as_me:4093: result: no" >&5
+echo "${ECHO_T}no" >&6
+fi
+
+ test -n "$GTK_CONFIG" && break
+done
+test -n "$GTK_CONFIG" || GTK_CONFIG="no"
+
+ if test "$GTK_CONFIG" = no; then
+ x_support="no"
+ GTK_CFLAGS=""
+ GTK_LIBS=""
+ { echo "$as_me:4105: WARNING: Cannot find gtk-config." >&5
+echo "$as_me: WARNING: Cannot find gtk-config." >&2;}
+ { echo "$as_me:4107: WARNING: Disabling xgnokii." >&5
+echo "$as_me: WARNING: Disabling xgnokii." >&2;}
+ else
+ GTK_CFLAGS=`$GTK_CONFIG --cflags`
+ GTK_LIBS=`$GTK_CONFIG --libs`
+ x_support="yes"
+
+ XGNOKIIDIR='${prefix}/share'
+ XGNOKIIPATH=${prefix}/share
+
+# Check whether --with-xgnokiidir or --without-xgnokiidir was given.
+if test "${with_xgnokiidir+set}" = set; then
+ withval="$with_xgnokiidir"
+ if test x$withval = xyes; then
+ { echo "$as_me:4121: WARNING: Usage is: --with-xgnokiilib=DIR" >&5
+echo "$as_me: WARNING: Usage is: --with-xgnokiilib=DIR" >&2;}
+ else
+ XGNOKIIDIR="$withval"
+ XGNOKIIPATH="$withval"
+ fi
+
+fi;
+ fi
+ fi
+fi
+
+echo "$as_me:4133: checking for socket in -lsocket" >&5
+echo $ECHO_N "checking for socket in -lsocket... $ECHO_C" >&6
+if test "${ac_cv_lib_socket_socket+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lsocket $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 4141 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char socket ();
+int
+main ()
+{
+socket ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:4160: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4163: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:4166: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4169: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_socket_socket=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_socket_socket=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:4180: result: $ac_cv_lib_socket_socket" >&5
+echo "${ECHO_T}$ac_cv_lib_socket_socket" >&6
+if test $ac_cv_lib_socket_socket = yes; then
+ cat >>confdefs.h <<EOF
+#define HAVE_LIBSOCKET 1
+EOF
+
+ LIBS="-lsocket $LIBS"
+
+fi
+
+# Check whether --enable-security or --disable-security was given.
+if test "${enable_security+set}" = set; then
+ enableval="$enable_security"
+ cat >>confdefs.h <<\EOF
+#define SECURITY 1
+EOF
+
+ security="yes"
+else
+ security="no"
+
+fi;
+
+# Check whether --enable-win32 or --disable-win32 was given.
+if test "${enable_win32+set}" = set; then
+ enableval="$enable_win32"
+ cat >>confdefs.h <<\EOF
+#define WIN32 1
+EOF
+
+ win32="-DWIN32"
+else
+ win32=""
+
+fi;
+
+echo "$as_me:4217: checking for grantpt" >&5
+echo $ECHO_N "checking for grantpt... $ECHO_C" >&6
+if test "${ac_cv_func_grantpt+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4223 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char grantpt (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char grantpt ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_grantpt) || defined (__stub___grantpt)
+choke me
+#else
+f = grantpt;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:4254: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4257: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:4260: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4263: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_grantpt=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_grantpt=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:4273: result: $ac_cv_func_grantpt" >&5
+echo "${ECHO_T}$ac_cv_func_grantpt" >&6
+if test $ac_cv_func_grantpt = yes; then
+ if test "$cross_compiling" = yes; then
+ { echo "$as_me:4277: WARNING: \"Ensure to disable unix98ptys when crosscompiling\"" >&5
+echo "$as_me: WARNING: \"Ensure to disable unix98ptys when crosscompiling\"" >&2;}
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4281 "configure"
+#include "confdefs.h"
+
+#define _XOPEN_SOURCE 500
+
+#include <features.h>
+#include <stdlib.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+int main()
+{
+ char *name = NULL;
+ int master, err;
+
+ master = open("/dev/ptmx", O_RDWR | O_NOCTTY | O_NONBLOCK);
+ if (master >= 0) {
+ err = grantpt(master);
+ err = err || unlockpt(master);
+ if (!err) {
+ name = ptsname(master);
+ } else {
+ exit(-1);
+ }
+ } else {
+ exit(-1);
+ }
+ close(master);
+ exit(0);
+}
+
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:4316: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4319: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:4321: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4324: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ cat >>confdefs.h <<\EOF
+#define USE_UNIX98PTYS 1
+EOF
+
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+{ echo "$as_me:4334: WARNING: \"No unix98ptys\"" >&5
+echo "$as_me: WARNING: \"No unix98ptys\"" >&2;}
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+
+fi
+
+echo "$as_me:4342: checking for ANSI C header files" >&5
+echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6
+if test "${ac_cv_header_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4348 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <float.h>
+
+_ACEOF
+if { (eval echo "$as_me:4356: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:4362: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ ac_cv_header_stdc=yes
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ ac_cv_header_stdc=no
+fi
+rm -f conftest.err conftest.$ac_ext
+
+if test $ac_cv_header_stdc = yes; then
+ # SunOS 4.x string.h does not declare mem*, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4384 "configure"
+#include "confdefs.h"
+#include <string.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "memchr" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4402 "configure"
+#include "confdefs.h"
+#include <stdlib.h>
+
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "free" >/dev/null 2>&1; then
+ :
+else
+ ac_cv_header_stdc=no
+fi
+rm -f conftest*
+
+fi
+
+if test $ac_cv_header_stdc = yes; then
+ # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.
+ if test "$cross_compiling" = yes; then
+ :
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4423 "configure"
+#include "confdefs.h"
+#include <ctype.h>
+#if ((' ' & 0x0FF) == 0x020)
+# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
+# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))
+#else
+# define ISLOWER(c) (('a' <= (c) && (c) <= 'i') \
+ || ('j' <= (c) && (c) <= 'r') \
+ || ('s' <= (c) && (c) <= 'z'))
+# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))
+#endif
+
+#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))
+int
+main ()
+{
+ int i;
+ for (i = 0; i < 256; i++)
+ if (XOR (islower (i), ISLOWER (i))
+ || toupper (i) != TOUPPER (i))
+ exit(2);
+ exit (0);
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:4449: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:4452: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:4454: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4457: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ :
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_header_stdc=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+fi
+echo "$as_me:4470: result: $ac_cv_header_stdc" >&5
+echo "${ECHO_T}$ac_cv_header_stdc" >&6
+if test $ac_cv_header_stdc = yes; then
+
+cat >>confdefs.h <<\EOF
+#define STDC_HEADERS 1
+EOF
+
+fi
+
+echo "$as_me:4480: checking for sys/wait.h that is POSIX.1 compatible" >&5
+echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6
+if test "${ac_cv_header_sys_wait_h+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4486 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/wait.h>
+#ifndef WEXITSTATUS
+# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8)
+#endif
+#ifndef WIFEXITED
+# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)
+#endif
+
+int
+main ()
+{
+ int s;
+ wait (&s);
+ s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4508: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4511: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4514: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4517: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_sys_wait_h=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_header_sys_wait_h=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4527: result: $ac_cv_header_sys_wait_h" >&5
+echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6
+if test $ac_cv_header_sys_wait_h = yes; then
+
+cat >>confdefs.h <<\EOF
+#define HAVE_SYS_WAIT_H 1
+EOF
+
+fi
+
+for ac_header in fcntl.h sys/ioctl.h sys/time.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:4540: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4546 "configure"
+#include "confdefs.h"
+#include <$ac_header>
+_ACEOF
+if { (eval echo "$as_me:4550: \"$ac_cpp conftest.$ac_ext\"") >&5
+ (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1
+ ac_status=$?
+ egrep -v '^ *\+' conftest.er1 >conftest.err
+ rm -f conftest.er1
+ cat conftest.err >&5
+ echo "$as_me:4556: \$? = $ac_status" >&5
+ (exit $ac_status); } >/dev/null; then
+ if test -s conftest.err; then
+ ac_cpp_err=$ac_c_preproc_warn_flag
+ else
+ ac_cpp_err=
+ fi
+else
+ ac_cpp_err=yes
+fi
+if test -z "$ac_cpp_err"; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+ cat conftest.$ac_ext >&5
+ eval "$as_ac_Header=no"
+fi
+rm -f conftest.err conftest.$ac_ext
+fi
+echo "$as_me:4575: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:4585: checking for $CC option to accept ANSI C" >&5
+echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6
+if test "${ac_cv_prog_cc_stdc+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_prog_cc_stdc=no
+ac_save_CC=$CC
+cat >conftest.$ac_ext <<_ACEOF
+#line 4593 "configure"
+#include "confdefs.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */
+struct buf { int x; };
+FILE * (*rcsopen) (struct buf *, struct stat *, int);
+static char *e (p, i)
+ char **p;
+ int i;
+{
+ return p[i];
+}
+static char *f (char * (*g) (char **, int), char **p, ...)
+{
+ char *s;
+ va_list v;
+ va_start (v,p);
+ s = g (p, va_arg (v,int));
+ va_end (v);
+ return s;
+}
+int test (int i, double x);
+struct s1 {int (*f) (int a);};
+struct s2 {int (*f) (double a);};
+int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);
+int argc;
+char **argv;
+int
+main ()
+{
+return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1];
+ ;
+ return 0;
+}
+_ACEOF
+# Don't try gcc -ansi; that turns off useful extensions and
+# breaks some systems' header files.
+# AIX -qlanglvl=ansi
+# Ultrix and OSF/1 -std1
+# HP-UX 10.20 and later -Ae
+# HP-UX older versions -Aa -D_HPUX_SOURCE
+# SVR4 -Xc -D__EXTENSIONS__
+for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__"
+do
+ CC="$ac_save_CC $ac_arg"
+ rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4642: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4645: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4648: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4651: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_prog_cc_stdc=$ac_arg
+break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext
+done
+rm -f conftest.$ac_ext conftest.$ac_objext
+CC=$ac_save_CC
+
+fi
+
+case "x$ac_cv_prog_cc_stdc" in
+ x|xno)
+ echo "$as_me:4668: result: none needed" >&5
+echo "${ECHO_T}none needed" >&6 ;;
+ *)
+ echo "$as_me:4671: result: $ac_cv_prog_cc_stdc" >&5
+echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6
+ CC="$CC $ac_cv_prog_cc_stdc" ;;
+esac
+
+echo "$as_me:4676: checking for an ANSI C-conforming const" >&5
+echo $ECHO_N "checking for an ANSI C-conforming const... $ECHO_C" >&6
+if test "${ac_cv_c_const+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4682 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+/* FIXME: Include the comments suggested by Paul. */
+#ifndef __cplusplus
+ /* Ultrix mips cc rejects this. */
+ typedef int charset[2];
+ const charset x;
+ /* SunOS 4.1.1 cc rejects this. */
+ char const *const *ccp;
+ char **p;
+ /* NEC SVR4.0.2 mips cc rejects this. */
+ struct point {int x, y;};
+ static struct point const zero = {0,0};
+ /* AIX XL C 1.02.0.0 rejects this.
+ It does not let you subtract one const X* pointer from another in
+ an arm of an if-expression whose if-part is not a constant
+ expression */
+ const char *g = "string";
+ ccp = &g + (g ? g-g : 0);
+ /* HPUX 7.0 cc rejects these. */
+ ++ccp;
+ p = (char**) ccp;
+ ccp = (char const *const *) p;
+ { /* SCO 3.2v4 cc rejects this. */
+ char *t;
+ char const *s = 0 ? (char *) 0 : (char const *) 0;
+
+ *t++ = 0;
+ }
+ { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */
+ int x[] = {25, 17};
+ const int *foo = &x[0];
+ ++foo;
+ }
+ { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */
+ typedef const int *iptr;
+ iptr p = 0;
+ ++p;
+ }
+ { /* AIX XL C 1.02.0.0 rejects this saying
+ "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */
+ struct s { int j; const int *ap[3]; };
+ struct s *b; b->j = 5;
+ }
+ { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */
+ const int foo = 10;
+ }
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4740: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4743: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4746: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4749: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_const=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_c_const=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4759: result: $ac_cv_c_const" >&5
+echo "${ECHO_T}$ac_cv_c_const" >&6
+if test $ac_cv_c_const = no; then
+
+cat >>confdefs.h <<\EOF
+#define const
+EOF
+
+fi
+
+echo "$as_me:4769: checking for inline" >&5
+echo $ECHO_N "checking for inline... $ECHO_C" >&6
+if test "${ac_cv_c_inline+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_cv_c_inline=no
+for ac_kw in inline __inline__ __inline; do
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4777 "configure"
+#include "confdefs.h"
+#ifndef __cplusplus
+static $ac_kw int static_foo () {return 0; }
+$ac_kw int foo () {return 0; }
+#endif
+
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4786: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4789: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4792: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4795: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_c_inline=$ac_kw; break
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+done
+
+fi
+echo "$as_me:4806: result: $ac_cv_c_inline" >&5
+echo "${ECHO_T}$ac_cv_c_inline" >&6
+case $ac_cv_c_inline in
+ inline | yes) ;;
+ no)
+cat >>confdefs.h <<\EOF
+#define inline
+EOF
+ ;;
+ *) cat >>confdefs.h <<EOF
+#define inline $ac_cv_c_inline
+EOF
+ ;;
+esac
+
+# On IRIX 5.3, sys/types and inttypes.h are conflicting.
+
+for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \
+ inttypes.h stdint.h unistd.h
+do
+as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh`
+echo "$as_me:4827: checking for $ac_header" >&5
+echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6
+if eval "test \"\${$as_ac_Header+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4833 "configure"
+#include "confdefs.h"
+$ac_includes_default
+#include <$ac_header>
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4839: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4842: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4845: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4848: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_Header=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_Header=no"
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4858: result: `eval echo '${'$as_ac_Header'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6
+if test `eval echo '${'$as_ac_Header'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+echo "$as_me:4868: checking for pid_t" >&5
+echo $ECHO_N "checking for pid_t... $ECHO_C" >&6
+if test "${ac_cv_type_pid_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4874 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main ()
+{
+if ((pid_t *) 0)
+ return 0;
+if (sizeof (pid_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4889: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4892: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4895: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4898: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_pid_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_pid_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4908: result: $ac_cv_type_pid_t" >&5
+echo "${ECHO_T}$ac_cv_type_pid_t" >&6
+if test $ac_cv_type_pid_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define pid_t int
+EOF
+
+fi
+
+echo "$as_me:4920: checking for size_t" >&5
+echo $ECHO_N "checking for size_t... $ECHO_C" >&6
+if test "${ac_cv_type_size_t+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4926 "configure"
+#include "confdefs.h"
+$ac_includes_default
+int
+main ()
+{
+if ((size_t *) 0)
+ return 0;
+if (sizeof (size_t))
+ return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4941: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4944: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:4947: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:4950: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_size_t=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_size_t=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:4960: result: $ac_cv_type_size_t" >&5
+echo "${ECHO_T}$ac_cv_type_size_t" >&6
+if test $ac_cv_type_size_t = yes; then
+ :
+else
+
+cat >>confdefs.h <<EOF
+#define size_t unsigned
+EOF
+
+fi
+
+echo "$as_me:4972: checking whether time.h and sys/time.h may both be included" >&5
+echo $ECHO_N "checking whether time.h and sys/time.h may both be included... $ECHO_C" >&6
+if test "${ac_cv_header_time+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 4978 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <sys/time.h>
+#include <time.h>
+
+int
+main ()
+{
+if ((struct tm *) 0)
+return 0;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:4994: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:4997: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:5000: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5003: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_header_time=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_header_time=no
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:5013: result: $ac_cv_header_time" >&5
+echo "${ECHO_T}$ac_cv_header_time" >&6
+if test $ac_cv_header_time = yes; then
+
+cat >>confdefs.h <<\EOF
+#define TIME_WITH_SYS_TIME 1
+EOF
+
+fi
+
+echo "$as_me:5023: checking whether struct tm is in sys/time.h or time.h" >&5
+echo $ECHO_N "checking whether struct tm is in sys/time.h or time.h... $ECHO_C" >&6
+if test "${ac_cv_struct_tm+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5029 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <time.h>
+
+int
+main ()
+{
+struct tm *tp; tp->tm_sec;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:5043: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5046: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:5049: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5052: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_struct_tm=time.h
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_struct_tm=sys/time.h
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:5062: result: $ac_cv_struct_tm" >&5
+echo "${ECHO_T}$ac_cv_struct_tm" >&6
+if test $ac_cv_struct_tm = sys/time.h; then
+
+cat >>confdefs.h <<\EOF
+#define TM_IN_SYS_TIME 1
+EOF
+
+fi
+
+if test $ac_cv_c_compiler_gnu = yes; then
+ echo "$as_me:5073: checking whether $CC needs -traditional" >&5
+echo $ECHO_N "checking whether $CC needs -traditional... $ECHO_C" >&6
+if test "${ac_cv_prog_gcc_traditional+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_pattern="Autoconf.*'x'"
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5080 "configure"
+#include "confdefs.h"
+#include <sgtty.h>
+Autoconf TIOCGETP
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ ac_cv_prog_gcc_traditional=yes
+else
+ ac_cv_prog_gcc_traditional=no
+fi
+rm -f conftest*
+
+ if test $ac_cv_prog_gcc_traditional = no; then
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5095 "configure"
+#include "confdefs.h"
+#include <termio.h>
+Autoconf TCGETA
+_ACEOF
+if (eval "$ac_cpp conftest.$ac_ext") 2>&5 |
+ egrep "$ac_pattern" >/dev/null 2>&1; then
+ ac_cv_prog_gcc_traditional=yes
+fi
+rm -f conftest*
+
+ fi
+fi
+echo "$as_me:5108: result: $ac_cv_prog_gcc_traditional" >&5
+echo "${ECHO_T}$ac_cv_prog_gcc_traditional" >&6
+ if test $ac_cv_prog_gcc_traditional = yes; then
+ CC="$CC -traditional"
+ fi
+fi
+
+echo "$as_me:5115: checking for working memcmp" >&5
+echo $ECHO_N "checking for working memcmp... $ECHO_C" >&6
+if test "${ac_cv_func_memcmp_working+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ if test "$cross_compiling" = yes; then
+ ac_cv_func_memcmp_working=no
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5124 "configure"
+#include "confdefs.h"
+
+int
+main ()
+{
+
+ /* Some versions of memcmp are not 8-bit clean. */
+ char c0 = 0x40, c1 = 0x80, c2 = 0x81;
+ if (memcmp(&c0, &c2, 1) >= 0 || memcmp(&c1, &c2, 1) >= 0)
+ exit (1);
+
+ /* The Next x86 OpenStep bug shows up only when comparing 16 bytes
+ or more and with at least one buffer not starting on a 4-byte boundary.
+ William Lewis provided this test program. */
+ {
+ char foo[21];
+ char bar[21];
+ int i;
+ for (i = 0; i < 4; i++)
+ {
+ char *a = foo + i;
+ char *b = bar + i;
+ strcpy (a, "--------01111111");
+ strcpy (b, "--------10000000");
+ if (memcmp (a, b, 16) >= 0)
+ exit (1);
+ }
+ exit (0);
+ }
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest$ac_exeext
+if { (eval echo "$as_me:5160: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5163: \$? = $ac_status" >&5
+ (exit $ac_status); } && { ac_try='./conftest$ac_exeext'
+ { (eval echo "$as_me:5165: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5168: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_func_memcmp_working=yes
+else
+ echo "$as_me: program exited with status $ac_status" >&5
+echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_func_memcmp_working=no
+fi
+rm -f core core.* *.core conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext
+fi
+fi
+echo "$as_me:5180: result: $ac_cv_func_memcmp_working" >&5
+echo "${ECHO_T}$ac_cv_func_memcmp_working" >&6
+test $ac_cv_func_memcmp_working = no && LIBOBJS="$LIBOBJS memcmp.$ac_objext"
+
+echo "$as_me:5184: checking return type of signal handlers" >&5
+echo $ECHO_N "checking return type of signal handlers... $ECHO_C" >&6
+if test "${ac_cv_type_signal+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5190 "configure"
+#include "confdefs.h"
+#include <sys/types.h>
+#include <signal.h>
+#ifdef signal
+# undef signal
+#endif
+#ifdef __cplusplus
+extern "C" void (*signal (int, void (*)(int)))(int);
+#else
+void (*signal ()) ();
+#endif
+
+int
+main ()
+{
+int i;
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext
+if { (eval echo "$as_me:5212: \"$ac_compile\"") >&5
+ (eval $ac_compile) 2>&5
+ ac_status=$?
+ echo "$as_me:5215: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest.$ac_objext'
+ { (eval echo "$as_me:5218: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5221: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_type_signal=void
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_type_signal=int
+fi
+rm -f conftest.$ac_objext conftest.$ac_ext
+fi
+echo "$as_me:5231: result: $ac_cv_type_signal" >&5
+echo "${ECHO_T}$ac_cv_type_signal" >&6
+
+cat >>confdefs.h <<EOF
+#define RETSIGTYPE $ac_cv_type_signal
+EOF
+
+for ac_func in strftime
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:5241: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5247 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5278: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5281: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:5284: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5287: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5297: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+else
+ # strftime is in -lintl on SCO UNIX.
+echo "$as_me:5306: checking for strftime in -lintl" >&5
+echo $ECHO_N "checking for strftime in -lintl... $ECHO_C" >&6
+if test "${ac_cv_lib_intl_strftime+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lintl $LIBS"
+cat >conftest.$ac_ext <<_ACEOF
+#line 5314 "configure"
+#include "confdefs.h"
+
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char strftime ();
+int
+main ()
+{
+strftime ();
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5333: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5336: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:5339: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5342: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ ac_cv_lib_intl_strftime=yes
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+ac_cv_lib_intl_strftime=no
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+echo "$as_me:5353: result: $ac_cv_lib_intl_strftime" >&5
+echo "${ECHO_T}$ac_cv_lib_intl_strftime" >&6
+if test $ac_cv_lib_intl_strftime = yes; then
+ cat >>confdefs.h <<\EOF
+#define HAVE_STRFTIME 1
+EOF
+
+LIBS="-lintl $LIBS"
+fi
+
+fi
+done
+
+for ac_func in mktime select strdup strstr strtol strtok strsep snprintf
+do
+as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh`
+echo "$as_me:5369: checking for $ac_func" >&5
+echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6
+if eval "test \"\${$as_ac_var+set}\" = set"; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ cat >conftest.$ac_ext <<_ACEOF
+#line 5375 "configure"
+#include "confdefs.h"
+/* System header to define __stub macros and hopefully few prototypes,
+ which can conflict with char $ac_func (); below. */
+#include <assert.h>
+/* Override any gcc2 internal prototype to avoid an error. */
+#ifdef __cplusplus
+extern "C"
+#endif
+/* We use char because int might match the return type of a gcc2
+ builtin and then its argument prototype would still apply. */
+char $ac_func ();
+char (*f) ();
+
+int
+main ()
+{
+/* The GNU C library defines this for functions which it implements
+ to always fail with ENOSYS. Some functions are actually named
+ something starting with __ and the normal name is an alias. */
+#if defined (__stub_$ac_func) || defined (__stub___$ac_func)
+choke me
+#else
+f = $ac_func;
+#endif
+
+ ;
+ return 0;
+}
+_ACEOF
+rm -f conftest.$ac_objext conftest$ac_exeext
+if { (eval echo "$as_me:5406: \"$ac_link\"") >&5
+ (eval $ac_link) 2>&5
+ ac_status=$?
+ echo "$as_me:5409: \$? = $ac_status" >&5
+ (exit $ac_status); } &&
+ { ac_try='test -s conftest$ac_exeext'
+ { (eval echo "$as_me:5412: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:5415: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ eval "$as_ac_var=yes"
+else
+ echo "$as_me: failed program was:" >&5
+cat conftest.$ac_ext >&5
+eval "$as_ac_var=no"
+fi
+rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
+fi
+echo "$as_me:5425: result: `eval echo '${'$as_ac_var'}'`" >&5
+echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6
+if test `eval echo '${'$as_ac_var'}'` = yes; then
+ cat >>confdefs.h <<EOF
+#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1
+EOF
+
+fi
+done
+
+CFLAGS="$CFLAGS $NLS_CFLAGS"
+LIBS="$LIBS $NLS_LIBS"
+
+PACKAGE=gnokii
+XPACKAGE=xgnokii
+VERSION=`cat VERSION`
+XVERSION=`cat xgnokii/VERSION`
+HAVE_XGNOKII=$x_support
+
+case "$INSTALL" in
+ 'config/install-sh -c') INSTALL=`pwd`/$INSTALL
+ ;;
+esac
+
+SHELL=${CONFIG_SHELL-/bin/sh}
+
+case "$build_os" in
+ solaris*) SHELL=/bin/ksh
+ ;;
+esac
+
+ac_config_headers="$ac_config_headers include/config.h"
+
+ac_config_files="$ac_config_files include/config.h.in Makefile.global po/Makefile.in packaging/RedHat/gnokii.spec packaging/Slackware/SlackBuild"
+ac_config_commands="$ac_config_commands default"
+cat >confcache <<\_ACEOF
+# This file is a shell script that caches the results of configure
+# tests run on this system so they can be shared between configure
+# scripts and configure runs, see configure's option --config-cache.
+# It is not useful on other systems. If it contains results you don't
+# want to keep, you may remove or edit it.
+#
+# config.status only pays attention to the cache file if you give it
+# the --recheck option to rerun configure.
+#
+# `ac_cv_env_foo' variables (set or unset) will be overriden when
+# loading this file, other *unset* `ac_cv_foo' will be assigned the
+# following values.
+
+_ACEOF
+
+# The following way of writing the cache mishandles newlines in values,
+# but we know of no workaround that is simple, portable, and efficient.
+# So, don't put newlines in cache variables' values.
+# Ultrix sh set writes to stderr and can't be redirected directly,
+# and sets the high bit in the cache file unless we assign to the vars.
+{
+ (set) 2>&1 |
+ case `(ac_space=' '; set | grep ac_space) 2>&1` in
+ *ac_space=\ *)
+ # `set' does not quote correctly, so add quotes (double-quote
+ # substitution turns \\\\ into \\, and sed turns \\ into \).
+ sed -n \
+ "s/'/'\\\\''/g;
+ s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p"
+ ;;
+ *)
+ # `set' quotes correctly as required by POSIX, so do not add quotes.
+ sed -n \
+ "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p"
+ ;;
+ esac;
+} |
+ sed '
+ t clear
+ : clear
+ s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/
+ t end
+ /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/
+ : end' >>confcache
+if cmp -s $cache_file confcache; then :; else
+ if test -w $cache_file; then
+ test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file"
+ cat confcache >$cache_file
+ else
+ echo "not updating unwritable cache $cache_file"
+ fi
+fi
+rm -f confcache
+
+test "x$prefix" = xNONE && prefix=$ac_default_prefix
+# Let make expand exec_prefix.
+test "x$exec_prefix" = xNONE && exec_prefix='${prefix}'
+
+# VPATH may cause trouble with some makes, so we remove $(srcdir),
+# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and
+# trailing colons and then remove the whole line if VPATH becomes empty
+# (actually we leave an empty line to preserve line numbers).
+if test "x$srcdir" = x.; then
+ ac_vpsub='/^[ ]*VPATH[ ]*=/{
+s/:*\$(srcdir):*/:/;
+s/:*\${srcdir}:*/:/;
+s/:*@srcdir@:*/:/;
+s/^\([^=]*=[ ]*\):*/\1/;
+s/:*$//;
+s/^[^=]*=[ ]*$//;
+}'
+fi
+
+DEFS=-DHAVE_CONFIG_H
+
+: ${CONFIG_STATUS=./config.status}
+ac_clean_files_save=$ac_clean_files
+ac_clean_files="$ac_clean_files $CONFIG_STATUS"
+{ echo "$as_me:5539: creating $CONFIG_STATUS" >&5
+echo "$as_me: creating $CONFIG_STATUS" >&6;}
+cat >$CONFIG_STATUS <<_ACEOF
+#! $SHELL
+# Generated automatically by configure.
+# Run this file to recreate the current configuration.
+# Compiler output produced by configure, useful for debugging
+# configure, is in config.log if it exists.
+
+debug=false
+SHELL=\${CONFIG_SHELL-$SHELL}
+ac_cs_invocation="\$0 \$@"
+
+_ACEOF
+
+cat >>$CONFIG_STATUS <<\_ACEOF
+# Be Bourne compatible
+if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then
+ emulate sh
+ NULLCMD=:
+elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then
+ set -o posix
+fi
+
+# Name of the executable.
+as_me=`echo "$0" |sed 's,.*[\\/],,'`
+
+if expr a : '\(a\)' >/dev/null 2>&1; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+rm -f conf$$ conf$$.exe conf$$.file
+echo >conf$$.file
+if ln -s conf$$.file conf$$ 2>/dev/null; then
+ # We could just check for DJGPP; but this test a) works b) is more generic
+ # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04).
+ if test -f conf$$.exe; then
+ # Don't use ln at all; we don't have any links
+ as_ln_s='cp -p'
+ else
+ as_ln_s='ln -s'
+ fi
+elif ln conf$$.file conf$$ 2>/dev/null; then
+ as_ln_s=ln
+else
+ as_ln_s='cp -p'
+fi
+rm -f conf$$ conf$$.exe conf$$.file
+
+as_executable_p="test -f"
+
+# Support unset when possible.
+if (FOO=FOO; unset FOO) >/dev/null 2>&1; then
+ as_unset=unset
+else
+ as_unset=false
+fi
+
+# NLS nuisances.
+$as_unset LANG || test "${LANG+set}" != set || { LANG=C; export LANG; }
+$as_unset LC_ALL || test "${LC_ALL+set}" != set || { LC_ALL=C; export LC_ALL; }
+$as_unset LC_TIME || test "${LC_TIME+set}" != set || { LC_TIME=C; export LC_TIME; }
+$as_unset LC_CTYPE || test "${LC_CTYPE+set}" != set || { LC_CTYPE=C; export LC_CTYPE; }
+$as_unset LANGUAGE || test "${LANGUAGE+set}" != set || { LANGUAGE=C; export LANGUAGE; }
+$as_unset LC_COLLATE || test "${LC_COLLATE+set}" != set || { LC_COLLATE=C; export LC_COLLATE; }
+$as_unset LC_NUMERIC || test "${LC_NUMERIC+set}" != set || { LC_NUMERIC=C; export LC_NUMERIC; }
+$as_unset LC_MESSAGES || test "${LC_MESSAGES+set}" != set || { LC_MESSAGES=C; export LC_MESSAGES; }
+
+# IFS
+# We need space, tab and new line, in precisely that order.
+as_nl='
+'
+IFS=" $as_nl"
+
+# CDPATH.
+$as_unset CDPATH || test "${CDPATH+set}" != set || { CDPATH=:; export CDPATH; }
+
+exec 6>&1
+
+_ACEOF
+
+# Files that config.status was made for.
+if test -n "$ac_config_files"; then
+ echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_headers"; then
+ echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_links"; then
+ echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS
+fi
+
+if test -n "$ac_config_commands"; then
+ echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS
+fi
+
+cat >>$CONFIG_STATUS <<\EOF
+
+ac_cs_usage="\
+\`$as_me' instantiates files from templates according to the
+current configuration.
+
+Usage: $0 [OPTIONS] [FILE]...
+
+ -h, --help print this help, then exit
+ -V, --version print version number, then exit
+ -d, --debug don't remove temporary files
+ --recheck update $as_me by reconfiguring in the same conditions
+ --file=FILE[:TEMPLATE]
+ instantiate the configuration file FILE
+ --header=FILE[:TEMPLATE]
+ instantiate the configuration header FILE
+
+Configuration files:
+$config_files
+
+Configuration headers:
+$config_headers
+
+Configuration commands:
+$config_commands
+
+Report bugs to <bug-autoconf@gnu.org>."
+EOF
+
+cat >>$CONFIG_STATUS <<EOF
+ac_cs_version="\\
+config.status
+configured by $0, generated by GNU Autoconf 2.52,
+ with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\"
+
+Copyright 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
+Free Software Foundation, Inc.
+This config.status script is free software; the Free Software Foundation
+gives unlimited permission to copy, distribute and modify it."
+srcdir=$srcdir
+INSTALL="$INSTALL"
+EOF
+
+cat >>$CONFIG_STATUS <<\EOF
+# If no file are specified by the user, then we need to provide default
+# value. By we need to know if files were specified by the user.
+ac_need_defaults=:
+while test $# != 0
+do
+ case $1 in
+ --*=*)
+ ac_option=`expr "x$1" : 'x\([^=]*\)='`
+ ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'`
+ shift
+ set dummy "$ac_option" "$ac_optarg" ${1+"$@"}
+ shift
+ ;;
+ -*);;
+ *) # This is not an option, so the user has probably given explicit
+ # arguments.
+ ac_need_defaults=false;;
+ esac
+
+ case $1 in
+ # Handling of the options.
+EOF
+cat >>$CONFIG_STATUS <<EOF
+ -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)
+ echo "running $SHELL $0 " $ac_configure_args " --no-create --no-recursion"
+ exec $SHELL $0 $ac_configure_args --no-create --no-recursion ;;
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+ --version | --vers* | -V )
+ echo "$ac_cs_version"; exit 0 ;;
+ --he | --h)
+ # Conflict between --help and --header
+ { { echo "$as_me:5715: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: ambiguous option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; };;
+ --help | --hel | -h )
+ echo "$ac_cs_usage"; exit 0 ;;
+ --debug | --d* | -d )
+ debug=: ;;
+ --file | --fil | --fi | --f )
+ shift
+ CONFIG_FILES="$CONFIG_FILES $1"
+ ac_need_defaults=false;;
+ --header | --heade | --head | --hea )
+ shift
+ CONFIG_HEADERS="$CONFIG_HEADERS $1"
+ ac_need_defaults=false;;
+
+ # This is an error.
+ -*) { { echo "$as_me:5734: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&5
+echo "$as_me: error: unrecognized option: $1
+Try \`$0 --help' for more information." >&2;}
+ { (exit 1); exit 1; }; } ;;
+
+ *) ac_config_targets="$ac_config_targets $1" ;;
+
+ esac
+ shift
+done
+
+exec 5>>config.log
+cat >&5 << _ACEOF
+
+## ----------------------- ##
+## Running config.status. ##
+## ----------------------- ##
+
+This file was extended by $as_me 2.52, executed with
+ CONFIG_FILES = $CONFIG_FILES
+ CONFIG_HEADERS = $CONFIG_HEADERS
+ CONFIG_LINKS = $CONFIG_LINKS
+ CONFIG_COMMANDS = $CONFIG_COMMANDS
+ > $ac_cs_invocation
+on `(hostname || uname -n) 2>/dev/null | sed 1q`
+
+_ACEOF
+EOF
+
+cat >>$CONFIG_STATUS <<\EOF
+for ac_config_target in $ac_config_targets
+do
+ case "$ac_config_target" in
+ # Handling of arguments.
+ "include/config.h.in" ) CONFIG_FILES="$CONFIG_FILES include/config.h.in" ;;
+ "Makefile.global" ) CONFIG_FILES="$CONFIG_FILES Makefile.global" ;;
+ "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;;
+ "packaging/RedHat/gnokii.spec" ) CONFIG_FILES="$CONFIG_FILES packaging/RedHat/gnokii.spec" ;;
+ "packaging/Slackware/SlackBuild" ) CONFIG_FILES="$CONFIG_FILES packaging/Slackware/SlackBuild" ;;
+ "default" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default" ;;
+ "include/config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS include/config.h" ;;
+ *) { { echo "$as_me:5776: error: invalid argument: $ac_config_target" >&5
+echo "$as_me: error: invalid argument: $ac_config_target" >&2;}
+ { (exit 1); exit 1; }; };;
+ esac
+done
+
+# If the user did not use the arguments to specify the items to instantiate,
+# then the envvar interface is used. Set only those that are not.
+# We use the long form for the default assignment because of an extremely
+# bizarre bug on SunOS 4.1.3.
+if $ac_need_defaults; then
+ test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files
+ test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers
+ test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands
+fi
+
+# Create a temporary directory, and hook for its removal unless debugging.
+$debug ||
+{
+ trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0
+ trap '{ (exit 1); exit 1; }' 1 2 13 15
+}
+
+# Create a (secure) tmp directory for tmp files.
+: ${TMPDIR=/tmp}
+{
+ tmp=`(umask 077 && mktemp -d -q "$TMPDIR/csXXXXXX") 2>/dev/null` &&
+ test -n "$tmp" && test -d "$tmp"
+} ||
+{
+ tmp=$TMPDIR/cs$$-$RANDOM
+ (umask 077 && mkdir $tmp)
+} ||
+{
+ echo "$me: cannot create a temporary directory in $TMPDIR" >&2
+ { (exit 1); exit 1; }
+}
+
+EOF
+
+cat >>$CONFIG_STATUS <<EOF
+
+#
+# CONFIG_FILES section.
+#
+
+# No need to generate the scripts if there are no CONFIG_FILES.
+# This happens for instance when ./config.status config.h
+if test -n "\$CONFIG_FILES"; then
+ # Protect against being on the right side of a sed subst in config.status.
+ sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g;
+ s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF
+s,@SHELL@,$SHELL,;t t
+s,@exec_prefix@,$exec_prefix,;t t
+s,@prefix@,$prefix,;t t
+s,@program_transform_name@,$program_transform_name,;t t
+s,@bindir@,$bindir,;t t
+s,@sbindir@,$sbindir,;t t
+s,@libexecdir@,$libexecdir,;t t
+s,@datadir@,$datadir,;t t
+s,@sysconfdir@,$sysconfdir,;t t
+s,@sharedstatedir@,$sharedstatedir,;t t
+s,@localstatedir@,$localstatedir,;t t
+s,@libdir@,$libdir,;t t
+s,@includedir@,$includedir,;t t
+s,@oldincludedir@,$oldincludedir,;t t
+s,@infodir@,$infodir,;t t
+s,@mandir@,$mandir,;t t
+s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t
+s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t
+s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t
+s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t
+s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t
+s,@build_alias@,$build_alias,;t t
+s,@host_alias@,$host_alias,;t t
+s,@target_alias@,$target_alias,;t t
+s,@ECHO_C@,$ECHO_C,;t t
+s,@ECHO_N@,$ECHO_N,;t t
+s,@ECHO_T@,$ECHO_T,;t t
+s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t
+s,@DEFS@,$DEFS,;t t
+s,@LIBS@,$LIBS,;t t
+s,@build@,$build,;t t
+s,@build_cpu@,$build_cpu,;t t
+s,@build_vendor@,$build_vendor,;t t
+s,@build_os@,$build_os,;t t
+s,@host@,$host,;t t
+s,@host_cpu@,$host_cpu,;t t
+s,@host_vendor@,$host_vendor,;t t
+s,@host_os@,$host_os,;t t
+s,@target@,$target,;t t
+s,@target_cpu@,$target_cpu,;t t
+s,@target_vendor@,$target_vendor,;t t
+s,@target_os@,$target_os,;t t
+s,@CC@,$CC,;t t
+s,@CFLAGS@,$CFLAGS,;t t
+s,@LDFLAGS@,$LDFLAGS,;t t
+s,@CPPFLAGS@,$CPPFLAGS,;t t
+s,@ac_ct_CC@,$ac_ct_CC,;t t
+s,@EXEEXT@,$EXEEXT,;t t
+s,@OBJEXT@,$OBJEXT,;t t
+s,@CPP@,$CPP,;t t
+s,@LEX@,$LEX,;t t
+s,@LEXLIB@,$LEXLIB,;t t
+s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t
+s,@RM@,$RM,;t t
+s,@FIND@,$FIND,;t t
+s,@MAKE@,$MAKE,;t t
+s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t
+s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t
+s,@INSTALL_DATA@,$INSTALL_DATA,;t t
+s,@SET_MAKE@,$SET_MAKE,;t t
+s,@HAVE_LOCALE_H@,$HAVE_LOCALE_H,;t t
+s,@HAVE_LIBINTL_H@,$HAVE_LIBINTL_H,;t t
+s,@HAVE_LIBINTL@,$HAVE_LIBINTL,;t t
+s,@LOCALEDIR@,$LOCALEDIR,;t t
+s,@MSGFMT@,$MSGFMT,;t t
+s,@GMSGFMT@,$GMSGFMT,;t t
+s,@XGETTEXT@,$XGETTEXT,;t t
+s,@MSGMERGE@,$MSGMERGE,;t t
+s,@CATALOGS@,$CATALOGS,;t t
+s,@CATOBJEXT@,$CATOBJEXT,;t t
+s,@INSTOBJEXT@,$INSTOBJEXT,;t t
+s,@DATADIRNAME@,$DATADIRNAME,;t t
+s,@GTK_CONFIG@,$GTK_CONFIG,;t t
+s,@LIBOBJS@,$LIBOBJS,;t t
+s,@PACKAGE@,$PACKAGE,;t t
+s,@VERSION@,$VERSION,;t t
+s,@XVERSION@,$XVERSION,;t t
+s,@XPACKAGE@,$XPACKAGE,;t t
+s,@XGNOKIIDIR@,$XGNOKIIDIR,;t t
+s,@XGNOKIIPATH@,$XGNOKIIPATH,;t t
+s,@USE_NLS@,$USE_NLS,;t t
+s,@GTK_CFLAGS@,$GTK_CFLAGS,;t t
+s,@GTK_LIBS@,$GTK_LIBS,;t t
+s,@PTHREAD_CFLAGS@,$PTHREAD_CFLAGS,;t t
+s,@PTHREAD_LIBS@,$PTHREAD_LIBS,;t t
+s,@XPM_CFLAGS@,$XPM_CFLAGS,;t t
+s,@XPM_LIBS@,$XPM_LIBS,;t t
+s,@OWN_GETOPT@,$OWN_GETOPT,;t t
+s,@USE_UNIX98PTYS@,$USE_UNIX98PTYS,;t t
+s,@HAVE_XGNOKII@,$HAVE_XGNOKII,;t t
+CEOF
+
+EOF
+
+ cat >>$CONFIG_STATUS <<\EOF
+ # Split the substitutions into bite-sized pieces for seds with
+ # small command number limits, like on Digital OSF/1 and HP-UX.
+ ac_max_sed_lines=48
+ ac_sed_frag=1 # Number of current file.
+ ac_beg=1 # First line for current file.
+ ac_end=$ac_max_sed_lines # Line after last line for current file.
+ ac_more_lines=:
+ ac_sed_cmds=
+ while $ac_more_lines; do
+ if test $ac_beg -gt 1; then
+ sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ else
+ sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag
+ fi
+ if test ! -s $tmp/subs.frag; then
+ ac_more_lines=false
+ else
+ # The purpose of the label and of the branching condition is to
+ # speed up the sed processing (if there are no `@' at all, there
+ # is no need to browse any of the substitutions).
+ # These are the two extra sed commands mentioned above.
+ (echo ':t
+ /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed"
+ else
+ ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed"
+ fi
+ ac_sed_frag=`expr $ac_sed_frag + 1`
+ ac_beg=$ac_end
+ ac_end=`expr $ac_end + $ac_max_sed_lines`
+ fi
+ done
+ if test -z "$ac_sed_cmds"; then
+ ac_sed_cmds=cat
+ fi
+fi # test -n "$CONFIG_FILES"
+
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories.
+ ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ { case "$ac_dir" in
+ [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+ *) as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+ case $as_mkdir_dir in
+ # Skip DOS drivespec
+ ?:) as_incr_dir=$as_mkdir_dir ;;
+ *)
+ as_incr_dir=$as_incr_dir/$as_mkdir_dir
+ test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+ ;;
+ esac
+done; }
+
+ ac_dir_suffix="/`echo $ac_dir|sed 's,^\./,,'`"
+ # A "../" for each directory in $ac_dir_suffix.
+ ac_dots=`echo "$ac_dir_suffix" | sed 's,/[^/]*,../,g'`
+ else
+ ac_dir_suffix= ac_dots=
+ fi
+
+ case $srcdir in
+ .) ac_srcdir=.
+ if test -z "$ac_dots"; then
+ ac_top_srcdir=.
+ else
+ ac_top_srcdir=`echo $ac_dots | sed 's,/$,,'`
+ fi ;;
+ [\\/]* | ?:[\\/]* )
+ ac_srcdir=$srcdir$ac_dir_suffix;
+ ac_top_srcdir=$srcdir ;;
+ *) # Relative path.
+ ac_srcdir=$ac_dots$srcdir$ac_dir_suffix
+ ac_top_srcdir=$ac_dots$srcdir ;;
+ esac
+
+ case $INSTALL in
+ [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;;
+ *) ac_INSTALL=$ac_dots$INSTALL ;;
+ esac
+
+ if test x"$ac_file" != x-; then
+ { echo "$as_me:6032: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+ rm -f "$ac_file"
+ fi
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated automatically by config.status. */
+ configure_input="Generated automatically from `echo $ac_file_in |
+ sed 's,.*/,,'` by configure."
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:6050: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo $srcdir/$f
+ else
+ # /dev/null tree
+ { { echo "$as_me:6063: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+EOF
+cat >>$CONFIG_STATUS <<EOF
+ sed "$ac_vpsub
+$extrasub
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+:t
+/@[a-zA-Z_][a-zA-Z_0-9]*@/!b
+s,@configure_input@,$configure_input,;t t
+s,@srcdir@,$ac_srcdir,;t t
+s,@top_srcdir@,$ac_top_srcdir,;t t
+s,@INSTALL@,$ac_INSTALL,;t t
+" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out
+ rm -f $tmp/stdin
+ if test x"$ac_file" != x-; then
+ mv $tmp/out $ac_file
+ else
+ cat $tmp/out
+ rm -f $tmp/out
+ fi
+
+done
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+
+#
+# CONFIG_HEADER section.
+#
+
+# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where
+# NAME is the cpp macro being defined and VALUE is the value it is being given.
+#
+# ac_d sets the value in "#define NAME VALUE" lines.
+ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)'
+ac_dB='[ ].*$,\1#\2'
+ac_dC=' '
+ac_dD=',;t'
+# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE".
+ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)'
+ac_uB='$,\1#\2define\3'
+ac_uC=' '
+ac_uD=',;t'
+
+for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue
+ # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in".
+ case $ac_file in
+ - | *:- | *:-:* ) # input from stdin
+ cat >$tmp/stdin
+ ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'`
+ ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;;
+ * ) ac_file_in=$ac_file.in ;;
+ esac
+
+ test x"$ac_file" != x- && { echo "$as_me:6124: creating $ac_file" >&5
+echo "$as_me: creating $ac_file" >&6;}
+
+ # First look for the input files in the build tree, otherwise in the
+ # src tree.
+ ac_file_inputs=`IFS=:
+ for f in $ac_file_in; do
+ case $f in
+ -) echo $tmp/stdin ;;
+ [\\/$]*)
+ # Absolute (can't be DOS-style, as IFS=:)
+ test -f "$f" || { { echo "$as_me:6135: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ echo $f;;
+ *) # Relative
+ if test -f "$f"; then
+ # Build tree
+ echo $f
+ elif test -f "$srcdir/$f"; then
+ # Source tree
+ echo $srcdir/$f
+ else
+ # /dev/null tree
+ { { echo "$as_me:6148: error: cannot find input file: $f" >&5
+echo "$as_me: error: cannot find input file: $f" >&2;}
+ { (exit 1); exit 1; }; }
+ fi;;
+ esac
+ done` || { (exit 1); exit 1; }
+ # Remove the trailing spaces.
+ sed 's/[ ]*$//' $ac_file_inputs >$tmp/in
+
+EOF
+
+# Transform confdefs.h into two sed scripts, `conftest.defines' and
+# `conftest.undefs', that substitutes the proper values into
+# config.h.in to produce config.h. The first handles `#define'
+# templates, and the second `#undef' templates.
+# And first: Protect against being on the right side of a sed subst in
+# config.status. Protect against being in an unquoted here document
+# in config.status.
+rm -f conftest.defines conftest.undefs
+# Using a here document instead of a string reduces the quoting nightmare.
+# Putting comments in sed scripts is not portable.
+#
+# `end' is used to avoid that the second main sed command (meant for
+# 0-ary CPP macros) applies to n-ary macro definitions.
+# See the Autoconf documentation for `clear'.
+cat >confdef2sed.sed <<\EOF
+s/[\\&,]/\\&/g
+s,[\\$`],\\&,g
+t clear
+: clear
+s,^[ ]*#[ ]*define[ ][ ]*\(\([^ (][^ (]*\)([^)]*)\)[ ]*\(.*\)$,${ac_dA}\2${ac_dB}\1${ac_dC}\3${ac_dD},gp
+t end
+s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp
+: end
+EOF
+# If some macros were called several times there might be several times
+# the same #defines, which is useless. Nevertheless, we may not want to
+# sort them, since we want the *last* AC-DEFINE to be honored.
+uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines
+sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs
+rm -f confdef2sed.sed
+
+# This sed command replaces #undef with comments. This is necessary, for
+# example, in the case of _POSIX_SOURCE, which is predefined and required
+# on some systems where configure will not decide to define it.
+cat >>conftest.undefs <<\EOF
+s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */,
+EOF
+
+# Break up conftest.defines because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS
+echo ' if egrep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS
+echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS
+echo ' :' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.defines >/dev/null
+do
+ # Write a limited-size here document to $tmp/defines.sed.
+ echo ' cat >$tmp/defines.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#define' lines.
+ echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/defines.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail
+ rm -f conftest.defines
+ mv conftest.tail conftest.defines
+done
+rm -f conftest.defines
+echo ' fi # egrep' >>$CONFIG_STATUS
+echo >>$CONFIG_STATUS
+
+# Break up conftest.undefs because some shells have a limit on the size
+# of here documents, and old seds have small limits too (100 cmds).
+echo ' # Handle all the #undef templates' >>$CONFIG_STATUS
+rm -f conftest.tail
+while grep . conftest.undefs >/dev/null
+do
+ # Write a limited-size here document to $tmp/undefs.sed.
+ echo ' cat >$tmp/undefs.sed <<CEOF' >>$CONFIG_STATUS
+ # Speed up: don't consider the non `#undef'
+ echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS
+ # Work around the forget-to-reset-the-flag bug.
+ echo 't clr' >>$CONFIG_STATUS
+ echo ': clr' >>$CONFIG_STATUS
+ sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS
+ echo 'CEOF
+ sed -f $tmp/undefs.sed $tmp/in >$tmp/out
+ rm -f $tmp/in
+ mv $tmp/out $tmp/in
+' >>$CONFIG_STATUS
+ sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail
+ rm -f conftest.undefs
+ mv conftest.tail conftest.undefs
+done
+rm -f conftest.undefs
+
+cat >>$CONFIG_STATUS <<\EOF
+ # Let's still pretend it is `configure' which instantiates (i.e., don't
+ # use $as_me), people would be surprised to read:
+ # /* config.h. Generated automatically by config.status. */
+ if test x"$ac_file" = x-; then
+ echo "/* Generated automatically by configure. */" >$tmp/config.h
+ else
+ echo "/* $ac_file. Generated automatically by configure. */" >$tmp/config.h
+ fi
+ cat $tmp/in >>$tmp/config.h
+ rm -f $tmp/in
+ if test x"$ac_file" != x-; then
+ if cmp -s $ac_file $tmp/config.h 2>/dev/null; then
+ { echo "$as_me:6265: $ac_file is unchanged" >&5
+echo "$as_me: $ac_file is unchanged" >&6;}
+ else
+ ac_dir=`$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \
+ X"$ac_file" : 'X\(//\)[^/]' \| \
+ X"$ac_file" : 'X\(//\)$' \| \
+ X"$ac_file" : 'X\(/\)' \| \
+ . : '\(.\)' 2>/dev/null ||
+echo X"$ac_file" |
+ sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; }
+ /^X\(\/\/\)[^/].*/{ s//\1/; q; }
+ /^X\(\/\/\)$/{ s//\1/; q; }
+ /^X\(\/\).*/{ s//\1/; q; }
+ s/.*/./; q'`
+ if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then
+ { case "$ac_dir" in
+ [\\/]* | ?:[\\/]* ) as_incr_dir=;;
+ *) as_incr_dir=.;;
+esac
+as_dummy="$ac_dir"
+for as_mkdir_dir in `IFS='/\\'; set X $as_dummy; shift; echo "$@"`; do
+ case $as_mkdir_dir in
+ # Skip DOS drivespec
+ ?:) as_incr_dir=$as_mkdir_dir ;;
+ *)
+ as_incr_dir=$as_incr_dir/$as_mkdir_dir
+ test -d "$as_incr_dir" || mkdir "$as_incr_dir"
+ ;;
+ esac
+done; }
+
+ fi
+ rm -f $ac_file
+ mv $tmp/config.h $ac_file
+ fi
+ else
+ cat $tmp/config.h
+ rm -f $tmp/config.h
+ fi
+done
+EOF
+cat >>$CONFIG_STATUS <<\EOF
+
+#
+# CONFIG_COMMANDS section.
+#
+for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue
+ ac_dest=`echo "$ac_file" | sed 's,:.*,,'`
+ ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'`
+
+ case $ac_dest in
+ default ) sed -e "/POTFILES =/r po/POTFILES" po/Makefile.in > po/Makefile
+ ;;
+ esac
+done
+EOF
+
+cat >>$CONFIG_STATUS <<\EOF
+
+{ (exit 0); exit 0; }
+EOF
+chmod +x $CONFIG_STATUS
+ac_clean_files=$ac_clean_files_save
+
+# configure is writing to config.log, and then calls config.status.
+# config.status does its own redirection, appending to config.log.
+# Unfortunately, on DOS this fails, as config.log is still kept open
+# by configure, so config.status won't be able to write to it; its
+# output is simply discarded. So we exec the FD to /dev/null,
+# effectively closing config.log, so it can be properly (re)opened and
+# appended to by config.status. When coming back to configure, we
+# need to make the FD available again.
+if test "$no_create" != yes; then
+ ac_cs_success=:
+ exec 5>/dev/null
+ $SHELL $CONFIG_STATUS || ac_cs_success=false
+ exec 5>>config.log
+ # Use ||, not &&, to avoid exiting from the if with $? = 1, which
+ # would make configure fail if this is the last instruction.
+ $ac_cs_success || { (exit 1); exit 1; }
+fi
+
+echo "
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Copyright (C) 1999-2000 The Gnokii Development Team.
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ See file COPYING for more details.
+
+ Host system: $host_os
+ Gnokii version: $VERSION
+ Xgnokii version: $XVERSION
+ X (GTK) support: $x_support
+ Debug: $debug
+ XDebug: $xdebug
+ RLPDebug: $rlpdebug
+ NLS: $USE_NLS
+ Security: $security
+ Win32: $win32
+ Prefix: $prefix
+
+ Type '${MAKE}' for compilation or '${MAKE} makelib' when want to compile
+ all binaries with one shared library
+
+ After it '${MAKE} install', '${MAKE} install-suid', '${MAKE} install-strip'
+ or '${MAKE} install-ss' to install gnokii.
+"
--- /dev/null
+/* Getopt for GNU.
+ NOTE: getopt is now part of the C library, so if you don't know what
+ "Keep this file name-space clean" means, talk to roland@gnu.ai.mit.edu
+ before changing it!
+
+ Copyright (C) 1987, 88, 89, 90, 91, 92, 1993
+ Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+\f
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifndef __STDC__
+# ifndef const
+# define const
+# endif
+#endif
+
+/* This tells Alpha OSF/1 not to define a getopt prototype in <stdio.h>. */
+#ifndef _NO_PROTO
+#define _NO_PROTO
+#endif
+
+#include <stdio.h>
+
+/* Comment out all this code if we are using the GNU C Library, and are not
+ actually compiling the library itself. This code is part of the GNU C
+ Library, but also included in many other GNU distributions. Compiling
+ and linking in this code is a waste when using the GNU C library
+ (especially if it is a shared library). Rather than having every GNU
+ program understand `configure --with-gnu-libc' and omit the object files,
+ it is simpler to just do this in the source for each such file. */
+
+#if defined (_LIBC) || !defined (__GNU_LIBRARY__)
+
+
+/* This needs to come after some library #include
+ to get __GNU_LIBRARY__ defined. */
+#ifdef __GNU_LIBRARY__
+/* Don't include stdlib.h for non-GNU C libraries because some of them
+ contain conflicting prototypes for getopt. */
+#include <stdlib.h>
+#endif /* GNU C library. */
+
+/* If GETOPT_COMPAT is defined, `+' as well as `--' can introduce a
+ long-named option. Because this is not POSIX.2 compliant, it is
+ being phased out. */
+/* #define GETOPT_COMPAT */
+
+/* This version of `getopt' appears to the caller like standard Unix `getopt'
+ but it behaves differently for the user, since it allows the user
+ to intersperse the options with the other arguments.
+
+ As `getopt' works, it permutes the elements of ARGV so that,
+ when it is done, all the options precede everything else. Thus
+ all application programs are extended to handle flexible argument order.
+
+ Setting the environment variable POSIXLY_CORRECT disables permutation.
+ Then the behavior is completely standard.
+
+ GNU application programs can use a third alternative mode in which
+ they can distinguish the relative order of options and other arguments. */
+
+#ifdef VC6
+ #include "getopt.h"
+#else
+ #include <win32/getopt.h>
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+char *optarg = 0;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+/* XXX 1003.2 says this must be 1 before any call. */
+int optind = 0;
+
+/* The next char to be scanned in the option-element
+ in which the last option character we returned was found.
+ This allows us to pick up the scan where we left off.
+
+ If this is zero, or a null string, it means resume the scan
+ by advancing to the next ARGV-element. */
+
+static char *nextchar;
+
+/* Callers store zero here to inhibit the error message
+ for unrecognized options. */
+
+int opterr = 1;
+
+/* Set to an option character which was unrecognized.
+ This must be initialized on some systems to avoid linking in the
+ system's own getopt implementation. */
+
+#define BAD_OPTION '\0'
+int optopt = BAD_OPTION;
+
+/* Describe how to deal with options that follow non-option ARGV-elements.
+
+ If the caller did not specify anything,
+ the default is REQUIRE_ORDER if the environment variable
+ POSIXLY_CORRECT is defined, PERMUTE otherwise.
+
+ REQUIRE_ORDER means don't recognize them as options;
+ stop option processing when the first non-option is seen.
+ This is what Unix does.
+ This mode of operation is selected by either setting the environment
+ variable POSIXLY_CORRECT, or using `+' as the first character
+ of the list of option characters.
+
+ PERMUTE is the default. We permute the contents of ARGV as we scan,
+ so that eventually all the non-options are at the end. This allows options
+ to be given in any order, even with programs that were not written to
+ expect this.
+
+ RETURN_IN_ORDER is an option available to programs that were written
+ to expect options and other ARGV-elements in any order and that care about
+ the ordering of the two. We describe each non-option ARGV-element
+ as if it were the argument of an option with character code 1.
+ Using `-' as the first character of the list of option characters
+ selects this mode of operation.
+
+ The special argument `--' forces an end of option-scanning regardless
+ of the value of `ordering'. In the case of RETURN_IN_ORDER, only
+ `--' can cause `getopt' to return EOF with `optind' != ARGC. */
+
+static enum
+{
+ REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER
+} ordering;
+\f
+#ifdef __GNU_LIBRARY__
+/* We want to avoid inclusion of string.h with non-GNU libraries
+ because there are many ways it can cause trouble.
+ On some systems, it contains special magic macros that don't work
+ in GCC. */
+#include <string.h>
+#define my_index strchr
+#define my_strlen strlen
+#else
+
+/* Avoid depending on library functions or files
+ whose names are inconsistent. */
+
+#if __STDC__ || defined(PROTO)
+extern char *getenv(const char *name);
+extern int strcmp (const char *s1, const char *s2);
+extern int strncmp(const char *s1, const char *s2, int n);
+
+static int my_strlen(const char *s);
+static char *my_index (const char *str, int chr);
+#else
+extern char *getenv ();
+#endif
+
+static int
+my_strlen (str)
+ const char *str;
+{
+ int n = 0;
+ while (*str++)
+ n++;
+ return n;
+}
+
+static char *
+my_index (str, chr)
+ const char *str;
+ int chr;
+{
+ while (*str)
+ {
+ if (*str == chr)
+ return (char *) str;
+ str++;
+ }
+ return 0;
+}
+
+#endif /* GNU C library. */
+\f
+/* Handle permutation of arguments. */
+
+/* Describe the part of ARGV that contains non-options that have
+ been skipped. `first_nonopt' is the index in ARGV of the first of them;
+ `last_nonopt' is the index after the last of them. */
+
+static int first_nonopt;
+static int last_nonopt;
+
+/* Exchange two adjacent subsequences of ARGV.
+ One subsequence is elements [first_nonopt,last_nonopt)
+ which contains all the non-options that have been skipped so far.
+ The other is elements [last_nonopt,optind), which contains all
+ the options processed since those non-options were skipped.
+
+ `first_nonopt' and `last_nonopt' are relocated so that they describe
+ the new indices of the non-options in ARGV after they are moved.
+
+ To perform the swap, we first reverse the order of all elements. So
+ all options now come before all non options, but they are in the
+ wrong order. So we put back the options and non options in original
+ order by reversing them again. For example:
+ original input: a b c -x -y
+ reverse all: -y -x c b a
+ reverse options: -x -y c b a
+ reverse non options: -x -y a b c
+*/
+
+#if __STDC__ || defined(PROTO)
+static void exchange (char **argv);
+#endif
+
+static void
+exchange (argv)
+ char **argv;
+{
+ char *temp, **first, **last;
+
+ /* Reverse all the elements [first_nonopt, optind) */
+ first = &argv[first_nonopt];
+ last = &argv[optind-1];
+ while (first < last) {
+ temp = *first; *first = *last; *last = temp; first++; last--;
+ }
+ /* Put back the options in order */
+ first = &argv[first_nonopt];
+ first_nonopt += (optind - last_nonopt);
+ last = &argv[first_nonopt - 1];
+ while (first < last) {
+ temp = *first; *first = *last; *last = temp; first++; last--;
+ }
+
+ /* Put back the non options in order */
+ first = &argv[first_nonopt];
+ last_nonopt = optind;
+ last = &argv[last_nonopt-1];
+ while (first < last) {
+ temp = *first; *first = *last; *last = temp; first++; last--;
+ }
+}
+\f
+/* Scan elements of ARGV (whose length is ARGC) for option characters
+ given in OPTSTRING.
+
+ If an element of ARGV starts with '-', and is not exactly "-" or "--",
+ then it is an option element. The characters of this element
+ (aside from the initial '-') are option characters. If `getopt'
+ is called repeatedly, it returns successively each of the option characters
+ from each of the option elements.
+
+ If `getopt' finds another option character, it returns that character,
+ updating `optind' and `nextchar' so that the next call to `getopt' can
+ resume the scan with the following option character or ARGV-element.
+
+ If there are no more option characters, `getopt' returns `EOF'.
+ Then `optind' is the index in ARGV of the first ARGV-element
+ that is not an option. (The ARGV-elements have been permuted
+ so that those that are not options now come last.)
+
+ OPTSTRING is a string containing the legitimate option characters.
+ If an option character is seen that is not listed in OPTSTRING,
+ return BAD_OPTION after printing an error message. If you set `opterr' to
+ zero, the error message is suppressed but we still return BAD_OPTION.
+
+ If a char in OPTSTRING is followed by a colon, that means it wants an arg,
+ so the following text in the same ARGV-element, or the text of the following
+ ARGV-element, is returned in `optarg'. Two colons mean an option that
+ wants an optional arg; if there is text in the current ARGV-element,
+ it is returned in `optarg', otherwise `optarg' is set to zero.
+
+ If OPTSTRING starts with `-' or `+', it requests different methods of
+ handling the non-option ARGV-elements.
+ See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above.
+
+ Long-named options begin with `--' instead of `-'.
+ Their names may be abbreviated as long as the abbreviation is unique
+ or is an exact match for some defined option. If they have an
+ argument, it follows the option name in the same ARGV-element, separated
+ from the option name by a `=', or else the in next ARGV-element.
+ When `getopt' finds a long-named option, it returns 0 if that option's
+ `flag' field is nonzero, the value of the option's `val' field
+ if the `flag' field is zero.
+
+ The elements of ARGV aren't really const, because we permute them.
+ But we pretend they're const in the prototype to be compatible
+ with other systems.
+
+ LONGOPTS is a vector of `struct option' terminated by an
+ element containing a name which is zero.
+
+ LONGIND returns the index in LONGOPT of the long-named option found.
+ It is only valid when a long-named option has been found by the most
+ recent call.
+
+ If LONG_ONLY is nonzero, '-' as well as '--' can introduce
+ long-named options. */
+
+int
+_getopt_internal (argc, argv, optstring, longopts, longind, long_only)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+ const struct option *longopts;
+ int *longind;
+ int long_only;
+{
+ int option_index;
+
+ optarg = 0;
+
+ /* Initialize the internal data when the first call is made.
+ Start processing options with ARGV-element 1 (since ARGV-element 0
+ is the program name); the sequence of previously skipped
+ non-option ARGV-elements is empty. */
+
+ if (optind == 0)
+ {
+ first_nonopt = last_nonopt = optind = 1;
+
+ nextchar = NULL;
+
+ /* Determine how to handle the ordering of options and nonoptions. */
+
+ if (optstring[0] == '-')
+ {
+ ordering = RETURN_IN_ORDER;
+ ++optstring;
+ }
+ else if (optstring[0] == '+')
+ {
+ ordering = REQUIRE_ORDER;
+ ++optstring;
+ }
+ else if (getenv ("POSIXLY_CORRECT") != NULL)
+ ordering = REQUIRE_ORDER;
+ else
+ ordering = PERMUTE;
+ }
+
+ if (nextchar == NULL || *nextchar == '\0')
+ {
+ if (ordering == PERMUTE)
+ {
+ /* If we have just processed some options following some non-options,
+ exchange them so that the options come first. */
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (last_nonopt != optind)
+ first_nonopt = optind;
+
+ /* Now skip any additional non-options
+ and extend the range of non-options previously skipped. */
+
+ while (optind < argc
+ && (argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ optind++;
+ last_nonopt = optind;
+ }
+
+ /* Special ARGV-element `--' means premature end of options.
+ Skip it like a null option,
+ then exchange with previous non-options as if it were an option,
+ then skip everything else like a non-option. */
+
+ if (optind != argc && !strcmp (argv[optind], "--"))
+ {
+ optind++;
+
+ if (first_nonopt != last_nonopt && last_nonopt != optind)
+ exchange ((char **) argv);
+ else if (first_nonopt == last_nonopt)
+ first_nonopt = optind;
+ last_nonopt = argc;
+
+ optind = argc;
+ }
+
+ /* If we have done all the ARGV-elements, stop the scan
+ and back over any non-options that we skipped and permuted. */
+
+ if (optind == argc)
+ {
+ /* Set the next-arg-index to point at the non-options
+ that we previously skipped, so the caller will digest them. */
+ if (first_nonopt != last_nonopt)
+ optind = first_nonopt;
+ return EOF;
+ }
+
+ /* If we have come to a non-option and did not permute it,
+ either stop the scan or describe it to the caller and pass it by. */
+
+ if ((argv[optind][0] != '-' || argv[optind][1] == '\0')
+#ifdef GETOPT_COMPAT
+ && (longopts == NULL
+ || argv[optind][0] != '+' || argv[optind][1] == '\0')
+#endif /* GETOPT_COMPAT */
+ )
+ {
+ if (ordering == REQUIRE_ORDER)
+ return EOF;
+ optarg = argv[optind++];
+ return 1;
+ }
+
+ /* We have found another option-ARGV-element.
+ Start decoding its characters. */
+
+ nextchar = (argv[optind] + 1
+ + (longopts != NULL && argv[optind][1] == '-'));
+ }
+
+ if (longopts != NULL
+ && ((argv[optind][0] == '-'
+ && (argv[optind][1] == '-' || long_only))
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ ))
+ {
+ const struct option *p;
+ char *s = nextchar;
+ int exact = 0;
+ int ambig = 0;
+ const struct option *pfound = NULL;
+ int indfound = 0;
+
+ while (*s && *s != '=')
+ s++;
+
+ /* Test all options for either exact match or abbreviated matches. */
+ for (p = longopts, option_index = 0; p->name;
+ p++, option_index++)
+ if (!strncmp (p->name, nextchar, s - nextchar))
+ {
+ if (s - nextchar == my_strlen (p->name))
+ {
+ /* Exact match found. */
+ pfound = p;
+ indfound = option_index;
+ exact = 1;
+ break;
+ }
+ else if (pfound == NULL)
+ {
+ /* First nonexact match found. */
+ pfound = p;
+ indfound = option_index;
+ }
+ else
+ /* Second nonexact match found. */
+ ambig = 1;
+ }
+
+ if (ambig && !exact)
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' is ambiguous\n",
+ argv[0], argv[optind]);
+ nextchar += my_strlen (nextchar);
+ optind++;
+ return BAD_OPTION;
+ }
+
+ if (pfound != NULL)
+ {
+ option_index = indfound;
+ optind++;
+ if (*s)
+ {
+ /* Don't test has_arg with >, because some C compilers don't
+ allow it to be used on enums. */
+ if (pfound->has_arg)
+ optarg = s + 1;
+ else
+ {
+ if (opterr)
+ {
+ if (argv[optind - 1][1] == '-')
+ /* --option */
+ fprintf (stderr,
+ "%s: option `--%s' doesn't allow an argument\n",
+ argv[0], pfound->name);
+ else
+ /* +option or -option */
+ fprintf (stderr,
+ "%s: option `%c%s' doesn't allow an argument\n",
+ argv[0], argv[optind - 1][0], pfound->name);
+ }
+ nextchar += my_strlen (nextchar);
+ return BAD_OPTION;
+ }
+ }
+ else if (pfound->has_arg == 1)
+ {
+ if (optind < argc)
+ optarg = argv[optind++];
+ else
+ {
+ if (opterr)
+ fprintf (stderr, "%s: option `%s' requires an argument\n",
+ argv[0], argv[optind - 1]);
+ nextchar += my_strlen (nextchar);
+ return optstring[0] == ':' ? ':' : BAD_OPTION;
+ }
+ }
+ nextchar += my_strlen (nextchar);
+ if (longind != NULL)
+ *longind = option_index;
+ if (pfound->flag)
+ {
+ *(pfound->flag) = pfound->val;
+ return 0;
+ }
+ return pfound->val;
+ }
+ /* Can't find it as a long option. If this is not getopt_long_only,
+ or the option starts with '--' or is not a valid short
+ option, then it's an error.
+ Otherwise interpret it as a short option. */
+ if (!long_only || argv[optind][1] == '-'
+#ifdef GETOPT_COMPAT
+ || argv[optind][0] == '+'
+#endif /* GETOPT_COMPAT */
+ || my_index (optstring, *nextchar) == NULL)
+ {
+ if (opterr)
+ {
+ if (argv[optind][1] == '-')
+ /* --option */
+ fprintf (stderr, "%s: unrecognized option `--%s'\n",
+ argv[0], nextchar);
+ else
+ /* +option or -option */
+ fprintf (stderr, "%s: unrecognized option `%c%s'\n",
+ argv[0], argv[optind][0], nextchar);
+ }
+ nextchar = (char *) "";
+ optind++;
+ return BAD_OPTION;
+ }
+ }
+
+ /* Look at and handle the next option-character. */
+
+ {
+ char c = *nextchar++;
+ char *temp = my_index (optstring, c);
+
+ /* Increment `optind' when we start to process its last character. */
+ if (*nextchar == '\0')
+ ++optind;
+
+ if (temp == NULL || c == ':')
+ {
+ if (opterr)
+ {
+#if 0
+ if (c < 040 || c >= 0177)
+ fprintf (stderr, "%s: unrecognized option, character code 0%o\n",
+ argv[0], c);
+ else
+ fprintf (stderr, "%s: unrecognized option `-%c'\n", argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: illegal option -- %c\n", argv[0], c);
+#endif
+ }
+ optopt = c;
+ return BAD_OPTION;
+ }
+ if (temp[1] == ':')
+ {
+ if (temp[2] == ':')
+ {
+ /* This is an option that accepts an argument optionally. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ optind++;
+ }
+ else
+ optarg = 0;
+ nextchar = NULL;
+ }
+ else
+ {
+ /* This is an option that requires an argument. */
+ if (*nextchar != '\0')
+ {
+ optarg = nextchar;
+ /* If we end this ARGV-element by taking the rest as an arg,
+ we must advance to the next element now. */
+ optind++;
+ }
+ else if (optind == argc)
+ {
+ if (opterr)
+ {
+#if 0
+ fprintf (stderr, "%s: option `-%c' requires an argument\n",
+ argv[0], c);
+#else
+ /* 1003.2 specifies the format of this message. */
+ fprintf (stderr, "%s: option requires an argument -- %c\n",
+ argv[0], c);
+#endif
+ }
+ optopt = c;
+ if (optstring[0] == ':')
+ c = ':';
+ else
+ c = BAD_OPTION;
+ }
+ else
+ /* We already incremented `optind' once;
+ increment it again when taking next ARGV-elt as argument. */
+ optarg = argv[optind++];
+ nextchar = NULL;
+ }
+ }
+ return c;
+ }
+}
+
+int
+getopt (argc, argv, optstring)
+ int argc;
+ char *const *argv;
+ const char *optstring;
+{
+ return _getopt_internal (argc, argv, optstring,
+ (const struct option *) 0,
+ (int *) 0,
+ 0);
+}
+
+int
+getopt_long (argc, argv, options, long_options, opt_index)
+ int argc;
+ char *const *argv;
+ const char *options;
+ const struct option *long_options;
+ int *opt_index;
+{
+ return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
+}
+
+#endif /* _LIBC or not __GNU_LIBRARY__. */
+\f
+#ifdef TEST
+
+/* Compile with -DTEST to make an executable for use in testing
+ the above definition of `getopt'. */
+
+int
+main (argc, argv)
+ int argc;
+ char **argv;
+{
+ int c;
+ int digit_optind = 0;
+
+ while (1)
+ {
+ int this_option_optind = optind ? optind : 1;
+
+ c = getopt (argc, argv, "abc:d:0123456789");
+ if (c == EOF)
+ break;
+
+ switch (c)
+ {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if (digit_optind != 0 && digit_optind != this_option_optind)
+ printf ("digits occur in two different argv-elements.\n");
+ digit_optind = this_option_optind;
+ printf ("option %c\n", c);
+ break;
+
+ case 'a':
+ printf ("option a\n");
+ break;
+
+ case 'b':
+ printf ("option b\n");
+ break;
+
+ case 'c':
+ printf ("option c with value `%s'\n", optarg);
+ break;
+
+ case BAD_OPTION:
+ break;
+
+ default:
+ printf ("?? getopt returned character code 0%o ??\n", c);
+ }
+ }
+
+ if (optind < argc)
+ {
+ printf ("non-option ARGV-elements: ");
+ while (optind < argc)
+ printf ("%s ", argv[optind++]);
+ printf ("\n");
+ }
+
+ exit (0);
+}
+
+#endif /* TEST */
--- /dev/null
+/* Declarations for getopt.
+ Copyright (C) 1989, 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
+
+ This program is free software; you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by the
+ Free Software Foundation; either version 2, or (at your option) any
+ later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#ifndef _GETOPT_H
+#define _GETOPT_H 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* For communication from `getopt' to the caller.
+ When `getopt' finds an option that takes an argument,
+ the argument value is returned here.
+ Also, when `ordering' is RETURN_IN_ORDER,
+ each non-option ARGV-element is returned here. */
+
+extern char *optarg;
+
+/* Index in ARGV of the next element to be scanned.
+ This is used for communication to and from the caller
+ and for communication between successive calls to `getopt'.
+
+ On entry to `getopt', zero means this is the first call; initialize.
+
+ When `getopt' returns EOF, this is the index of the first of the
+ non-option elements that the caller should itself scan.
+
+ Otherwise, `optind' communicates from one call to the next
+ how much of ARGV has been scanned so far. */
+
+extern int optind;
+
+/* Callers store zero here to inhibit the error message `getopt' prints
+ for unrecognized options. */
+
+extern int opterr;
+
+/* Set to an option character which was unrecognized. */
+
+extern int optopt;
+
+/* Describe the long-named options requested by the application.
+ The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
+ of `struct option' terminated by an element containing a name which is
+ zero.
+
+ The field `has_arg' is:
+ no_argument (or 0) if the option does not take an argument,
+ required_argument (or 1) if the option requires an argument,
+ optional_argument (or 2) if the option takes an optional argument.
+
+ If the field `flag' is not NULL, it points to a variable that is set
+ to the value given in the field `val' when the option is found, but
+ left unchanged if the option is not found.
+
+ To have a long-named option do something other than set an `int' to
+ a compiled-in constant, such as set a value from `optarg', set the
+ option's `flag' field to zero and its `val' field to a nonzero
+ value (the equivalent single-letter option character, if there is
+ one). For long options that have a zero `flag' field, `getopt'
+ returns the contents of the `val' field. */
+
+struct option
+{
+#if __STDC__
+ const char *name;
+#else
+ char *name;
+#endif
+ /* has_arg can't be an enum because some compilers complain about
+ type mismatches in all the code that assumes it is an int. */
+ int has_arg;
+ int *flag;
+ int val;
+};
+
+/* Names for the values of the `has_arg' field of `struct option'. */
+
+#define no_argument 0
+#define required_argument 1
+#define optional_argument 2
+
+#if __STDC__ || defined(PROTO)
+#if defined(__GNU_LIBRARY__)
+/* Many other libraries have conflicting prototypes for getopt, with
+ differences in the consts, in stdlib.h. To avoid compilation
+ errors, only prototype getopt for the GNU C library. */
+extern int getopt (int argc, char *const *argv, const char *shortopts);
+#endif /* not __GNU_LIBRARY__ */
+extern int getopt_long (int argc, char *const *argv, const char *shortopts,
+ const struct option *longopts, int *longind);
+extern int getopt_long_only (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind);
+
+/* Internal only. Users should not call this directly. */
+extern int _getopt_internal (int argc, char *const *argv,
+ const char *shortopts,
+ const struct option *longopts, int *longind,
+ int long_only);
+#else /* not __STDC__ */
+extern int getopt ();
+extern int getopt_long ();
+extern int getopt_long_only ();
+
+extern int _getopt_internal ();
+#endif /* not __STDC__ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _GETOPT_H */
--- /dev/null
+%define name gnokii
+%define version 0.4.0pre3
+%define release 1
+
+Summary: Linux/Unix tool suite for Nokia mobile phones
+Name: %{name}
+Version: %{version}
+Release: %{release}
+Copyright: GPL
+Packager: Pavel Janik ml. <Pavel.Janik@linux.cz>, Jan Derfinak <ja@mail.upjs.sk>
+Group: Applications/Communications
+Source: ftp://ftp.gnokii.org/pub/gnokii/%{name}-%{version}.tar.gz
+BuildRoot: /var/tmp/%{name}-%{version}-root
+
+%description
+Gnokii is a Linux/Unix tool suite and (eventually) modem/fax driver for
+Nokia's mobile phones, released under the GPL.
+
+%package xgnokii
+Summary: Graphical Linux/Unix tool suite for Nokia mobile phones.
+Group: X11/Applications
+%description xgnokii
+Xgnokii is graphical Linux/Unix tool suite for Nokia's mobile phones. It
+allows you to edit your contacts book, send/read SMS's from/in
+computer and more other features.
+
+%prep
+
+%setup -q
+
+%build
+./configure --prefix=/usr --with-x --enable-nls #--enable-debug --enable-rlpdebug
+make
+
+%install
+rm -rf ${RPM_BUILD_ROOT}
+
+make prefix=${RPM_BUILD_ROOT}/usr install
+
+mkdir -p ${RPM_BUILD_ROOT}/etc/
+
+sed 's#/usr/local/sbin/#/usr/sbin/#' <Docs/sample/gnokiirc >${RPM_BUILD_ROOT}/etc/gnokiirc
+
+%pre
+/usr/sbin/groupadd -r -f gnokii >/dev/null 2>&1
+
+%postun
+/usr/sbin/groupdel gnokii >/dev/null 2>&1
+
+%clean
+rm -rf ${RPM_BUILD_ROOT}
+
+%files
+%defattr(-,root,root)
+%doc Docs/CREDITS Docs/DataCalls-QuickStart Docs/FAQ Docs/README
+%doc Docs/README-3810 Docs/README-6110 Docs/README-2110 Docs/README-WIN32
+%doc Docs/gettext-howto Docs/gnokii.nol Docs/gnokii-ir-howto Docs/packaging-howto
+%doc Docs/README-dancall Docs/logos.txt Docs/gnokii.xpm Docs/Bugs
+%doc Docs/sample/gnokiirc Docs/sample/options Docs/sample/pap-secrets
+%doc Docs/sample/ppp-gnokii Docs/sample/ppp-on
+%doc Docs/protocol/nk2110.txt Docs/protocol/nk3110.txt Docs/protocol/nk6110.txt Docs/protocol/nk6160.txt
+%doc Docs/protocol/nk6185.txt Docs/protocol/nk640.txt Docs/protocol/nk7110.txt Docs/protocol/nokia.txt
+%attr(0750, root, gnokii) /usr/bin/gnokii
+%attr(0750, root, gnokii) /usr/sbin/gnokiid
+%attr(4750, root, gnokii) /usr/sbin/mgnokiidev
+%config /etc/gnokiirc
+
+%files xgnokii
+%defattr(-,root,root)
+/usr/X11R6/bin/xgnokii
+/usr/bin/todologo
+/usr/share/xgnokii
+
+%changelog
+
+* Fri Sep 28 2001 Pawel Kot <pkot@linuxnews.pl>
+- last minute fixes.
+
+* Thu Sep 27 2001 Pawel Kot <pkot@linuxnews.pl>
+- updates to 0.3.3 version - new docs, new ftp server
+
+* Sun Sep 2 2001 Pawel Kot <pkot@linuxnews.pl>
+- removes xlogos
+
+* Thu Jan 11 2001 Pawel Kot <pkot@linuxnews.pl>
+- misc updates
+
+* Fri Oct 27 2000 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- todologo added to the package
+
+* Mon May 15 2000 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- proper access rights for gnokiid, gnokii and mgnokiidev
+
+* Sat May 13 2000 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- new doc files added
+
+* Tue Mar 21 2000 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- permission on /usr/sbin fixed
+- correct /etc/gnokiirc file
+
+* Mon Mar 20 2000 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- mkdir of directories in install removed
+- xgnokii package should contain lib/xgnokii directory
+
+* Mon Mar 20 2000 Jan Derfinak <ja@mail.upjs.sk>
+- split package into gnokii and xgnokii
+- added configure
+- correct xgnokii installation
+- installation with make install
+- fixing paths
+
+* Thu Aug 5 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- documentation files changed
+
+* Thu Aug 5 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- xkeyb and xlogos added to RPM package
+
+* Sat Jul 24 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- stripping of binaries
+
+* Thu Jul 22 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- gnokii.nol added - nice example for logo uploading
+
+* Sun Jul 18 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- mgnokiidev added to RPM package
+- config file in /etc (it is not used now...)
+
+* Sat Jul 10 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- use of ~/.gnokiirc so not magic model stuff
+- new doc files
+
+* Mon Jun 28 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- Nokia auth. protocol is there now
+- xgnokii and gnokiid added to RPM
+
+* Sun May 9 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- included 6110-patch updated to my prepatches
+
+* Thu May 6 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- TODO-6110 file added to documentation files
+
+* Sun Mar 28 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- upgraded to gnokii-0.2.4
+- 6110 version of gnokii added
+
+* Fri Mar 5 1999 Pavel Janik ml. <Pavel.Janik@linux.cz>
+- the first SPEC file for gnokii
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for test utility.
+
+*/
+
+/* Prototypes */
+
+int monitormode(int argc, char *argv[]);
+
+#ifdef SECURITY
+ int entersecuritycode(char *type);
+ int getsecuritycodestatus(void);
+ int getsecuritycode(char *type);
+#endif
+
+#ifdef DEBUG
+ int sniff(int nargc, char *nargv[]);
+ int decodefile(int nargc, char *nargv[]);
+ int getbinringfromfile(int nargc, char *nargv[]);
+#endif
+
+int getmemory(int argc, char *argv[]);
+int writephonebook(int argc, char *argv[]);
+int getspeeddial(char *number);
+int setspeeddial(char *argv[]);
+int getsms(int argc, char *argv[]);
+int renamesmsc(int argc, char *argv[]);
+int deletesms(int argc, char *argv[]);
+int sendsms(int argc, char *argv[]);
+int savesms(int argc, char *argv[]);
+int sendlogo(int argc, char *argv[]);
+int savelogo(int argc, char *argv[]);
+int sendringtone(int argc, char *argv[]);
+int saveringtone(int argc, char *argv[]);
+int getsmsc(char *mcn);
+int setdatetime(int argc, char *argv[]);
+int getdatetime(void);
+int setalarm(char *argv[]);
+int getalarm(void);
+int dialvoice(char *number);
+int cancelcall(void);
+int getcalendarnote(int argc, char *argv[]);
+int writecalendarnote(char *argv[]);
+int deletecalendarnote(char *index);
+int getdisplaystatus();
+int netmonitor(char *_mode);
+int identify(void);
+int senddtmf(char *String);
+int foogle(char *argv[]);
+int pmon(void);
+int setlogo(int argc, char *argv[]);
+int getlogo(int argc, char *argv[]);
+int binringtoneconvert(int argc, char *argv[]);
+int setringtone(int argc, char *argv[]);
+int getringtone(int argc, char *argv[]);
+int reset(int argc, char *argv[]);
+int getprofile(int argc, char *argv[]);
+int setprofile(int argc, char *argv[]);
+int allringtones();
+int displayoutput();
+int presskeysequence(char *argv[]);
+int restoresettings(char *argv[]);
+int backupsettings(char *argv[]);
+int playringtone(int argc, char *argv[]);
+int ringtoneconvert(int argc, char *argv[]);
+int bitmapconvert(int argc, char *argv[]);
+int composer(int argc, char *argv[]);
+int getphoneprofile();
+int setphoneprofile(int argc, char *argv[]);
+int getoperatorname();
+int setoperatorname(int argc, char *argv[]);
+int getvoicemailbox();
+int phonetests();
+int simlockinfo();
+int geteeprom ();
+int setsimlock ();
+int getsmsfolders ();
+int resetphonesettings ();
+int sendprofile(int argc, char *argv[]);
+int showbitmap(int argc, char *argv[]);
+int nm_collect(int argc, char *argv[]);
+int netmonitordata(int argc, char *argv[]);
+int getwapbookmark(int argc, char *argv[]);
+int setwapbookmark(int argc, char *argv[]);
+int savewapbookmark(int argc, char *argv[]);
+int sendwapbookmark(int argc, char *argv[]);
+int getwapsettings(int argc, char *argv[]);
+int savewapsettings(int argc, char *argv[]);
+int sendwapsettings(int argc, char *argv[]);
+int savecalendarnote(int argc, char *argv[]);
+int sendcalendarnote(int argc, char *argv[]);
+int receivesms(int argc, char *argv[]);
+int getsmsstatus(int argc, char *argv[]);
+int divert(int argc, char *argv[]);
+int savephonebookentry(int argc, char *argv[]);
+int sendphonebookentry(int argc, char *argv[]);
+
+typedef enum {
+ OPT_HELP,
+ OPT_VERSION,
+ OPT_MONITOR,
+ OPT_ENTERSECURITYCODE,
+ OPT_GETSECURITYCODESTATUS,
+ OPT_GETSECURITYCODE,
+ OPT_SETDATETIME,
+ OPT_GETDATETIME,
+ OPT_SETALARM,
+ OPT_GETALARM,
+ OPT_DIALVOICE,
+ OPT_CANCELCALL,
+ OPT_GETCALENDARNOTE,
+ OPT_WRITECALENDARNOTE,
+ OPT_DELCALENDARNOTE,
+ OPT_GETDISPLAYSTATUS,
+ OPT_GETMEMORY,
+ OPT_WRITEPHONEBOOK,
+ OPT_GETSPEEDDIAL,
+ OPT_SETSPEEDDIAL,
+ OPT_GETSMS,
+ OPT_DELETESMS,
+ OPT_SENDSMS,
+ OPT_SAVESMS,
+ OPT_GETSMSC,
+ OPT_RENAMESMSC,
+ OPT_PMON,
+ OPT_NETMONITOR,
+ OPT_NM_COLLECT,
+ OPT_NETMONITORDATA,
+ OPT_IDENTIFY,
+ OPT_SENDDTMF,
+ OPT_RESET,
+ OPT_SETLOGO,
+ OPT_GETLOGO,
+ OPT_SENDLOGO,
+ OPT_SAVELOGO,
+ OPT_BITMAPCONVERT,
+ OPT_SENDRINGTONE,
+ OPT_SAVERINGTONE,
+ OPT_SETRINGTONE,
+ OPT_PLAYRINGTONE,
+ OPT_RINGTONECONVERT,
+ OPT_COMPOSER,
+ OPT_ALLRINGTONES,
+ OPT_GETRINGTONE,
+ OPT_SNIFFER,
+ OPT_GETPROFILE,
+ OPT_SETPROFILE,
+ OPT_DISPLAYOUTPUT,
+ OPT_PRESSKEYSEQUENCE,
+ OPT_RESTORESETTINGS,
+ OPT_BACKUPSETTINGS,
+ OPT_GETPHONEPROFILE,
+ OPT_SETPHONEPROFILE,
+ OPT_GETOPERATORNAME,
+ OPT_SETOPERATORNAME,
+ OPT_GETVOICEMAILBOX,
+ OPT_PHONETESTS,
+ OPT_FOOGLE,
+ OPT_SIMLOCKINFO,
+ OPT_SETSIMLOCK,
+ OPT_GETEEPROM=128,
+ OPT_GETSMSFOLDERS=129,
+ OPT_RESETPHONESETTINGS=130,
+ OPT_SENDPROFILE=131,
+ OPT_SHOWBITMAP=132,
+ OPT_BINRINGTONECONVERT=133,
+ OPT_GETWAPBOOKMARK=134,
+ OPT_SAVEWAPBOOKMARK=135,
+ OPT_SENDWAPBOOKMARK=136,
+ OPT_GETWAPSETTINGS=137,
+ OPT_SAVEWAPSETTINGS=138,
+ OPT_SAVECALENDARNOTE=139,
+ OPT_SENDCALENDARNOTE=140,
+ OPT_SAVEPHONEBOOKENTRY=141,
+ OPT_SENDPHONEBOOKENTRY=142,
+ OPT_DECODEFILE=143,
+ OPT_RECEIVESMS=144,
+ OPT_GETSMSSTATUS=145,
+ OPT_DIVERT=146,
+ OPT_SENDWAPSETTINGS=147,
+ OPT_SETWAPBOOKMARK=148,
+ OPT_GETBINRINGFROMFILE=149
+} opt_index;
+
+struct gnokii_arg_len {
+ int gal_opt;
+ int gal_min;
+ int gal_max;
+ int gal_flags;
+};
+
+/* This is used for checking correct argument count. If it is used then if
+ the user specifies some argument, their count should be equivalent to the
+ count the programmer expects. */
+
+#define GAL_XOR 0x01
+
+/* for --presskeysequence */
+struct keys_table_position {
+ char whatchar;
+ int whatcode;
+};
+
+/* for --presskeysequence */
+struct keys_table_position Keys[] = {
+{'m',PHONEKEY_MENU},
+{'M',PHONEKEY_MENU},
+{'n',PHONEKEY_NAMES},
+{'N',PHONEKEY_NAMES},
+{'p',PHONEKEY_POWER},
+{'P',PHONEKEY_POWER},
+{'u',PHONEKEY_UP},
+{'U',PHONEKEY_UP},
+{'d',PHONEKEY_DOWN},
+{'D',PHONEKEY_DOWN},
+{'+',PHONEKEY_INCREASEVOLUME},
+{'-',PHONEKEY_DECREASEVOLUME},
+{'1',PHONEKEY_1},
+{'2',PHONEKEY_2},
+{'3',PHONEKEY_3},
+{'4',PHONEKEY_4},
+{'5',PHONEKEY_5},
+{'6',PHONEKEY_6},
+{'7',PHONEKEY_7},
+{'8',PHONEKEY_8},
+{'9',PHONEKEY_9},
+{'*',PHONEKEY_ASTERISK},
+{'0',PHONEKEY_0},
+{'#',PHONEKEY_HASH},
+{'g',PHONEKEY_GREEN},
+{'G',PHONEKEY_GREEN},
+{'r',PHONEKEY_RED},
+{'R',PHONEKEY_RED},
+{' ',0}
+};
+
+/* for NETMONITOR */
+
+//maximal number of screens for --nm_collect
+#define MAX_NM_COLLECT 20
+
+/* 255 used internally by functions */
+#define NM_MAX_SCREEN 254
+
+/* in 6150 v4.13 effectively used was 296 FIELDS + date + time ... */
+#define NM_MAX_FIELDS 512
+
+typedef struct {
+ char *name;
+ int x;
+ int y;
+ int len;
+ char *mname;
+ int s_nr;
+ char type;
+ char value[NM_MAX_SCREEN_WIDTH];
+ void *next;
+} PARAM_INFO_MON;
+
+// info for make ouput, filled in by parse_process()
+typedef struct {
+ int req_header;
+ unsigned long req_wait;
+ int req_n;
+ char req_fs[11];
+ char req_ls[11];
+ PARAM_INFO_MON *data[NM_MAX_FIELDS];
+ char out_f[NM_MAX_FIELDS];
+ unsigned char req_screen[NM_MAX_SCREEN];
+} OUT_INFO_MON;
+
+int semicolon_pipe_substitution( GSM_PhonebookEntry *pentry, unsigned int direction );
+int str_substch( char *str, const char toric, const char sost );
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file device access code.
+
+*/
+
+#ifndef __device_h
+#define __device_h
+
+#include "misc.h"
+
+/* Maximum length of device name for serial port */
+#define GSM_MAX_DEVICE_NAME_LENGTH (100)
+
+/* Type of connection. Now we support serial connection with FBUS cable and
+ IR (only with 61x0 models) and MBUS (61x0, 640, 6160) */
+typedef enum {
+ GCT_FBUS, /* FBUS connection. */
+ GCT_Infrared, /* FBUS over direct infrared connection - 61xx. */
+ GCT_Irda, /* FBUS over Irda sockets - 7110, 6210, etc. */
+ GCT_MBUS, /* MBUS */
+ GCT_DLR3, /* FBUS over DLR3 cable */
+ GCT_Tekram, /* FBUS over direct infrared connection (Tekram device) - 61xx. */
+ GCT_AT, /* AT commands */
+ GCT_Default /* Old style module */
+} GSM_ConnectionType;
+
+#ifndef WIN32
+ #include <unistd.h>
+ #include "misc.h"
+
+ int device_getfd(void);
+
+ int device_open(__const char *__file, int __with_odd_parity);
+ void device_reset(void);
+
+ size_t device_read(__ptr_t __buf, size_t __nbytes);
+ size_t device_write(__const __ptr_t __buf, size_t __n);
+
+ #ifdef DEBUG
+ void device_dumpserial(void);
+ #endif
+#else
+ size_t device_write(const __ptr_t __buf, size_t __n);
+#endif
+
+ void device_close(void);
+
+ void device_setdtrrts(int __dtr, int __rts);
+ void device_changespeed(int __speed);
+
+
+extern char PortDevice[GSM_MAX_DEVICE_NAME_LENGTH];
+
+bool StartConnection (char *port_device, bool with_odd_parity, GSM_ConnectionType con);
+
+#endif /* __device_h */
--- /dev/null
+/*********************************************************************
+ *
+ * Filename: irda.h
+ * Version: 1.0
+ * Description: IrDA header file to be used by IrDA applications
+ * Status: Experimental.
+ * Author: Dag Brattli <dagb@cs.uit.no>
+ * Created at: Mon Mar 8 14:06:12 1999
+ * Modified at: Sat Dec 25 16:07:54 1999
+ * Modified by: Dag Brattli <dagb@cs.uit.no>
+ *
+ * Copyright (c) 1999 Dag Brattli, All Rights Reserved.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * Neither Dag Brattli nor University of Tromsø admit liability nor
+ * provide warranty for any of this software. This material is
+ * provided "AS-IS" and at no charge.
+ *
+ ********************************************************************/
+
+/*
+ * $Id$
+ *
+ */
+
+#ifndef IRDA_H
+#define IRDA_H
+
+#include <sys/types.h>
+#include <inttypes.h>
+
+/* Hint bit positions for first hint byte */
+#define HINT_PNP 0x01
+#define HINT_PDA 0x02
+#define HINT_COMPUTER 0x04
+#define HINT_PRINTER 0x08
+#define HINT_MODEM 0x10
+#define HINT_FAX 0x20
+#define HINT_LAN 0x40
+#define HINT_EXTENSION 0x80
+
+/* Hint bit positions for second hint byte (first extension byte) */
+#define HINT_TELEPHONY 0x01
+#define HINT_FILE_SERVER 0x02
+#define HINT_COMM 0x04
+#define HINT_MESSAGE 0x08
+#define HINT_HTTP 0x10
+#define HINT_OBEX 0x20
+
+/* IrLMP character code values */
+#define CS_ASCII 0x00
+#define CS_ISO_8859_1 0x01
+#define CS_ISO_8859_2 0x02
+#define CS_ISO_8859_3 0x03
+#define CS_ISO_8859_4 0x04
+#define CS_ISO_8859_5 0x05
+#define CS_ISO_8859_6 0x06
+#define CS_ISO_8859_7 0x07
+#define CS_ISO_8859_8 0x08
+#define CS_ISO_8859_9 0x09
+#define CS_UNICODE 0xff
+
+/* These are the currently known dongles */
+typedef enum {
+ IRDA_TEKRAM_DONGLE = 0,
+ IRDA_ESI_DONGLE = 1,
+ IRDA_ACTISYS_DONGLE = 2,
+ IRDA_ACTISYS_PLUS_DONGLE = 3,
+ IRDA_GIRBIL_DONGLE = 4,
+ IRDA_LITELINK_DONGLE = 5,
+ IRDA_AIRPORT_DONGLE = 6,
+ IRDA_OLD_BELKIN_DONGLE = 7,
+} IRDA_DONGLE;
+
+/* Protocol types to be used for SOCK_DGRAM */
+enum {
+ IRDAPROTO_UNITDATA = 0,
+ IRDAPROTO_ULTRA = 1,
+ IRDAPROTO_MAX
+};
+
+#define SOL_IRLMP 266 /* Same as SOL_IRDA for now */
+#define SOL_IRTTP 266 /* Same as SOL_IRDA for now */
+
+#define IRLMP_ENUMDEVICES 1
+#define IRLMP_IAS_SET 2
+#define IRLMP_IAS_QUERY 3
+#define IRLMP_HINTS_SET 4
+#define IRLMP_QOS_SET 5
+#define IRLMP_QOS_GET 6
+#define IRLMP_MAX_SDU_SIZE 7
+#define IRLMP_IAS_GET 8
+
+#define IRTTP_MAX_SDU_SIZE IRLMP_MAX_SDU_SIZE /* Compatibility */
+
+/* LM-IAS Limits */
+#define IAS_MAX_STRING 256
+#define IAS_MAX_OCTET_STRING 1024
+#define IAS_MAX_CLASSNAME 64
+#define IAS_MAX_ATTRIBNAME 256
+
+/* LM-IAS Attribute types */
+#define IAS_MISSING 0
+#define IAS_INTEGER 1
+#define IAS_OCT_SEQ 2
+#define IAS_STRING 3
+
+#define LSAP_ANY 0xff
+#define DEV_ADDR_ANY 0xffffffff
+
+struct sockaddr_irda {
+ sa_family_t sir_family; /* AF_IRDA */
+ uint8_t sir_lsap_sel; /* LSAP selector */
+ uint32_t sir_addr; /* Device address */
+ char sir_name[25]; /* Usually <service>:IrDA:TinyTP */
+};
+
+struct irda_device_info {
+ uint32_t saddr; /* Address of local interface */
+ uint32_t daddr; /* Address of remote device */
+ char info[22]; /* Description */
+ uint8_t charset; /* Charset used for description */
+ uint8_t hints[2]; /* Hint bits */
+};
+
+struct irda_device_list {
+ uint32_t len;
+ struct irda_device_info dev[1];
+};
+
+struct irda_ias_set {
+ char irda_class_name[IAS_MAX_CLASSNAME];
+ char irda_attrib_name[IAS_MAX_ATTRIBNAME];
+ unsigned int irda_attrib_type;
+ union {
+ unsigned int irda_attrib_int;
+ struct {
+ unsigned short len;
+ u_char octet_seq[IAS_MAX_OCTET_STRING];
+ } irda_attrib_octet_seq;
+ struct {
+ unsigned char len;
+ unsigned char charset;
+ unsigned char string[IAS_MAX_STRING];
+ } irda_attrib_string;
+ } attribute;
+ uint32_t daddr;
+
+};
+
+/* Some private IOCTL's (max 16) */
+#define SIOCSDONGLE (SIOCDEVPRIVATE + 0)
+#define SIOCGDONGLE (SIOCDEVPRIVATE + 1)
+#define SIOCSBANDWIDTH (SIOCDEVPRIVATE + 2)
+#define SIOCSMEDIABUSY (SIOCDEVPRIVATE + 3)
+#define SIOCGMEDIABUSY (SIOCDEVPRIVATE + 4)
+#define SIOCGRECEIVING (SIOCDEVPRIVATE + 5)
+#define SIOCSMODE (SIOCDEVPRIVATE + 6)
+#define SIOCGMODE (SIOCDEVPRIVATE + 7)
+#define SIOCSDTRRTS (SIOCDEVPRIVATE + 8)
+#define SIOCGQOS (SIOCDEVPRIVATE + 9)
+
+/* No reason to include <linux/if.h> just because of this one ;-) */
+#define IRNAMSIZ 16
+
+/* IrDA quality of service information (must not exceed 16 bytes) */
+struct if_irda_qos {
+ uint32_t baudrate;
+ uint16_t data_size;
+ uint16_t window_size;
+ uint16_t min_turn_time;
+ uint16_t max_turn_time;
+ uint8_t add_bofs;
+ uint8_t link_disc;
+};
+
+/* For setting RTS and DTR lines of a dongle */
+struct if_irda_line {
+ unsigned char dtr;
+ unsigned char rts;
+};
+
+/* IrDA interface configuration (data part must not exceed 16 bytes) */
+struct if_irda_req {
+ union {
+ char ifrn_name[IRNAMSIZ]; /* if name, e.g. "irda0" */
+ } ifr_ifrn;
+
+ /* Data part */
+ union {
+ struct if_irda_line ifru_line;
+ struct if_irda_qos ifru_qos;
+ unsigned short ifru_flags;
+ unsigned int ifru_receiving;
+ unsigned int ifru_mode;
+ unsigned int ifru_dongle;
+ } ifr_ifru;
+};
+
+#define ifr_baudrate ifr_ifru.ifru_qos.baudrate
+#define ifr_receiving ifr_ifru.ifru_receiving
+#define ifr_dongle ifr_ifru.ifru_dongle
+#define ifr_mode ifr_ifru.ifru_mode
+#define ifr_dtr ifr_ifru.ifru_line.dtr
+#define ifr_rts ifr_ifru.ifru_line.rts
+
+#endif /* IRDA_H */
--- /dev/null
+typedef void (*sigcallback)(char);
+typedef void (*keepalive)();
+
+int OpenConnection(char *szPort, sigcallback fn, keepalive ka);
+int CloseConnection();
+int WriteCommBlock(LPSTR lpByte, DWORD dwBytesToWrite);
+
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for config file reader.
+
+*/
+
+#ifndef _CFGREADER_H
+#define _CFGREADER_H
+
+#ifndef WIN32
+ #include "config.h"
+#endif
+
+/* Structure definitions */
+
+/* A linked list of key/value pairs */
+
+struct CFG_Entry {
+ struct CFG_Entry *next, *prev;
+ char *key;
+ char *value;
+};
+
+struct CFG_Header {
+ struct CFG_Header *next, *prev;
+ struct CFG_Entry *entries;
+ char *section;
+};
+
+/* Function prototypes */
+
+struct CFG_Header *CFG_ReadFile(char *filename);
+char *CFG_Get(struct CFG_Header *cfg, char *section, char *key);
+char *CFG_Set(struct CFG_Header *cfg, char *section, char *key,
+ char *value);
+int CFG_WriteFile(struct CFG_Header *cfg, char *filename);
+
+int CFG_ReadConfig(char **model, char **port, char **initlength,
+ char **connection, char **bindir, char **synchronizetime,
+ bool isgnokiid);
+
+struct CFG_Header *CFG_FindGnokiirc();
+
+#endif /* _CFGREADER_H */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Functions to read and write common file types.
+
+*/
+
+#include "gsm-api.h"
+#include "gsm-calendar.h"
+#include "gsm-ringtones.h"
+#include "gsm-bitmaps.h"
+
+/* ---------- Calendar file --------- */
+
+GSM_Error GSM_ReadVCalendarFile(char *FileName, GSM_CalendarNote *cnote,
+ int *number);
+
+int GetvCalTime(GSM_DateTime *dt, char *time);
+int FillCalendarNote(GSM_CalendarNote *note, char *type,
+ char *text, char *time, char *alarm);
+
+/* ----------- Text files ----------- */
+
+int GSM_SaveTextFile(char *FileName, char *text, int mode);
+
+/* ----------- Ringtones functions and constans ----------- */
+
+int GetScale (char *num);
+int GetDuration (char *num);
+
+/* Defines the character that separates fields in rtttl files. */
+#define RTTTL_SEP ":"
+
+/* ----------- Ringtones files ----------- */
+
+GSM_Error GSM_ReadBinRingtoneFile(char *FileName, GSM_BinRingtone *ringtone);
+GSM_Error GSM_SaveBinRingtoneFile(char *FileName, GSM_BinRingtone *ringtone);
+
+GSM_Error GSM_ReadRingtoneFile(char *FileName, GSM_Ringtone *ringtone);
+GSM_Error GSM_SaveRingtoneFile(char *FileName, GSM_Ringtone *ringtone);
+
+void saverttl(FILE *file, GSM_Ringtone *ringtone);
+void saveott(FILE *file, GSM_Ringtone *ringtone);
+void savemid(FILE* file, GSM_Ringtone *ringtone);
+
+GSM_Error loadrttl(FILE *file, GSM_Ringtone *ringtone);
+GSM_Error loadott(FILE *file, GSM_Ringtone *ringtone);
+GSM_Error loadcommunicator(FILE *file, GSM_Ringtone *ringtone);
+
+/* ----------- Bitmap files ----------- */
+
+GSM_Error GSM_ReadBitmapFile(char *FileName, GSM_Bitmap *bitmap);
+GSM_Error GSM_SaveBitmapFile(char *FileName, GSM_Bitmap *bitmap);
+
+void savenol(FILE *file, GSM_Bitmap *bitmap);
+void savengg(FILE *file, GSM_Bitmap *bitmap);
+void savensl(FILE *file, GSM_Bitmap *bitmap);
+void savenlm(FILE *file, GSM_Bitmap *bitmap);
+void saveota(FILE *file, GSM_Bitmap *bitmap);
+void savebmp(FILE *file, GSM_Bitmap *bitmap);
+void savexpm(FILE *file, GSM_Bitmap *bitmap);
+
+GSM_Error loadngg(FILE *file, GSM_Bitmap *bitmap);
+GSM_Error loadnol(FILE *file, GSM_Bitmap *bitmap);
+GSM_Error loadnsl(FILE *file, GSM_Bitmap *bitmap);
+GSM_Error loadnlm(FILE *file, GSM_Bitmap *bitmap);
+GSM_Error loadota(FILE *file, GSM_Bitmap *bitmap);
+GSM_Error loadbmp(FILE *file, GSM_Bitmap *bitmap);
+
+#ifdef XPM
+ GSM_Error loadxpm(char *filename, GSM_Bitmap *bitmap);
+#endif
+
+/* ----------- Backup files ----------- */
+
+GSM_Error GSM_ReadBackupFile(char *FileName, GSM_Backup *backup);
+GSM_Error GSM_SaveBackupFile(char *FileName, GSM_Backup *backup);
+
+void savelmb(FILE *file, GSM_Backup *backup);
+
+GSM_Error loadlmb(FILE *file, GSM_Backup *backup);
+
+typedef enum {
+ None=0,
+ NOL,
+ NGG,
+ NSL,
+ NLM,
+ BMP,
+ OTA,
+ XPMF,
+ RTTL,
+ OTT,
+ MIDI,
+ COMMUNICATOR,
+ LMB
+} GSM_Filetypes;
--- /dev/null
+GSM_Error loadmid(char *filename, GSM_Ringtone *ringtone);
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#ifndef __gsm_calendar_h
+#define __gsm_calendar_h
+
+#include "gsm-datetime.h"
+#include "gsm-sms.h"
+
+/* Define enums for Calendar Note types */
+typedef enum {
+ GCN_REMINDER=1, /* Reminder */
+ GCN_CALL, /* Call */
+ GCN_MEETING, /* Meeting */
+ GCN_BIRTHDAY /* Birthday */
+} GSM_CalendarNoteType;
+
+#define MAX_CALENDAR_TEXT_LENGTH 0x3a /* In 6210 max. 48 chars. 10 more precaution bytes*/
+#define MAX_CALENDAR_PHONE_LENGTH 0x24
+
+/* Calendar note type */
+
+typedef struct {
+ int Location; /* The number of the note in the phone memory */
+ GSM_CalendarNoteType Type; /* The type of the note */
+ GSM_DateTime Time; /* The time of the note */
+ GSM_DateTime Alarm; /* The alarm of the note */
+ char Text[MAX_CALENDAR_TEXT_LENGTH+1]; /* The text of the note */
+ char Phone[MAX_CALENDAR_PHONE_LENGTH+1]; /* For Call only: the phone number */
+
+ /* the following are only used for N7110/N6210 */
+ int Recurrance; /* after how many hours note repeats. 0x0000 = No Repeat */
+ int YearOfBirth; /* Only in GCN_BIRTHDAY for 62/71 - The Year of birth of recurrance */
+ u8 AlarmType; /* Only in GCN_BIRTHDAY for 62/71 - 0x00 = Tone, 0x01 = Silent */
+
+ bool ReadNotesInfo; /* Important in 6210/7110 - if we should read notes info or not */
+} GSM_CalendarNote;
+
+/* NotesInfo type : Nowadays only N6210/7110 */
+#define MAX_NOTES_INFO_ELEMS 1024
+
+typedef struct {
+ u16 HowMany; /* How many notes info used */
+ u16 Location[MAX_NOTES_INFO_ELEMS]; /* In N6210/7110 adresses for notes */
+} GSM_NotesInfo;
+
+char *GSM_GetVCALENDARStart(int version);
+char *GSM_GetVCALENDARNote(GSM_CalendarNote *note, int version);
+char *GSM_GetVCALENDAREnd(int version);
+
+int GSM_SaveCalendarNoteToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_CalendarNote *note);
+
+#endif /* __gsm_calendar_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#ifndef __gsm_coding_h
+#define __gsm_coding_h
+
+extern void EncodeDefault (unsigned char* dest, const unsigned char* src, int len);
+extern void DecodeDefault (unsigned char* dest, const unsigned char* src, int len);
+extern void EncodeUnicode (unsigned char* dest, const unsigned char* src, int len);
+extern void DecodeUnicode (unsigned char* dest, const unsigned char* src, int len);
+extern void EncodeUTF8 (unsigned char* dest, const unsigned char* src, int len);
+extern void DecodeUTF8 (unsigned char* dest, const unsigned char* src, int len);
+extern void DecodeHexBin (unsigned char* dest, const unsigned char* src, int len);
+extern void EncodeHexBin (unsigned char* dest, const unsigned char* src, int len);
+extern void DecodeBCD (unsigned char* dest, const unsigned char* src, int len);
+extern void EncodeBCD (unsigned char* dest, const unsigned char* src, int len, bool fill);
+
+extern unsigned char EncodeWithDefaultAlphabet(unsigned char);
+extern unsigned char DecodeWithDefaultAlphabet(unsigned char);
+extern wchar_t EncodeWithUnicodeAlphabet(unsigned char);
+extern unsigned char DecodeWithUnicodeAlphabet(wchar_t);
+extern void DecodeWithUTF8Alphabet (u8 mychar3, u8 mychar4, u8 *ret);
+extern bool EncodeWithUTF8Alphabet (u8 mychar, u8 *ret1, u8 *ret2);
+extern int DecodeWithHexBinAlphabet (unsigned char mychar);
+extern unsigned char EncodeWithHexBinAlphabet (int digit);
+extern unsigned char EncodeWithBCDAlphabet (int value);
+extern int DecodeWithBCDAlphabet (unsigned char value);
+
+#endif
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#ifndef __gsm_datetime_h
+#define __gsm_datetime_h
+
+/* Define enum used to describe what sort of date/time support is
+ available. */
+typedef enum {
+ GDT_None, /* The mobile phone doesn't support time and date. */
+ GDT_TimeOnly, /* The mobile phone supports only time. */
+ GDT_DateOnly, /* The mobile phone supports only date. */
+ GDT_DateTime /* Wonderful phone - it supports date and time. */
+} GSM_DateTimeSupport;
+
+/* Structure used for passing dates/times to date/time functions such as
+ GSM_GetTime and GSM_GetAlarm etc. */
+typedef struct {
+ bool IsSet; /* for time=is set and available ? for alarm=is set ? */
+ int Year; /* The complete year specification - e.g. 1999. Y2K :-) */
+ int Month; /* January = 1 */
+ int Day;
+ int Hour;
+ int Minute;
+ int Second;
+ int Timezone; /* The difference between local time and GMT */
+} GSM_DateTime;
+
+char *DayOfWeek (int year, int month, int day);
+void GetMachineDateTime( char nowdate[], char nowtime[] );
+
+void EncodeDateTime(unsigned char* buffer, GSM_DateTime *datetime);
+void DecodeDateTime(unsigned char* buffer, GSM_DateTime *datetime);
+
+#endif
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#ifndef __gsm_phonebook_h
+#define __gsm_phonebook_h
+
+#include "gsm-sms.h"
+
+/* Limits for sizing of array in GSM_PhonebookEntry. Individual handsets may
+ not support these lengths so they have their own limits set. */
+
+#define GSM_MAX_PHONEBOOK_NAME_LENGTH (50) /* For 7110 */
+#define GSM_MAX_PHONEBOOK_NUMBER_LENGTH (48) /* For 7110 */
+#define GSM_MAX_PHONEBOOK_TEXT_LENGTH (60) /* For 7110 */
+#define GSM_MAX_PHONEBOOK_SUB_ENTRIES (8) /* For 7110 */
+#define GSM_MAX_PHONEBOOK_LOGO_LENGTH (126) /* For 7110 */
+ /* 7110 is able to in one
+ * entry 5 numbers and 2
+ * texts [email,notice,postal] */
+
+/* Here is a macro for models that do not support caller groups. */
+
+#define GSM_GROUPS_NOT_SUPPORTED -1
+
+/* This data type is used to report the number of used and free positions in
+ memory (sim or internal). */
+
+typedef struct {
+ GSM_MemoryType MemoryType; /* Type of the memory */
+ int Used; /* Number of used positions */
+ int Free; /* Number of free positions */
+} GSM_MemoryStatus;
+
+/* Some phones (in this moment 6210/7110) supports extended phonebook
+ with additional datas. Here we have structure for them */
+typedef enum
+{
+ GSM_General = 0x0a,
+ GSM_Mobile = 0x03,
+ GSM_Work = 0x06,
+ GSM_Fax = 0x04,
+ GSM_Home = 0x02,
+ GSM_SIM = 0x00
+} GSM_Number_Type;
+
+typedef enum
+{
+ GSM_Number = 0x0b,
+ GSM_Note = 0x0a,
+ GSM_Postal = 0x09,
+ GSM_Email = 0x08,
+ GSM_Name = 0x07,
+ GSM_RingtoneNo = 0x0C,
+ GSM_Date = 0x13, /* Date is used for DC,RC,etc (last calls) */
+ GSM_LogoOn = 0x1C,
+ GSM_GroupLogo = 0x1B,
+ GSM_GroupNo = 0x1E
+} GSM_EntryType;
+
+typedef struct {
+ char Number[GSM_MAX_PHONEBOOK_TEXT_LENGTH+1]; /* Number */
+ GSM_DateTime Date; /* or the last calls list */
+} GSM_SubPhonebookEntrydata;
+
+typedef struct {
+ GSM_EntryType EntryType;
+ GSM_Number_Type NumberType;
+ GSM_SubPhonebookEntrydata data;
+ int BlockNumber;
+} GSM_SubPhonebookEntry;
+
+/* Define datatype for phonebook entry, used for getting/writing phonebook
+ entries. */
+
+typedef struct {
+ bool Empty; /* Is this entry empty? */
+ char Name[GSM_MAX_PHONEBOOK_NAME_LENGTH + 1]; /* Plus 1 for
+ nullterminator. */
+ char Number[GSM_MAX_PHONEBOOK_NUMBER_LENGTH + 1]; /* Number */
+ GSM_MemoryType MemoryType; /* Type of memory */
+ int Group; /* Group */
+ int Location; /* Location */
+ GSM_SubPhonebookEntry SubEntries[GSM_MAX_PHONEBOOK_SUB_ENTRIES];
+ /* For phones with
+ * additional phonebook
+ * entries */
+ int SubEntriesCount; /* Should be 0, if extended
+ phonebook is not used */
+} GSM_PhonebookEntry;
+
+char *GSM_GetVCARD(GSM_PhonebookEntry *entry, int version);
+
+int GSM_SavePhonebookEntryToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_PhonebookEntry *entry, int version);
+
+#endif /* __gsm_phonebook_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Functions for manipulating WAP Settings and bookmarks
+
+*/
+
+#ifndef __gsm_wap_h
+#define __gsm_wap_h
+
+#include "gsm-sms.h"
+
+typedef struct {
+ char address[255+1];
+ char title[50+1];
+ u16 location;
+} GSM_WAPBookmark;
+
+typedef struct {
+ u8 location;
+ char homepage[100+1];
+ char title[20+1];
+ int bearer;
+ bool issecurity;
+ bool iscontinuous;
+
+ /* for data bearer */
+ char ipaddress[20+1];
+ char dialup[20+1];
+ char user[50+1]; //is length OK ?
+ char password[50+1]; //is length OK ?
+ bool isspeed14400;
+ bool isISDNcall;
+ bool isnormalauthentication;
+
+ /* for sms bearer */
+ char server[21+1];
+
+ /* for sms or ussd bearer */
+ char service[20+1];
+ bool isIP;
+
+ /* for ussd bearer */
+ char code[10+1];
+} GSM_WAPSettings;
+
+#define WAPSETTINGS_BEARER_SMS 0x00
+#define WAPSETTINGS_BEARER_DATA 0x01
+#define WAPSETTINGS_BEARER_USSD 0x02
+
+int GSM_SaveWAPBookmarkToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_WAPBookmark *bookmark);
+
+GSM_Error GSM_ReadWAPBookmark(GSM_SMSMessage *message, GSM_WAPBookmark *bookmark);
+
+int GSM_SaveWAPSettingsToSMS(GSM_MultiSMSMessage *SMS,
+ GSM_WAPSettings *settings);
+
+#endif
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Copyright (C) 2000 Hugh Blemings & Pavel JanÃk ml.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides an API for accessing functions via fbus.
+ See README for more details on supported mobile phones.
+
+ The various routines are called FB3110_(whatever).
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:22 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/09 12:55:07 pkot
+ Forgot about fbus support for 3110. FIXME: is it really needed?
+
+
+*/
+
+#ifndef __links_fbus_3110_h
+#define __links_fbus_3110_h
+
+#include <time.h>
+#include "gsm-statemachine.h"
+
+#ifdef WIN32
+#include <sys/types.h>
+#include <sys/timeb.h>
+#endif
+
+#define FB3110_MAX_FRAME_LENGTH 256
+#define FB3110_MAX_MESSAGE_TYPES 128
+#define FB3110_MAX_TRANSMIT_LENGTH 256
+#define FB3110_MAX_CONTENT_LENGTH 120
+
+/* This byte is at the beginning of all GSM Frames sent over FBUS to Nokia
+ phones. This may have to become a phone dependant parameter... */
+#define FB3110_FRAME_ID 0x01
+
+
+/* States for receive code. */
+
+enum FB3110_RX_States {
+ FB3110_RX_Sync,
+ FB3110_RX_Discarding,
+ FB3110_RX_GetLength,
+ FB3110_RX_GetMessage
+};
+
+
+typedef struct{
+ int Checksum;
+ int BufferCount;
+ enum FB3110_RX_States State;
+ int FrameType;
+ int FrameLength;
+ char Buffer[FB3110_MAX_FRAME_LENGTH];
+} FB3110_IncomingFrame;
+
+typedef struct {
+ u16 message_length;
+ u8 message_type;
+ u8 *buffer;
+} FB3110_OutgoingMessage;
+
+
+typedef struct{
+ FB3110_IncomingFrame i;
+ u8 RequestSequenceNumber;
+} FB3110_Link;
+
+GSM_Error FB3110_Initialise(GSM_Link *newlink, GSM_Statemachine *state);
+
+
+
+#ifdef __links_fbus_3110_c /* Prototype functions for fbus-generic.c only */
+
+bool FB3110_OpenSerial(void);
+void FB3110_RX_StateMachine(unsigned char rx_byte);
+GSM_Error FB3110_TX_SendFrame(u8 message_length, u8 message_type, u8 sequence_byte, u8 *buffer);
+GSM_Error FB3110_SendMessage(u16 messagesize, u8 messagetype, void *message);
+void FB3110_TX_SendAck(u8 *message, int length);
+void FB3110_UpdateSequenceNumber(void);
+
+#endif /* #ifdef __links_fbus_3110_c */
+
+#endif /* #ifndef __links_fbus_3110_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for miscellaneous defines, typedefs etc.
+
+*/
+
+#ifndef __misc_win32_h
+#define __misc_win32_h
+
+#include <windows.h>
+
+#define sleep(x) Sleep((x) * 1000)
+#define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))
+
+#endif
\ No newline at end of file
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See fbus-6110.c for more details.
+
+*/
+
+#ifndef __n_6110_h
+#define __n_6110_h
+
+#include "gsm-api.h"
+
+/* Nokia 6110 supports phonebook entries of max. 16 characters and numbers of
+ max. 30 digits */
+#define N6110_MAX_PHONEBOOK_NAME_LENGTH (16)
+#define N6110_MAX_PHONEBOOK_NUMBER_LENGTH (30)
+
+/* Alternate defines for memory types. Two letter codes follow GSM 07.07
+ release 6.2.0, AT+CPBS "Select Phonebook Memory Storage" */
+#define N6110_MEMORY_MT 0x01 /* combined ME and SIM phonebook */
+#define N6110_MEMORY_ME 0x02 /* ME (Mobile Equipment) phonebook */
+#define N6110_MEMORY_SM 0x03 /* SIM phonebook */
+#define N6110_MEMORY_FD 0x04 /* SIM fixdialling-phonebook */
+#define N6110_MEMORY_ON 0x05 /* SIM (or ME) own numbers list */
+#define N6110_MEMORY_EN 0x06 /* SIM (or ME) emergency number */
+#define N6110_MEMORY_DC 0x07 /* ME dialled calls list */
+#define N6110_MEMORY_RC 0x08 /* ME received calls list */
+#define N6110_MEMORY_MC 0x09 /* ME missed (unanswered received) calls list */
+#define N6110_MEMORY_VOICE 0x0b /* Voice Mailbox */
+#define N6110_MEMORY_XX 0xff /* This is used when the memory type is unknown. */
+
+/* This byte is used to synchronize FBUS channel over cable or IR. */
+#define N6110_SYNC_BYTE 0x55
+
+/* This byte is send after all N6110_SYNC_BYTE bytes when init infrared. */
+#define N6110_IR_END_SYNC_BYTE 0xc1
+
+/* Every (well, almost every) frame from the computer starts with this
+ sequence. */
+#define N6110_FRAME_HEADER 0x00, 0x01, 0x00
+
+/* Global variables */
+extern bool N6110_LinkOK;
+extern GSM_Functions N6110_Functions;
+extern GSM_Information N6110_Information;
+
+/* Prototypes for the functions designed to be used externally. */
+GSM_Error N6110_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+void N6110_DispatchMessage(u16 MessageLength, u8 *MessageBuffer,
+ u8 MessageType);
+
+GSM_Error N6110_SendStatusRequest(void);
+
+int N6110_GetMemoryType(GSM_MemoryType memory_type);
+
+GSM_Error N6110_GetVoiceMailbox ( GSM_PhonebookEntry *entry);
+
+GSM_Error N6110_GetOperatorName ( GSM_Network *operator);
+GSM_Error N6110_SetOperatorName ( GSM_Network *operator);
+
+GSM_Error N6110_GetMemoryLocation(GSM_PhonebookEntry *entry);
+GSM_Error N6110_WritePhonebookLocation(GSM_PhonebookEntry *entry);
+
+GSM_Error N6110_GetSpeedDial(GSM_SpeedDial *entry);
+GSM_Error N6110_SetSpeedDial(GSM_SpeedDial *entry);
+
+GSM_Error N6110_GetMemoryStatus(GSM_MemoryStatus *Status);
+GSM_Error N6110_GetSMSStatus(GSM_SMSStatus *Status);
+GSM_Error N6110_GetSMSCenter(GSM_MessageCenter *MessageCenter);
+
+GSM_Error N6110_GetSMSMessage(GSM_SMSMessage *Message);
+GSM_Error N6110_DeleteSMSMessage(GSM_SMSMessage *Message);
+GSM_Error N6110_SendSMSMessage(GSM_SMSMessage *Message);
+GSM_Error N6110_SaveSMSMessage(GSM_SMSMessage *Message);
+
+GSM_Error N6110_GetRFLevel(GSM_RFUnits *units, float *level);
+GSM_Error N6110_GetBatteryLevel(GSM_BatteryUnits *units, float *level);
+GSM_Error N6110_GetPowerSource(GSM_PowerSource *source);
+GSM_Error N6110_GetDisplayStatus(int *Status);
+
+GSM_Error N6110_EnterSecurityCode(GSM_SecurityCode SecurityCode);
+GSM_Error N6110_GetSecurityCodeStatus(int *Status);
+GSM_Error N6110_GetSecurityCode(GSM_SecurityCode *SecurityCode);
+
+GSM_Error N6110_GetSMSCenter(GSM_MessageCenter *MessageCenter);
+GSM_Error N6110_SetSMSCenter(GSM_MessageCenter *MessageCenter);
+
+GSM_Error N6110_GetIMEI(char *imei);
+GSM_Error N6110_GetRevision(char *revision);
+GSM_Error N6110_GetModel(char *model);
+GSM_Error N6110_GetManufacturer(char *manufacturer);
+
+GSM_Error N6110_GetDateTime(GSM_DateTime *date_time);
+GSM_Error N6110_SetDateTime(GSM_DateTime *date_time);
+
+GSM_Error N6110_PrivGetDateTime(GSM_DateTime *date_time, int msgtype);
+GSM_Error N6110_PrivSetDateTime(GSM_DateTime *date_time, int msgtype);
+
+GSM_Error N6110_GetAlarm(int alarm_number, GSM_DateTime *date_time);
+GSM_Error N6110_SetAlarm(int alarm_number, GSM_DateTime *date_time);
+
+GSM_Error N6110_PrivGetAlarm(int alarm_number, GSM_DateTime *date_time, int msgtype);
+GSM_Error N6110_PrivSetAlarm(int alarm_number, GSM_DateTime *date_time, int msgtype);
+
+GSM_Error N6110_DialVoice(char *Number);
+GSM_Error N6110_DialData(char *Number, char type, void (* callpassup)(char c));
+GSM_Error N6110_AnswerCall(char s);
+
+GSM_Error N6110_GetIncomingCallNr(char *Number);
+
+GSM_Error N6110_SendBitmap(char *NetworkCode, int width, int height,
+ unsigned char *bitmap);
+GSM_Error N6110_GetNetworkInfo(GSM_NetworkInfo *NetworkInfo);
+
+GSM_Error N6110_GetCalendarNote(GSM_CalendarNote *CalendarNote);
+GSM_Error N6110_WriteCalendarNote(GSM_CalendarNote *CalendarNote);
+GSM_Error N6110_DeleteCalendarNote(GSM_CalendarNote *CalendarNote);
+
+GSM_Error N6110_NetMonitor(unsigned char mode, char *Screen);
+
+GSM_Error N6110_PlayTone(int Herz, u8 Volume);
+
+GSM_Error N6110_SetBitmap( GSM_Bitmap *Bitmap );
+GSM_Error N6110_GetBitmap( GSM_Bitmap *Bitmap );
+
+GSM_Error N6110_SetRingTone(GSM_Ringtone *ringtone, int *maxlength);
+GSM_Error N6110_SetBinRingTone(GSM_BinRingtone *ringtone);
+GSM_Error N6110_GetBinRingTone(GSM_BinRingtone *ringtone);
+
+GSM_Error N6110_EnableDisplayOutput();
+GSM_Error N6110_DisableDisplayOutput();
+
+GSM_Error N6110_EnableCellBroadcast ();
+GSM_Error N6110_DisableCellBroadcast(void);
+GSM_Error N6110_ReadCellBroadcast (GSM_CBMessage *Message);
+
+GSM_Error N6110_SendDTMF(char *String);
+
+GSM_Error N6110_Reset(unsigned char type);
+
+GSM_Error N6110_GetProfile(GSM_Profile *Profile);
+GSM_Error N6110_SetProfile(GSM_Profile *Profile);
+bool N6110_SendRLPFrame(RLP_F96Frame *frame, bool out_dtx);
+
+GSM_Error N6110_CancelCall(void);
+
+GSM_Error N6110_PressKey(int key, int event);
+
+GSM_Error N6110_GetProductProfileSetting (GSM_PPS *PPS);
+GSM_Error N6110_SetProductProfileSetting (GSM_PPS *PPS);
+
+GSM_Error N6110_CallDivert(GSM_CallDivert *cd);
+
+void N6110_RX_HandleRLPMessage(u8 *MessageBuffer);
+
+GSM_Error N6110_SendIMEIFrame();
+GSM_Error N6110_SendIDFrame();
+GSM_Error N6110_SendHWFrame();
+
+GSM_Error N6110_EnableExtendedCommands (unsigned char status);
+
+GSM_Error N6110_Tests();
+
+void N6110_DisplayTestsInfo(u8 *MessageBuffer);
+
+GSM_Error N6110_SimlockInfo(GSM_AllSimlocks *siml);
+GSM_Error N6110_GetSMSFolders ( GSM_SMSFolders *folders);
+
+GSM_Error N6110_ResetPhoneSettings();
+
+void N6110_Dispatch0x01Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+
+void N6110_ReplySendSMSMessage(u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplySetSMSCenter (u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplyGetSMSCenter (u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_Dispatch0x02Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplySetCellBroadcast (u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplyReadCellBroadcast(u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+
+void N6110_ReplyCallDivert (u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_Dispatch0x06Message(u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+
+void N6110_ReplySetDateTime(u16 MessageLength,u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplyGetDateTime(u16 MessageLength,u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplySetAlarm (u16 MessageLength,u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplyGetAlarm (u16 MessageLength,u8 *MessageBuffer, u8 MessageType);
+
+void N6110_ReplyEnableExtendedCommands (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplyResetPhoneSettings (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplyIMEI (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplyGetProductProfileSetting(u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplySetProductProfileSetting(u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplyNetmonitor (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplySimlockInfo (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplyPlayTone (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_ReplyHW (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N6110_Dispatch0x40Message (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+
+void N6110_DispatchACKMessage (u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N6110_ReplyID(u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+
+GSM_Error GSM_EncodeNokiaSMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int *length, SMS_MessageType PDU);
+GSM_Error GSM_DecodeNokiaSMSFrame(GSM_SMSMessage *SMS, unsigned char *req, int length);
+
+int N6110_MakeCallerGroupFrame (unsigned char *req,GSM_Bitmap Bitmap);
+int N6110_MakeOperatorLogoFrame(unsigned char *req,GSM_Bitmap Bitmap);
+int N6110_MakeStartupLogoFrame (unsigned char *req,GSM_Bitmap Bitmap);
+
+#endif /* __n_6110_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See fbus-7110.c for more details.
+
+*/
+
+#ifndef __n_7110_h
+#define __n_7110_h
+
+#include "gsm-api.h"
+
+/* Entry Types of 7110 for enhanced phonebook */
+#define N7110_ENTRYTYPE_SPEEDDIAL 0x04 /* Speed dial */
+#define N7110_ENTRYTYPE_NAME 0x07 /* Name always the only one */
+#define N7110_ENTRYTYPE_EMAIL 0x08 /* Email Adress (TEXT) */
+#define N7110_ENTRYTYPE_POSTAL 0x09 /* Postal Address (Text) */
+#define N7110_ENTRYTYPE_NOTE 0x0a /* Note (Text) */
+#define N7110_ENTRYTYPE_NUMBER 0x0b /* Phonenumber */
+#define N7110_ENTRYTYPE_RINGTONE 0x0c /* Ringtone number */
+#define N7110_ENTRYTYPE_DATE 0x13 /* Date for a Called List */
+#define N7110_ENTRYTYPE_GROUPLOGO 0x1b /* Caller group logo */
+#define N7110_ENTRYTYPE_LOGOON 0x1c /* Logo On? */
+#define N7110_ENTRYTYPE_GROUP 0x1e /* Group number for phonebook entry */
+
+/* Alternate defines for memory types. Two letter codes follow GSM 07.07
+ release 6.2.0, AT+CPBS "Select Phonebook Memory Storage" */
+#define N7110_MEMORY_DC 0x01 /* ME dialled calls list */
+#define N7110_MEMORY_MC 0x02 /* ME missed (unanswered received) calls list */
+#define N7110_MEMORY_RC 0x03 /* ME received calls list */
+#define N7110_MEMORY_FD 0x04 /* ?? SIM fixdialling-phonebook */
+#define N7110_MEMORY_ME 0x05 /* ME (Mobile Equipment) phonebook */
+#define N7110_MEMORY_SM 0x06 /* SIM phonebook */
+#define N7110_MEMORY_ON 0x07 /* ?? SIM (or ME) own numbers list */
+#define N7110_MEMORY_EN 0x08 /* ?? SIM (or ME) emergency number */
+#define N7110_MEMORY_VM 0x09 /* voice mailbox */
+#define N7110_MEMORY_SD 0x0e /* speed dials */
+#define N7110_MEMORY_CG 0x10 /* Caller groups */
+
+/* Every (well, almost every) frame from the computer starts with this
+ sequence. */
+#define N7110_FRAME_HEADER 0x00, 0x01, 0x01
+
+/* some 6210/7110 folder stuff */
+#define N7110_MAXSMSINFOLDER 160
+
+/* Datatype for action in HandleSMSLocation */
+typedef enum {
+ GSH_GET, /* Get SMS location */
+ GSH_SAVE, /* want to save at SMS location */
+ GSH_INIT, /* init folder table */
+ GSH_DELETE /* Delete SMS location */
+} GSM_SMSHandleAction;
+
+/* Global variables */
+extern bool N7110_LinkOK;
+extern GSM_Functions N7110_Functions;
+extern GSM_Information N7110_Information;
+
+/* Prototypes for the functions designed to be used externally. */
+GSM_Error N7110_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+void N7110_DispatchMessage(u16 MessageLength, u8 *MessageBuffer,
+ u8 MessageType);
+
+int N7110_GetMemoryType(GSM_MemoryType memory_type);
+
+GSM_Error N7110_GetVoiceMailbox ( GSM_PhonebookEntry *entry);
+
+GSM_Error N7110_GetMemoryStatus(GSM_MemoryStatus *Status);
+
+GSM_Error N7110_GetProfile(GSM_Profile *Profile);
+
+GSM_Error N7110_GetCalendarNote(GSM_CalendarNote *CalendarNote);
+GSM_Error N7110_WriteCalendarNote(GSM_CalendarNote *CalendarNote);
+GSM_Error N7110_DeleteCalendarNote(GSM_CalendarNote *CalendarNote);
+
+GSM_Error N7110_GetRFLevel(GSM_RFUnits *units, float *level);
+GSM_Error N7110_GetBatteryLevel(GSM_BatteryUnits *units, float *level);
+
+GSM_Error N7110_DialVoice(char *Number);
+
+GSM_Error N7110_GetSecurityCode(GSM_SecurityCode *SecurityCode);
+
+GSM_Error N7110_GetDateTime(GSM_DateTime *date_time);
+GSM_Error N7110_SetDateTime(GSM_DateTime *date_time);
+
+GSM_Error N7110_GetAlarm(int alarm_number, GSM_DateTime *date_time);
+GSM_Error N7110_SetAlarm(int alarm_number, GSM_DateTime *date_time);
+
+GSM_Error N7110_GetSMSStatus(GSM_SMSStatus *Status);
+GSM_Error N7110_DeleteSMSMessage(GSM_SMSMessage *Message);
+GSM_Error N7110_SaveSMSMessage(GSM_SMSMessage *SMS);
+
+GSM_Error N7110_GetMemoryLocation(GSM_PhonebookEntry *entry);
+void N7110_DecodePhonebookFrame(GSM_PhonebookEntry *entry,u8 *MessageBuffer,u16 MessageLength);
+GSM_Error N7110_WritePhonebookLocation(GSM_PhonebookEntry *entry);
+int N7110_EncodePhonebookFrame(unsigned char *req, GSM_PhonebookEntry entry, int *block);
+GSM_Error N7110_DeletePhonebookLocation(GSM_PhonebookEntry *entry);
+GSM_Error N7110_WriteGroupDataLocation(GSM_Bitmap *bitmap);
+
+GSM_Error N7110_SendDTMF(char *String);
+
+GSM_Error N7110_GetSpeedDial(GSM_SpeedDial *entry);
+GSM_Error N7110_SetSpeedDial(GSM_SpeedDial *entry);
+
+GSM_Error N7110_GetSMSMessage(GSM_SMSMessage *message);
+
+GSM_Error N7110_SetBitmap(GSM_Bitmap *Bitmap);
+GSM_Error N7110_GetBitmap(GSM_Bitmap *Bitmap);
+
+GSM_Error N7110_SetRingTone(GSM_Ringtone *ringtone, int *maxlength);
+
+GSM_Error N7110_GetBinRingTone(GSM_BinRingtone *ringtone);
+GSM_Error N7110_SetBinRingTone(GSM_BinRingtone *ringtone);
+
+GSM_Error N7110_GetCalendarNotesInfo(GSM_NotesInfo *NotesInfo);
+
+GSM_Error N7110_FirstCalendarFreePos(int *FirstFreePos);
+
+GSM_Error N7110_GetSMSFolders (GSM_SMSFolders *folders);
+
+GSM_Error N7110_GetWAPBookmark (GSM_WAPBookmark *bookmark);
+
+GSM_Error N7110_SetWAPBookmark (GSM_WAPBookmark *bookmark);
+
+GSM_Error N7110_GetWAPSettings (GSM_WAPSettings *settings);
+
+GSM_Error N7110_HandleSMSLocation (int smsnum, u8 *folderid, int *location, GSM_SMSMessage *message, GSM_SMSHandleAction action);
+
+void N7110_ReplyEnableWAPCommands(u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N7110_ReplyGetWAPBookmark (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+void N7110_ReplySetWAPBookmark (u16 MessageLength, u8 *MessageBuffer, u8 MessageType);
+void N7110_ReplyGetWAPSettings (u16 MessageLength,u8 *MessageBuffer,u8 MessageType);
+
+void N7110_Fake2SMSLocation(int smsnum, u8 *folder, int *location);
+void N7110_SMS2FakeLocation(int *smsnum, u8 folder, int location);
+
+#endif /* __n_7110_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See fbus-at.c for more details.
+
+*/
+
+#ifndef __n_at_h
+#define __n_at_h
+
+#include "gsm-api.h"
+
+/* Global variables */
+extern bool Nat_LinkOK;
+extern GSM_Functions Nat_Functions;
+extern GSM_Information Nat_Information;
+
+/* Prototypes for the functions designed to be used externally. */
+GSM_Error Nat_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+void Nat_DispatchMessage(u16 MessageLength, u8 *MessageBuffer,
+ u8 MessageType);
+
+GSM_Error Nat_DialVoice(char *Number);
+GSM_Error Nat_CancelCall(void);
+
+GSM_Error Nat_SetDateTime(GSM_DateTime *date_time);
+GSM_Error Nat_GetDateTime(GSM_DateTime *date_time);
+
+GSM_Error Nat_GetAlarm(int alarm_number, GSM_DateTime *date_time);
+
+GSM_Error Nat_SendDTMF(char *String);
+
+GSM_Error Nat_GetSMSMessage(GSM_SMSMessage *message);
+GSM_Error Nat_SaveSMSMessage(GSM_SMSMessage *message);
+GSM_Error Nat_DeleteSMSMessage(GSM_SMSMessage *message);
+GSM_Error Nat_GetSMSStatus(GSM_SMSStatus *Status);
+GSM_Error Nat_SendSMSMessage(GSM_SMSMessage *message);
+
+GSM_Error Nat_EnterSecurityCode(GSM_SecurityCode SecurityCode);
+GSM_Error Nat_GetSecurityCodeStatus(int *Status);
+GSM_Error Nat_GetSecurityCodeStatus(int *Status);
+
+GSM_Error Nat_GetMemoryLocation(GSM_PhonebookEntry *entry);
+GSM_Error Nat_WritePhonebookLocation(GSM_PhonebookEntry * entry);
+GSM_Error Nat_GetMemoryStatus(GSM_MemoryStatus *Status);
+
+GSM_Error Nat_GetBatteryLevel(GSM_BatteryUnits *units, float *level);
+GSM_Error Nat_GetRFLevel(GSM_RFUnits *units, float *level);
+GSM_Error Nat_GetPowerSource(GSM_PowerSource * source);
+
+GSM_Error Nat_GetSMSCenter(GSM_MessageCenter *MessageCenter);
+GSM_Error Nat_SetSMSCenter(GSM_MessageCenter *MessageCenter);
+
+GSM_Error Nat_GetNetworkInfo(GSM_NetworkInfo *NetworkInfo);
+
+GSM_Error Nat_GetManufacturer(char* manufacturer);
+
+GSM_Error Nat_CallDivert(GSM_CallDivert *cd);
+
+/* FIXME: not functional or returns errors with tested AT implementation */
+GSM_Error Nat_GetDisplayStatus(int *Status);
+GSM_Error Nat_PressKey(int key, int event);
+GSM_Error Nat_SetAlarm(int alarm_number, GSM_DateTime *date_time);
+
+struct AT_OneReply {
+ char *ReplyString;
+ void (*ReplyFunction) (u16 message_length, u8 *buffer, u8 message_type);
+};
+
+#endif /* __n_at_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See fbus-sniff.c for more details.
+
+*/
+
+#ifndef __n_sniff_h
+#define __n_sniff_h
+
+#include "gsm-api.h"
+
+/* Global variables */
+extern bool Nsniff_LinkOK;
+extern GSM_Functions Nsniff_Functions;
+extern GSM_Information Nsniff_Information;
+
+/* Prototypes for the functions designed to be used externally. */
+GSM_Error Nsniff_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+void Nsniff_DispatchMessage(u16 MessageLength, u8 *MessageBuffer,
+ u8 MessageType);
+
+#endif /* __n_sniff_h */
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to at commands on ericsson
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:22 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+*/
+
+void AT_InitEricsson(GSM_Statemachine *state, char* foundmodel, char* setupmodel);
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to generic at command compatible
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:22 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+
+*/
+
+typedef GSM_Error (*GSM_RecvFunctionType)(int type, unsigned char *buffer, int length, GSM_Data *data);
+typedef GSM_Error (*AT_SendFunctionType)(GSM_Data *data, GSM_Statemachine *s);
+
+typedef struct {
+ char *line1;
+ char *line2;
+ char *line3;
+ int length;
+} AT_LineBuffer;
+
+GSM_RecvFunctionType AT_InsertRecvFunction(int type, GSM_RecvFunctionType func);
+AT_SendFunctionType AT_InsertSendFunction(int type, AT_SendFunctionType func);
+
+GSM_Error AT_SetMemoryType(GSM_MemoryType mt, GSM_Statemachine *state);
+
+void splitlines(AT_LineBuffer *buf);
+
+char *skipcrlf(char *str);
+char *findcrlf(char *str, int test, int maxlength);
+
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to at commands on nokia
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:22 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+*/
+
+void AT_InitNokia(GSM_Statemachine *state, char* foundmodel, char* setupmodel);
--- /dev/null
+/*
+
+ $Id$
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for mobile phones.
+
+ Copyright 2001 Manfred Jonsson <manfred.jonsson@gmx.de>
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ This file provides functions specific to at commands on siemens
+ phones. See README for more details on supported mobile phones.
+
+ $Log$
+ Revision 1.1.1.1 2001/11/25 21:59:22 short
+ :pserver:cvs@pserver.samba.org:/cvsroot - gnokii - Sun Nov 25 22:56 CET 2001
+
+ Revision 1.1 2001/11/19 13:03:18 pkot
+ nk3110.c cleanup
+
+*/
+
+void AT_InitSiemens(GSM_Statemachine *state, char* foundmodel, char* setupmodel);
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See AT-6110.c for more details.
+
+*/
+
+#ifndef __AT_h
+#define __AT_h
+
+#include "gsm-api.h"
+
+#define AT_MAX_RECEIVE_LENGTH 2000
+#define AT_MAX_CONTENT_LENGTH 2000
+
+/* Global variables */
+extern GSM_Protocol AT_Functions;
+
+/* States for receive code. */
+
+GSM_Error AT_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+int AT_SendMessage(u16 message_length, u8 message_type, u8 *buffer);
+int AT_SendFrame(u16 message_length, u8 message_type, u8 *buffer);
+void AT_Terminate(void);
+void AT_RX_StateMachine(unsigned char rx_byte);
+bool AT_WritePhone (u16 length, u8 *buffer);
+
+#endif /* __AT_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See fbus-6110.c for more details.
+
+*/
+
+#ifndef __fbus_h
+#define __fbus_h
+
+#include "gsm-api.h"
+
+/* This byte is at the beginning of all GSM Frames sent over FBUS to Nokia
+ 6110 phones. */
+#define FBUS_FRAME_ID 0x1e
+
+/* This byte is at the beginning of all GSM Frames sent over infrared to Nokia
+ 6110 phones. */
+#define FBUS_IR_FRAME_ID 0x1c
+
+#define FBUS_DEVICE_PHONE 0x00 /* Nokia mobile phone. */
+#define FBUS_DEVICE_PC 0x0c /* Our PC (FBUS). */
+
+#define FBUS_FRTYPE_ACK 0x7f /* Acknowledge of the received frame. */
+
+#define FBUS_MAX_TRANSMIT_LENGTH (256)
+#define FBUS_MAX_RECEIVE_LENGTH (512)
+#define FBUS_MAX_CONTENT_LENGTH (120)
+
+/* Global variables */
+extern GSM_Protocol FBUS_Functions;
+
+/* States for receive code. */
+
+enum FBUS_RX_States {
+ FBUS_RX_Sync,
+ FBUS_RX_Discarding,
+ FBUS_RX_GetDestination,
+ FBUS_RX_GetSource,
+ FBUS_RX_GetType,
+ FBUS_RX_GetLength1,
+ FBUS_RX_GetLength2,
+ FBUS_RX_GetMessage
+};
+
+GSM_Error FBUS_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+int FBUS_SendMessage(u16 message_length, u8 message_type, u8 *buffer);
+int FBUS_SendFrame(u16 message_length, u8 message_type, u8 *buffer);
+void FBUS_Terminate(void);
+void FBUS_RX_StateMachine(unsigned char rx_byte);
+
+#endif /* __fbus_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See mbus-6110.c for more details.
+
+*/
+
+#ifndef __fbusirda_h
+#define __fbusirda_h
+
+#include "gsm-api.h"
+
+/* This byte is at the beginning of all GSM Frames sent over MBUS to Nokia
+ 6110 phones. */
+#define FBUSIRDA_FRAME_ID 0x14
+
+#define FBUSIRDA_MAX_TRANSMIT_LENGTH (1000)
+#define FBUSIRDA_MAX_RECEIVE_LENGTH (1000)
+#define FBUSIRDA_MAX_CONTENT_LENGTH (1000)
+
+/* Global variables */
+extern GSM_Protocol FBUSIRDA_Functions;
+
+GSM_Error FBUSIRDA_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+int FBUSIRDA_SendMessage(u16 message_length, u8 message_type, u8 *buffer);
+int FBUSIRDA_SendFrame(u16 message_length, u8 message_type, u8 *buffer);
+void FBUSIRDA_Terminate(void);
+bool FBUSIRDA_WritePhone (u16 length, u8 *buffer);
+void FBUSIRDA_RX_StateMachine(unsigned char rx_byte);
+
+#endif /* __fbus_h */
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Header file for the various functions, definitions etc. used to implement
+ the handset interface. See mbus-6110.c for more details.
+
+*/
+
+#ifndef __mbus_h
+#define __mbus_h
+
+#include "gsm-api.h"
+
+/* This byte is at the beginning of all GSM Frames sent over MBUS to Nokia
+ 6110 phones. */
+#define MBUS_FRAME_ID 0x1f
+
+/* Our PC (MBUS). */
+#define MBUS_DEVICE_PC1 0x10
+#define MBUS_DEVICE_PC2 0x1d
+
+#define MBUS_MAX_TRANSMIT_LENGTH (1000)
+#define MBUS_MAX_RECEIVE_LENGTH (1000)
+#define MBUS_MAX_CONTENT_LENGTH (1000)
+
+/* Global variables */
+extern GSM_Protocol MBUS_Functions;
+
+GSM_Error MBUS_Initialise(char *port_device, char *initlength,
+ GSM_ConnectionType connection,
+ void (*rlp_callback)(RLP_F96Frame *frame));
+
+int MBUS_SendMessage(u16 message_length, u8 message_type, u8 *buffer);
+int MBUS_SendFrame(u16 message_length, u8 message_type, u8 *buffer);
+void MBUS_Terminate(void);
+bool MBUS_WritePhone (u16 length, u8 *buffer);
+void MBUS_RX_StateMachine(unsigned char rx_byte);
+
+#endif /* __fbus_h */
--- /dev/null
+
+#
+# Makefile for the GNOKII tool suite.
+#
+# Copyright (C) 1999 Hugh Blemings & Pavel JanÃk ml.
+# 2000 Karel Zak
+#
+
+TOPDIR=..
+include $(TOPDIR)/Makefile.global
+
+CFLAGS += $(PTHREAD_CFLAGS)
+LDFLAGS += $(PTHREAD_LIBS)
+
+OBJS = mgnetd.o
+
+all: mgnetd
+
+mgnetd: $(OBJS) $(TOPDIR)/common/COMMON.o
+
+$(TOPDIR)/common/COMMON.o:
+ $(MAKE) -C $(TOPDIR)/common COMMON.o
+
+$(TOPDIR)/common/libmygnokii.so:
+ $(MAKE) -C $(TOPDIR)/common makelib
+
+makelib: $(OBJS) $(TOPDIR)/common/libmygnokii.so
+ $(CC) $(LDFLAGS) -L$(TOPDIR)/common -lmygnokii $(OBJS) -o mgnetdlib
+
+clean:
+ $(RM) $(OBJS) *~ depend mgnetd mgnetdlib *.exe core *.bak
+
+install: all
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) mgnetd $(sbindir)
+ $(INSTALL) mgnetdlib $(sbindir)/mgnetd
+
+install-strip: all
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) -s mgnetd $(sbindir)
+ $(INSTALL) -s mgnetdlib $(sbindir)/mgnetd
+ @echo "done"
+
+install-suid: all
+ @if [ -z "/bin/grep -e '^gnokii:' /etc/group" ]; then \
+ /usr/sbin/groupadd gnokii; \
+ fi
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) -o root -g gnokii -m 0750 mgnetd $(sbindir)
+ $(INSTALL) -o root -g gnokii -m 0750 mgnetdlib $(sbindir)/mgnetd
+ @echo
+
+install-ss: all
+ @if [ -z "/bin/grep -e '^gnokii:' /etc/group" ]; then \
+ /usr/sbin/groupadd gnokii; \
+ fi
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) -o root -g gnokii -m 0750 -s mgnetd $(sbindir)
+ $(INSTALL) -o root -g gnokii -m 0750 -s mgnetdlib $(sbindir)/mgnetd
+ @echo
+
+depend dep:
+ $(CC) $(CFLAGS) -MM *.c >depend
+
+ifeq (depend,$(wildcard depend))
+include depend
+endif
+
+.PHONY: all install clean dep depend
--- /dev/null
+
+#
+# Makefile for the GNOKII tool suite.
+#
+# Copyright (C) 1999 Hugh Blemings & Pavel JanÃk ml.
+# 2000 Karel Zak
+#
+
+TOPDIR=../..
+include $(TOPDIR)/Makefile.global
+
+OBJS = mg_demo_client.o \
+ mg_net_api.o
+
+all: mg_demo_client
+
+mg_demo_client: $(OBJS)
+
+makelib: mg_demo_client
+ @echo
+
+clean:
+ $(RM) $(OBJS) *~ depend mg_demo_client *.exe core *.bak
+
+install: all
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) mg_demo_client $(sbindir)
+
+install-strip: all
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) -s mg_demo_client $(sbindir)
+ @echo "done"
+
+install-suid: all
+ @if [ -z "/bin/grep -e '^gnokii:' /etc/group" ]; then \
+ /usr/sbin/groupadd gnokii; \
+ fi
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) -o root -g gnokii -m 0750 mg_demo_client $(sbindir)
+ @echo
+
+install-ss: all
+ @if [ -z "/bin/grep -e '^gnokii:' /etc/group" ]; then \
+ /usr/sbin/groupadd gnokii; \
+ fi
+ $(INSTALL) -d $(sbindir)
+ $(INSTALL) -o root -g gnokii -m 0750 -s mg_demo_client $(sbindir)
+ @echo
+
+depend dep:
+ $(CC) $(CFLAGS) -MM *.c >depend
+
+ifeq (depend,$(wildcard depend))
+include depend
+endif
+
+.PHONY: all install clean dep depend
--- /dev/null
+/*
+ Demo/test prg for MYGNOKII net_api
+ Ralf Thelen 20.01.2002
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mg_net_api.h"
+
+/* usage */
+void usage(void)
+{
+ fprintf(stderr, "\n\nUsage: mg_demo_client <server> <passwd> <command> <option 1, option 2>\n"
+" where \n"
+" <server> is hostname or ip-address with running 'gnokii --server'\n"
+" <passwd> is the password for the running gnokii server\n"
+" <command> is a number between 0 and 5 (see below)\n"
+" <option 1> is command specific (see below)\n\n\n"
+
+" mg_demo_client <server> <passwd> 1\n"
+"command = 1(MG_EXIT) -> let server die\n\n"
+
+" mg_demo_client <server> <passwd> 2\n"
+"command = 2 (MG_VERSION) -> ask for server version of mg_net_api\n\n"
+
+" mg_demo_client <server> <passwd> 3\n"
+"command = 3 (MG_IDENTIFY) -> get identify-string from phone\n\n"
+
+" mg_demo_client <server> <passwd> 4 < SM | ME> \n"
+"command = 4 (MG_MEMORYSTATUS) -> get memory status from phone\n\n"
+
+" mg_demo_client <server> <passwd> 5 < SM | ME> <location-nr> \n"
+"command = 5 (MG_GET_MEMORY_LOCATION) -> get phonebookentry at location from phone \n\n"
+
+" mg_demo_client <server> <passwd> 6 < SM | ME> <location-nr> <name> <number>\n"
+"command = 6 (MG_WRITE_PHONEBOOK_LOCATION) -> write phonebookentry to location at phone\n\n"
+
+" mg_demo_client <server> <passwd> 7 < SM | ME> <location-nr>\n"
+"command = 7 (MG_DELETE_PHONEBOOK_LOCATION) -> delete phonebookentry at location at phone\n\n"
+
+" mg_demo_client <server> <passwd> 8 <destination> <message>\n"
+"command = 8 (MG_SEND_SMS) -> send sms 'message to destionation\n\n");
+
+ exit(1);
+}
+
+
+int main(argc, argv)
+int argc;
+char *argv[];
+{
+ int user_cmd;
+ int ret;
+ MG_rq_version version;
+ MG_rq_identify ident;
+ MG_rq_memorystatus status;
+ MG_rq_phonebook_location ph;
+ MG_rq_send_sms sms;
+
+
+ if (argc < 3) {
+ usage();
+ }
+ if ( mg_init(argv[1], argv[2]) < 0 )
+ {
+ printf("init failed\n");
+ exit(1);
+ }
+
+ user_cmd = atoi(argv[3]);
+ switch(user_cmd)
+ {
+ case MG_EXIT:
+ if (argc != 4) usage();
+ if ( (ret = mg_exit()) < 0)
+ printf("exit failed (%d)\n",ret);
+ else
+ printf("server is exiting\n");
+ break;
+ case MG_VERSION:
+ if (argc != 4) usage();
+ if ( (ret = mg_version(&version)) < 0)
+ printf("version failed (%d)\n",ret);
+ else
+ {
+ printf("Version is %d.%d\n",version.major, version.minor);
+ }
+ break;
+ case MG_IDENTIFY:
+ if (argc != 4) usage();
+ if ( (ret = mg_identify(&ident)) < 0)
+ printf("identify failed(%d)\n",ret);
+ else
+ {
+ printf("IMEI: %s, Model: %s, Revision: %s\n",ident.imei, ident.model, ident.rev);
+ }
+ break;
+ case MG_MEMORYSTATUS:
+ if (argc != 5) usage();
+ strcpy(status.memtype,argv[4]);
+ if ( (ret = mg_memorystatus(&status)) < 0)
+ printf("status failed(%d)\n",ret);
+ else
+ {
+ printf("Status for %s: %d Free, %d Used\n",status.memtype,status.free,status.used);
+ }
+ break;
+ case MG_GET_MEMORY_LOCATION:
+ if (argc != 6) usage();
+ strcpy(ph.memtype,argv[4]);
+ ph.location = atoi(argv[5]);
+ if ( (ret = mg_get_memory_location(&ph)) < 0)
+ printf("get memory location failed(%d)\n",ret);
+ else
+ {
+ printf("Location Nr: %d:\n",ph.location);
+ printf("Name: %s\nGroup: %s\nnr_general: %s\nnr_mobile: %s\nnr_work: %s\nnr_fax: %s\nnr_home: %s\nnote: %s\npostal: %s\nemail: %s\n",
+ ph.name,
+ ph.group,
+ ph.nr_general,
+ ph.nr_mobile,
+ ph.nr_work,
+ ph.nr_fax,
+ ph.nr_home,
+ ph.note,
+ ph.postal,
+ ph.email);
+ }
+ break;
+ case MG_WRITE_PHONEBOOK_LOCATION:
+ if (argc != 8) usage();
+ ph.group[0] = ph.nr_mobile[0] = ph.nr_work[0] = '\0';
+ ph.nr_fax[0] = ph.nr_home[0] = ph.note[0] = ph.postal[0] = ph.email[0] = '\0';
+ strcpy(ph.memtype,argv[4]);
+ ph.location = atoi(argv[5]);
+ strcpy(ph.name,argv[6]);
+ strcpy(ph.nr_general,argv[7]);
+ if ( (ret = mg_write_phonebook_location(&ph)) < 0)
+ printf("Write Location Nr: %d %s %s FAILED(%d)\n",ph.location,ph.name,ph.nr_general,ret);
+ else
+ {
+ printf("Write Location Nr: %d %s %s succeded\n",ph.location,ph.name,ph.nr_general);
+ }
+ break;
+ case MG_DELETE_PHONEBOOK_LOCATION:
+ if (argc != 6) usage();
+ strcpy(ph.memtype,argv[4]);
+ ph.location = atoi(argv[5]);
+ if ( (ret = mg_delete_phonebook_location(&ph)) < 0)
+ printf("Delete Location Nr: %d failed (%d)\n",ph.location,ret);
+ else
+ {
+ printf("Delete Location Nr: %d succeded\n",ph.location);
+ }
+ break;
+ case MG_SEND_SMS:
+ if (argc != 6) usage();
+ strcpy(sms.destination,argv[4]);
+ strcpy(sms.message,argv[5]);
+ /* defaults */
+ sms.SMSCNumber[0] = '\0'; /* SMSC number */
+ sms.SMSCenterIndex = 0; /* SMSC number index in phone memory */
+ sms.SMSValidity= 0; /* validity of sms */
+ sms.enablevoice=FALSE; /* SMS enables voice indicator */
+ sms.disablevoice=FALSE; /* SMS disables voice indicator */
+ sms.enableemail=FALSE; /* SMS enables email indicator */
+ sms.disableemail=FALSE; /* SMS disables email indicator */
+ sms.enablefax=FALSE; /* SMS enables fax indicator */
+ sms.disablefax=FALSE; /* SMS disables fax indicator */
+ sms.unicode=FALSE; /* SMS coding type */
+ sms.delivery=FALSE;
+ if ( (ret = mg_send_sms(&sms)) < 0)
+ printf("send sms failed \n(%d)",ret);
+ else
+ {
+ printf("send sms succeded \n");
+ }
+ break;
+ default:
+ printf("unknown command\n");
+ usage();
+ }
+
+return(0);
+}
--- /dev/null
+/*
+ MYGNOKII net_api
+ Version 0.03 07.02.2002
+ <ralf@mythelen.de>
+ */
+
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/errno.h>
+#include <netinet/in.h>
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <netdb.h>
+#include <unistd.h>
+#include "mg_net_api.h"
+
+
+/* globals */
+static int mg_s; /* socket descriptor */
+static struct sockaddr_in mg_myaddr_in; /* for local socket address */
+static struct sockaddr_in mg_servaddr_in; /* for server socket address */
+static char mg_password[8]; /* passwd for udp-requsts */
+
+/*
+ * H A N D L E R
+ *
+ * This routine is the signal handler for the alarm signal.
+ * It simply re-installs itself as the handler and returns.
+ */
+void handler()
+{
+ signal(SIGALRM, handler);
+}
+
+/* Send the request to the server. */
+/* and wait for response */
+static int send_rq(MG_api_request *rq)
+{
+int ret;
+
+strncpy(rq->passwd,mg_password,8);
+
+if (sendto (mg_s, rq, sizeof(*rq), 0, (struct sockaddr *) &mg_servaddr_in,
+ sizeof(struct sockaddr_in)) == -1) {
+ return(-1);
+ }
+
+
+ /* Set up alarm signal handler. */
+signal(SIGALRM, handler);
+
+ /* Set up a timeout so I don't hang in case the packet
+ * gets lost. After all, UDP does not guarantee
+ * delivery.
+ */
+alarm(5);
+
+ /* Wait for the reply to come in. We assume that
+ * no messages will come from any other source,
+ * so that we do not need to do a recvfrom nor
+ * check the responder's address.
+ */
+
+/* RTH FIXME: TIMEOUT DONT WORK !! */
+ret = recv (mg_s, rq, sizeof(*rq), 0);
+switch (ret) {
+ case EINTR:
+ /* Alarm went off and aborted the receive. */
+ alarm(0);
+ return(MG_ERROR_TIMEOUT);
+ break;
+
+ default:
+ alarm(0);
+ return(ret);
+ break;
+ }
+}
+
+int mg_exit(void)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_EXIT;
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else return(rq.cmd);
+
+}
+
+int mg_version(MG_rq_version *version)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_VERSION;
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(version, rq.buffer, sizeof(*version));
+ return(rq.cmd);
+ }
+}
+
+int mg_identify(MG_rq_identify *ident)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_IDENTIFY;
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(ident, rq.buffer, sizeof(*ident));
+ return(rq.cmd);
+ }
+}
+
+int mg_memorystatus(MG_rq_memorystatus *stats)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_MEMORYSTATUS;
+memcpy(rq.buffer, stats, sizeof(*stats));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(stats, rq.buffer, sizeof(*stats));
+ return(rq.cmd);
+ }
+}
+
+int mg_get_memory_location(MG_rq_phonebook_location *rph)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_GET_MEMORY_LOCATION;
+memcpy(rq.buffer, rph, sizeof(*rph));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(rph, rq.buffer, sizeof(*rph));
+ return(rq.cmd);
+ }
+}
+
+int mg_write_phonebook_location(MG_rq_phonebook_location *wph)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_WRITE_PHONEBOOK_LOCATION;
+memcpy(rq.buffer, wph, sizeof(*wph));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(wph, rq.buffer, sizeof(*wph));
+ return(rq.cmd);
+ }
+}
+
+int mg_delete_phonebook_location(MG_rq_phonebook_location *dph)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_DELETE_PHONEBOOK_LOCATION;
+memcpy(rq.buffer, dph, sizeof(*dph));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(dph, rq.buffer, sizeof(*dph));
+ return(rq.cmd);
+ }
+}
+
+int mg_send_sms(MG_rq_send_sms *sms)
+{
+int ret;
+MG_api_request rq;
+
+rq.cmd = MG_SEND_SMS;
+memcpy(rq.buffer, sms, sizeof(*sms));
+
+ret = send_rq(&rq);
+
+if (ret < 0)
+ return(ret);
+else
+ {
+ memcpy(sms, rq.buffer, sizeof(*sms));
+ return(rq.cmd);
+ }
+}
+
+
+/*
+ mg_init
+ Input: Hostname of mygnokii-server
+ Output: connected udp-port on success, else -1
+*/
+int mg_init(char *hostname, char *passwd)
+{
+
+struct hostent *hp; /* pointer to host info for nameserver host */
+struct servent *sp; /* pointer to service information */
+
+/* set password */
+strncpy(mg_password,passwd,8);
+
+/* clear out address structures */
+memset ((char *)&mg_myaddr_in, 0, sizeof(struct sockaddr_in));
+memset ((char *)&mg_servaddr_in, 0, sizeof(struct sockaddr_in));
+
+/* Set up the server address. */
+mg_servaddr_in.sin_family = AF_INET;
+
+/* Get the host information for the server's hostname that the
+ * user passed in.
+ */
+hp = gethostbyname (hostname);
+if (hp == NULL) {
+ return(1);
+ }
+
+mg_servaddr_in.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;
+/* Find the information for the "example" server
+ * in order to get the needed port number.
+ */
+sp = getservbyname ("mygnokii", "udp");
+if (sp == NULL) {
+ /* not found -> use default port 50963 */
+ mg_servaddr_in.sin_port = htons(50963);
+ }
+else mg_servaddr_in.sin_port = sp->s_port;
+
+/* Create the socket. */
+mg_s = socket (AF_INET, SOCK_DGRAM, 0);
+if (mg_s == -1) {
+ return(-1);
+ }
+
+ /* Bind socket to some local address so that the
+ * server can send the reply back. A port number
+ * of zero will be used so that the system will
+ * assign any available port number. An address
+ * of INADDR_ANY will be used so we do not have to
+ * look up the internet address of the local host.
+ */
+mg_myaddr_in.sin_family = AF_INET;
+mg_myaddr_in.sin_port = 0;
+mg_myaddr_in.sin_addr.s_addr = INADDR_ANY;
+if (bind(mg_s, (struct sockaddr *) &mg_myaddr_in, sizeof(struct sockaddr_in)) == -1) {
+ return(-1);
+ }
+
+/* return portnumber */
+return(mg_servaddr_in.sin_port);
+
+}
+
--- /dev/null
+/*
+
+ ( M Y )G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ MyGnokii NET API
+
+ Version 0.3 Ralf Thelen 07.02.2002
+
+*/
+
+#ifndef __mg_net_api_h
+#define __mg_net_api_h
+
+#define MG_NET_API_MAJOR_VERSION 0
+#define MG_NET_API_MINOR_VERSION 3
+
+#define MG_ERROR (-1)
+#define MG_ERROR_TIMEOUT (-1001)
+
+#define TRUE 1
+#define FALSE 0
+
+typedef enum {
+ MG_INIT,
+ MG_EXIT,
+ MG_VERSION,
+ MG_IDENTIFY,
+ MG_MEMORYSTATUS,
+ MG_GET_MEMORY_LOCATION,
+ MG_WRITE_PHONEBOOK_LOCATION,
+ MG_DELETE_PHONEBOOK_LOCATION,
+ MG_SEND_SMS
+} MG_api_cmd;
+
+
+typedef struct {
+ MG_api_cmd cmd; /* requestet command */
+ char passwd[8]; /* password for udp requests */
+ char buffer[1024]; /* parameter */
+} MG_api_request;
+
+typedef struct {
+ int major;
+ int minor;
+} MG_rq_version;
+
+typedef struct {
+ char imei[64];
+ char model[64];
+ char rev[64];
+} MG_rq_identify;
+
+typedef struct {
+ char memtype[3];
+ int used;
+ int free;
+} MG_rq_memorystatus;
+
+typedef struct {
+ char memtype[3];
+ int location;
+ char name[51];
+ char group[49];
+ char nr_general[49];
+ char nr_mobile[49];
+ char nr_work[49];
+ char nr_fax[49];
+ char nr_home[49];
+ char note[51];
+ char postal[51];
+ char email[51];
+} MG_rq_phonebook_location;
+
+typedef struct {
+ char destination[12]; /* destination */
+ char message[161]; /* the message */
+ char SMSCNumber[100]; /* SMSC number */
+ int SMSCenterIndex; /* SMSC number index in phone memory */
+ int SMSValidity; /* validity of sms */
+ char longsms; /* long messages, NOT USED ! */
+ char enablevoice; /* SMS enables voice indicator */
+ char disablevoice; /* SMS disables voice indicator */
+ char enableemail; /* SMS enables email indicator */
+ char disableemail; /* SMS disables email indicator */
+ char enablefax; /* SMS enables fax indicator */
+ char disablefax; /* SMS disables fax indicator */
+ char unicode; /* SMS coding type */
+ char delivery; /* we want delivery report */
+} MG_rq_send_sms;
+
+/* Prototypes */
+int mg_init(char *hostname, char *passwd);
+int mg_exit(void);
+int mg_version(MG_rq_version *version);
+int mg_identify(MG_rq_identify *ident);
+int mg_memorystatus(MG_rq_memorystatus *stats);
+int mg_get_memory_location(MG_rq_phonebook_location *rph);
+int mg_write_phonebook_location(MG_rq_phonebook_location *wph);
+int mg_delete_phonebook_location(MG_rq_phonebook_location *dph);
+int mg_send_sms(MG_rq_send_sms *sms);
+
+#endif /* __mg_net_api_h */
--- /dev/null
+mg_net_api
+a simple network api for (my)gnokii
+
+(have also a look at demo-prg:
+ mg_demo_client.c)
+
+You need latest mygnokii-tarball, look at:
+Marcin Wiacek -> mailto:marcin-wiacek@topnet.pl
+http://marcin-wiacek.topnet.pl (http://marcin-wiacek.fkn.pl/) -> netmonitor,
+firmware, mygnokii (GSM & Nokia)
+http://www.mds.mdh.se/~cel95eig/mygnokii/ &
+http://grumble.zereau.com/gnokii/ & http://reinhold.bachrain.de/ -> mygnokii
+mirrors
+
+- install mygnokii
+- customize .gnokii.rc (at least gnokii --identify should run)
+- run udp network daeon with: mgnetd <password>
+
+--------------------------------------------------------------------------------
+
+
+
+Version 0.3
+
+All functions return a negative value if there is an error.
+
+--------------------------------------------------------------------------------
+
+int mg_init(char *hostname, char *passwd);
+char *hostname - Hostname or IP-Address of Server with running mygnokii server.
+ (could be 'localhost' if mygnokii runs on same machine)
+char *passwd - password of running mygnokii server
+
+This function MUST be called first in your program.
+
+--------------------------------------------------------------------------------
+
+int mg_exit(void);
+
+Kill the running mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_version(MG_rq_version *version);
+typedef struct {
+ int major;
+ int minor;
+} MG_rq_version;
+
+Get versioninformation from running mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_identify(MG_rq_identify *ident);
+typedef struct {
+ char imei[64];
+ char model[64];
+ char rev[64];
+} MG_rq_identify;
+
+Get imei, model and revision from phone connected to mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_memorystatus(MG_rq_memorystatus *stats);
+typedef struct {
+ char memtype[3]; -> ME for internal phonememory, SM for SIM-Card
+ int used; -> free entrys within selected memory
+ int free; -> used entrys within selected memory
+} MG_rq_memorystatus;
+
+Get memory status from phone connected to mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_get_memory_location(MG_rq_phonebook_location *rph);
+typedef struct {
+ char memtype[3]; -> ME for internal phonememory, SM for SIM-Card
+ int location; -> location of entry within selected memory
+ char name[51];
+ char group[49];
+ char nr_general[49];
+ char nr_mobile[49];
+ char nr_work[49];
+ char nr_fax[49];
+ char nr_home[49];
+ char note[51];
+ char postal[51];
+ char email[51];
+} MG_rq_phonebook_location;
+
+Get phonebook entry at location-number from phone connected to mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_write_phonebook_location(MG_rq_phonebook_location *wph);
+typedef struct {
+ char memtype[3]; -> ME for internal phonememory, SM for SIM-Card
+ int location; -> location of entry within selected memory
+ char name[51];
+ char group[49];
+ char nr_general[49];
+ char nr_mobile[49];
+ char nr_work[49];
+ char nr_fax[49];
+ char nr_home[49];
+ char note[51];
+ char postal[51];
+ char email[51];
+} MG_rq_phonebook_location;
+
+Write phonebook entry to location-number from phone connected to mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_delete_phonebook_location(int location)
+int location - Location of phonebookentry to delete
+
+Delete phonebook entry at location-number from phone connected to mygnokii server
+
+--------------------------------------------------------------------------------
+
+int mg_send_sms(MG_rq_send_sms *sms);
+typedef struct {
+ char destination[12]; /* destination */
+ char message[161]; /* the message */
+ char SMSCNumber[100]; /* SMSC number (could be NULL)*/
+ int SMSCenter; /* SMSC number index in phone memory */
+ int SMSValidity; /* validity of sms eg: 4320 -> 3 days !*/
+ char longsms; /* long messages, NOT USED ! */
+ char enablevoice; /* SMS enables voice indicator TRUE/FALSE*/
+ char disablevoice; /* SMS disables voice indicator TRUE/FALSE*/
+ char enableemail; /* SMS enables email indicator TRUE/FALSE*/
+ char disableemail; /* SMS disables email indicator TRUE/FALSE*/
+ char enablefax; /* SMS enables fax indicator TRUE/FALSE*/
+ char disablefax; /* SMS disables fax indicator TRUE/FALSE*/
+ char unicode; /* SMS coding type TRUE/FALSE*/
+ char delivery; /* we want delivery report TRUE/FALSE*/
+} MG_send_sms;
+Send sms message 'message' to destination at 'destination' via phone connected to mygnokii server
+
+--------------------------------------------------------------------------------
--- /dev/null
+/*
+
+ G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+ Mainline code for mgnetd daemon.
+
+ Last modification: 07.02.2002
+ Ralf Thelen <ralf@mythelen.de>
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <signal.h>
+#include <string.h>
+#include <ctype.h>
+#include <time.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/errno.h>
+#include <netinet/in.h>
+#include <netdb.h>
+
+#if defined(__svr4__) || defined(__FreeBSD__)
+ # include <strings.h> /* for bzero */
+#endif
+
+#include <unistd.h>
+#include <termios.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <getopt.h>
+
+#include "misc.h"
+#include "files/cfgreader.h"
+#include "gsm-common.h"
+#include "gsm-api.h"
+#include "mgnetd.h"
+
+#ifdef USE_NLS
+ #include <locale.h>
+#endif
+
+/* Global variables */
+char *Model; /* Model from .gnokiirc file. */
+char *Port; /* Port from .gnokiirc file */
+char *Initlength; /* Init length from .gnokiirc file */
+char *Connection; /* Connection type from .gnokiirc file */
+char *SynchronizeTime;
+char *BinDir; /* Directory of the mgnokiidev command */
+
+
+void usage(void)
+{
+
+ fprintf(stdout, _("mgnetd Version %d.%d, a udp server for mygnokii\n based on Version %s\n"
+ "Built %s %s for %s on %s \n")
+ ,MG_NET_API_MAJOR_VERSION,MG_NET_API_MINOR_VERSION, VERSION, __TIME__, __DATE__, Model, Port);
+ fprintf(stdout, _(" usage: mgnetd passwd\n"));
+ exit(1);
+}
+
+/* fbusinit is the generic function which waits for the FBUS link. The limit
+ is 10 seconds. After 10 seconds we quit. */
+
+void fbusinit(void (*rlp_handler)(RLP_F96Frame *frame))
+{
+
+ int count=0;
+ GSM_Error error;
+
+#ifndef WIN32
+ if (strcmp(GetMygnokiiVersion(),VERSION)!=0)
+ fprintf(stderr,_("WARNING: version of installed libmygnokii.so (%s) is different to version of mgnetd (%s)\n"),GetMygnokiiVersion(),VERSION);
+#endif
+
+ /* Initialise the code for the GSM interface. */
+ error = GSM_Initialise(Model, Port, Initlength, GetConnectionTypeFromString(Connection), rlp_handler, SynchronizeTime);
+
+ if (error != GE_NONE) {
+ fprintf(stderr, _("GSM/FBUS init failed! (Unknown model ?). Quitting.\n"));
+ exit(-1);
+ }
+
+ /* First (and important!) wait for GSM link to be active. We allow 10
+ seconds... */
+ while (count++ < 200 && *GSM_LinkOK == false)
+ usleep(50000);
+
+ if (*GSM_LinkOK == false) {
+ fprintf (stderr, _("Hmmm... GSM_LinkOK never went true. Quitting.\n"));
+ exit(-1);
+ }
+}
+
+
+/*
+ main
+ simple udp-based server
+ */
+int main(int argc, char *argv[])
+{
+
+MG_api_request rq;
+MG_rq_version version;
+MG_rq_identify ident;
+MG_rq_memorystatus status;
+MG_rq_phonebook_location ph;
+MG_rq_send_sms sms;
+
+GSM_PhonebookEntry entry;
+GSM_MemoryStatus stats;
+GSM_RFUnits rf_units = GRF_Arbitrary;
+GSM_BatteryUnits batt_units = GBU_Arbitrary;
+
+GSM_MultiSMSMessage MultiSMS;
+GSM_SMSMessageType SMSType=GST_SMS;
+int SMSClass = -1;
+bool SMSReply = false;
+GSM_Coding_Type SMSCoding = GSM_Coding_Default;
+GSM_UDH SMSUDHType = GSM_NoUDH;
+
+char password[8];
+
+char memory_type_string[20];
+
+float rflevel=-1, batterylevel=-1;
+
+time_t curr_t, last_t;
+
+int s; /* socket descriptor */
+int cc; /* contains the number of bytes read */
+
+struct servent *sp; /* pointer to service information */
+
+struct sockaddr_in myaddr; /* for local socket address */
+struct sockaddr_in clientaddr; /* for client's socket address */
+
+extern int errno; /* for unblocking io */
+
+int addrlen;
+int error_cnt = 0;
+int i;
+
+/* For GNU gettext */
+#ifdef USE_NLS
+ textdomain("gnokii");
+ setlocale(LC_ALL, "pl_PL"); //here is string for Polish localisation
+#endif
+
+ /* Read config file */
+ if (CFG_ReadConfig(&Model, &Port, &Initlength, &Connection, &BinDir, &SynchronizeTime,false) < 0) {
+ exit(-1);
+ }
+
+/* Handle command line arguments. */
+if (argc != 2) usage();
+
+/* get password from commandline */
+strncpy(password,argv[1],8);
+
+
+/* init timevars */
+curr_t = last_t = time(NULL);
+
+/* clear out address structures */
+memset ((char *)&myaddr, 0, sizeof(struct sockaddr_in));
+memset ((char *)&clientaddr, 0, sizeof(struct sockaddr_in));
+
+/* Set up address structure for the socket. */
+myaddr.sin_family = AF_INET;
+myaddr.sin_addr.s_addr = INADDR_ANY;
+
+sp = getservbyname ("mygnokii", "udp");
+ if (sp == NULL) {
+#ifdef DEBUG
+ printf("mygnokii not found in /etc/services\n");
+ printf("using default port 50963\n");
+#endif
+ myaddr.sin_port = htons(50963);
+ }
+ else myaddr.sin_port = sp->s_port;
+
+
+ /* Create the socket. */
+ s = socket (AF_INET, SOCK_DGRAM, 0);
+ if (s == -1) {
+ perror(argv[0]);
+ printf("%s: unable to create socket\n", argv[0]);
+ exit(1);
+ }
+
+ /* Bind the server's address to the socket. */
+ if (bind(s, (struct sockaddr *) &myaddr, sizeof(struct sockaddr)) == -1) {
+ perror(argv[0]);
+ printf("%s: unable to bind address\n", argv[0]);
+ exit(1);
+ }
+
+ /* Make socket unblocking */
+ if ( fcntl(s, F_SETFL, O_NONBLOCK) == -1) {
+ perror(argv[0]);
+ printf("%s: unable to make socket unblocking\n", argv[0]);
+ exit(1);
+ }
+
+
+ setpgrp();
+
+ switch (fork()) {
+ case -1: /* Unable to fork, for some reason. */
+ perror(argv[0]);
+ printf("%s: unable to fork daemon\n", argv[0]);
+ exit(1);
+
+ case 0:
+
+ /* init GSM Interface */
+ fbusinit(NULL);
+ printf("init done, daemonizing\n");
+
+#ifndef DEBUG
+ close(0);
+ close(1);
+ close(2);
+#endif
+
+ for(;;) {
+ addrlen = sizeof(struct sockaddr_in);
+
+ cc = recvfrom(s, &rq, sizeof(rq), 0,
+ (struct sockaddr *) &clientaddr, &addrlen);
+
+ if ( cc == -1)
+ {
+ if ( errno != EAGAIN) exit(1);
+ else
+ { /* no data -> do some usefull things */
+ /* required for infrared connections to prevent timeouts */
+ curr_t = time(NULL);
+ if ( difftime(curr_t, last_t) > 5 )
+ {
+ if (GSM->GetRFLevel(&rf_units, &rflevel) != GE_NONE)
+ error_cnt++;
+ else
+ error_cnt=0;
+ if (GSM->GetBatteryLevel(&batt_units, &batterylevel) != GE_NONE)
+ error_cnt++;
+ else
+ error_cnt=0;
+ last_t = curr_t = time(NULL);
+ }
+ continue;
+ }
+ }/* if( cc == -1) */
+
+ /* don't answer if we see wrong password */
+ if (strncmp(password, rq.passwd, 8) != 0) continue;
+
+#ifdef DEBUG
+ printf("server: received cmd Nr. %d\n",rq.cmd);
+#endif
+ switch (rq.cmd)
+ {
+ case MG_INIT:
+ /* RTH FIXME: for Version 0.1, init is done at startup */
+ break;
+ case MG_EXIT:
+ GSM->Terminate();
+ break;
+ case MG_VERSION:
+ version.major = MG_NET_API_MAJOR_VERSION;
+ version.minor = MG_NET_API_MINOR_VERSION;
+ memcpy(rq.buffer, &version, sizeof(version));
+ break;
+ case MG_IDENTIFY:
+ /* RTH FIXME: check errors */
+ while (GSM->GetIMEI(ident.imei) != GE_NONE) sleep(1);
+ while (GSM->GetRevision(ident.rev) != GE_NONE) sleep(1);
+ while (GSM->GetModel(ident.model) != GE_NONE) sleep(1);
+ memcpy(rq.buffer, &ident, sizeof(ident));
+ break;
+
+ case MG_MEMORYSTATUS:
+ memcpy(&status, rq.buffer, sizeof(status));
+#ifdef DEBUG
+ printf("server: getmemorystaus for %s requested\n",status.memtype);
+#endif
+ if (!GetMemoryTypeID(status.memtype, &stats.MemoryType))
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ if ( GSM->GetMemoryStatus( &stats) != GE_NONE)
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ status.free = stats.Free;
+ status.used = stats.Used;
+ memcpy(rq.buffer, &status, sizeof(status));
+ break;
+ case MG_GET_MEMORY_LOCATION:
+ memcpy(&ph, rq.buffer, sizeof(ph));
+#ifdef DEBUG
+ printf("server: getmemorylocation for %s, Location: %d requested\n",ph.memtype,ph.location);
+#endif
+ ph.name[0] = ph.group[0] = ph.nr_general[0] = ph.nr_mobile[0] = ph.nr_work[0] = '\0';
+ ph.nr_fax[0] = ph.nr_home[0] = ph.note[0] = ph.postal[0] = ph.email[0] = '\0';
+ if (!GetMemoryTypeID(ph.memtype, &entry.MemoryType))
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ entry.Location = ph.location;
+ GetMemoryTypeString(memory_type_string, &entry.MemoryType);
+ if ( GSM->GetMemoryLocation(&entry) != GE_NONE)
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ strcpy(ph.name,entry.Name);
+ strcpy(ph.nr_general,entry.Number);
+ //strcpy(ph.group,NAMEOF:entry.group);
+ for( i = 0; i < entry.SubEntriesCount; i++ )
+ {
+ switch(entry.SubEntries[i].EntryType)
+ {
+ case GSM_Number:
+ switch(entry.SubEntries[i].NumberType)
+ {
+ case GSM_Mobile:
+ strcpy(ph.nr_mobile,entry.SubEntries[i].data.Number);
+ break;
+ case GSM_Work:
+ strcpy(ph.nr_work,entry.SubEntries[i].data.Number);
+ break;
+ case GSM_Fax:
+ strcpy(ph.nr_fax,entry.SubEntries[i].data.Number);
+ break;
+ case GSM_Home:
+ strcpy(ph.nr_home,entry.SubEntries[i].data.Number);
+ break;
+ default:
+ break;
+ }
+ break;
+ case GSM_Note:
+ strcpy(ph.note,entry.SubEntries[i].data.Number);
+ break;
+ case GSM_Postal:
+ strcpy(ph.postal,entry.SubEntries[i].data.Number);
+ break;
+ case GSM_Email:
+ strcpy(ph.email,entry.SubEntries[i].data.Number);
+ break;
+ default:
+ break;
+ }
+ }//for
+ memcpy(rq.buffer, &ph, sizeof(ph));
+ break;
+ case MG_WRITE_PHONEBOOK_LOCATION:
+ memcpy(&ph, rq.buffer, sizeof(ph));
+#ifdef DEBUG
+ printf("server: writememorylocation for Location: %d requested\n",ph.location);
+#endif
+ if (!GetMemoryTypeID(ph.memtype, &entry.MemoryType))
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ GetMemoryTypeString(memory_type_string, &entry.MemoryType);
+ if ( GSM->GetMemoryLocation(&entry) != GE_NONE)
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ entry.Location = ph.location;
+ entry.SubEntriesCount = 0;
+ strcpy(entry.Name,ph.name);
+ strcpy(entry.Number,ph.nr_general);
+ //if ( ph.group[0] != '\0') Version 0.3 !!
+ if ( ph.nr_mobile[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Number;
+ entry.SubEntries[entry.SubEntriesCount].NumberType = GSM_Mobile;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.nr_mobile);
+ entry.SubEntriesCount++;
+ }
+ if ( ph.nr_work[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Number;
+ entry.SubEntries[entry.SubEntriesCount].NumberType = GSM_Work;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.nr_work);
+ entry.SubEntriesCount++;
+ }
+ if ( ph.nr_fax[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Number;
+ entry.SubEntries[entry.SubEntriesCount].NumberType = GSM_Fax;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.nr_fax);
+ entry.SubEntriesCount++;
+ }
+ if ( ph.nr_home[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Number;
+ entry.SubEntries[entry.SubEntriesCount].NumberType = GSM_Home;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.nr_home);
+ entry.SubEntriesCount++;
+ }
+ if ( ph.note[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Note;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.note);
+ entry.SubEntriesCount++;
+ }
+ if ( ph.postal[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Postal;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.postal);
+ entry.SubEntriesCount++;
+ }
+ if ( ph.email[0]!= '\0')
+ {
+ entry.SubEntries[entry.SubEntriesCount].EntryType = GSM_Email;
+ strcpy(entry.SubEntries[entry.SubEntriesCount].data.Number,ph.email);
+ entry.SubEntriesCount++;
+ }
+
+ /* This is to send other exports (like from 6110) to 7110 */
+ if (!entry.SubEntriesCount) {
+ entry.SubEntriesCount = 1;
+ entry.SubEntries[0].EntryType = GSM_Number;
+ entry.SubEntries[0].NumberType = GSM_General;
+ entry.SubEntries[0].BlockNumber = 2;
+ strcpy(entry.SubEntries[0].data.Number, entry.Number);
+ }
+
+ if (GSM->WritePhonebookLocation(&entry) != GE_NONE)
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ memcpy(rq.buffer, &ph, sizeof(ph));
+ break;
+ case MG_DELETE_PHONEBOOK_LOCATION:
+ memcpy(&ph, rq.buffer, sizeof(ph));
+#ifdef DEBUG
+ printf("server: deletememorylocation for Location: %d requested\n",ph.location);
+#endif
+ if (!GetMemoryTypeID(ph.memtype, &entry.MemoryType))
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ GetMemoryTypeString(memory_type_string, &entry.MemoryType);
+ if ( GSM->GetMemoryLocation(&entry) != GE_NONE)
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ entry.SubEntriesCount = 0;
+ entry.Name[0] = '\0';
+ entry.Number[0] = '\0';
+ entry.Location = ph.location;
+ if (GSM->WritePhonebookLocation(&entry) != GE_NONE)
+ {
+ rq.cmd = -1; /* error */
+ break;
+ }
+ memcpy(rq.buffer, &ph, sizeof(ph));
+ break;
+ case MG_SEND_SMS:
+ memcpy(&sms, rq.buffer, sizeof(sms));
+#ifdef DEBUG
+ printf("server: sendsms to %s requested\n",sms.destination);
+ printf("server: message:%s\n",sms.message);
+ printf("server: Centerindex = %d\n",sms.SMSCenterIndex);
+#endif
+ /* options */
+ if(sms.enablevoice) SMSUDHType=GSM_EnableVoice;
+ if(sms.disablevoice) SMSUDHType=GSM_DisableVoice;
+ if(sms.enableemail) SMSUDHType=GSM_EnableEmail;
+ if(sms.disableemail) SMSUDHType=GSM_DisableEmail;
+ if(sms.enablefax) SMSUDHType=GSM_EnableFax;
+ if(sms.disablefax) SMSUDHType=GSM_DisableFax;
+ if(sms.unicode) SMSCoding=GSM_Coding_Unicode;
+
+ /* message */
+ GSM_MakeMultiPartSMS2(&MultiSMS,sms.message,strlen(sms.message),SMSUDHType,SMSCoding);
+ MultiSMS.SMS[0].Class=SMSClass;
+ MultiSMS.SMS[0].ReplyViaSameSMSC=SMSReply;
+ MultiSMS.SMS[0].Type=SMSType;
+
+
+ /* Message Center index */
+ if (sms.SMSCenterIndex == 0 )
+ MultiSMS.SMS[0].MessageCenter.No = 1;
+ else
+ {
+ if (sms.SMSCenterIndex < 0 || sms.SMSCenterIndex > 5)
+ {
+ rq.cmd = -2; /* error */
+ break;
+ }
+ MultiSMS.SMS[0].MessageCenter.No = sms.SMSCenterIndex;
+ }
+
+ /* Message Center number */
+ if(strlen(sms.SMSCNumber) > 0)
+ {
+ MultiSMS.SMS[0].MessageCenter.No = 0;
+ strcpy(MultiSMS.SMS[0].MessageCenter.Number,sms.SMSCNumber);
+ }
+
+ /* destination */
+ strcpy(MultiSMS.SMS[0].Destination,sms.destination);
+
+ /* delivery report */
+ if(sms.delivery) MultiSMS.SMS[0].Type=GST_DR;
+
+ /* validity */
+ if (sms.SMSValidity != 0)
+ MultiSMS.SMS[0].Validity=sms.SMSValidity;
+ else
+ MultiSMS.SMS[0].Validity=4320; /* 3 days */
+
+ if( GSM->SendSMSMessage(&MultiSMS.SMS[0]) != GE_SMSSENDOK )
+ {
+ rq.cmd = -3; /* error */
+ break;
+ }
+
+ memcpy(rq.buffer, &sms, sizeof(sms));
+ break;
+ default:
+ rq.cmd = -1;
+ break;
+
+ }
+
+ sendto (s, &rq, sizeof(rq), 0, (struct sockaddr *) &clientaddr, addrlen);
+ if (rq.cmd == MG_EXIT) exit(0);
+ }
+
+ default: /* Parent process comes here. */
+ exit(0);
+ }
+}
--- /dev/null
+/*
+
+ ( M Y )G N O K I I
+
+ A Linux/Unix toolset and driver for Nokia mobile phones.
+
+ MyGnokii NET API
+
+ Version 0.3 Ralf Thelen 07.02.2002
+
+*/
+
+#ifndef __mgnetd_h
+#define __mgnetd_h
+
+#define MG_NET_API_MAJOR_VERSION 0
+#define MG_NET_API_MINOR_VERSION 3
+
+#define MG_ERROR (-1)
+#define MG_ERROR_TIMEOUT (-1001)
+
+#define TRUE 1
+#define FALSE 0
+
+typedef enum {
+ MG_INIT,
+ MG_EXIT,
+ MG_VERSION,
+ MG_IDENTIFY,
+ MG_MEMORYSTATUS,
+ MG_GET_MEMORY_LOCATION,
+ MG_WRITE_PHONEBOOK_LOCATION,
+ MG_DELETE_PHONEBOOK_LOCATION,
+ MG_SEND_SMS
+} MG_api_cmd;
+
+
+typedef struct {
+ MG_api_cmd cmd; /* requestet command */
+ char passwd[8]; /* password for udp requests */
+ char buffer[1024]; /* parameter */
+} MG_api_request;
+
+typedef struct {
+ int major;
+ int minor;
+} MG_rq_version;
+
+typedef struct {
+ char imei[64];
+ char model[64];
+ char rev[64];
+} MG_rq_identify;
+
+typedef struct {
+ char memtype[3];
+ int used;
+ int free;
+} MG_rq_memorystatus;
+
+typedef struct {
+ char memtype[3];
+ int location;
+ char name[51];
+ char group[49];
+ char nr_general[49];
+ char nr_mobile[49];
+ char nr_work[49];
+ char nr_fax[49];
+ char nr_home[49];
+ char note[51];
+ char postal[51];
+ char email[51];
+} MG_rq_phonebook_location;
+
+typedef struct {
+ char destination[12]; /* destination */
+ char message[161]; /* the message */
+ char SMSCNumber[100]; /* SMSC number */
+ int SMSCenterIndex; /* SMSC number index in phone memory */
+ int SMSValidity; /* validity of sms */
+ char longsms; /* long messages, NOT USED ! */
+ char enablevoice; /* SMS enables voice indicator */
+ char disablevoice; /* SMS disables voice indicator */
+ char enableemail; /* SMS enables email indicator */
+ char disableemail; /* SMS disables email indicator */
+ char enablefax; /* SMS enables fax indicator */
+ char disablefax; /* SMS disables fax indicator */
+ char unicode; /* SMS coding type */
+ char delivery; /* we want delivery report */
+} MG_rq_send_sms;
+
+#endif /* __mgnetd_h */
--- /dev/null
+The MGNETD (MyGnokiiNETDdaemon) program is intended
+to provide a network api for mygnokii. With MGNETD
+running in the background and a small netapi,
+you can use the features of mygnokii in your own programs.
+(See mg_demo_client.c)
+I plan a 'plugin' with mg_net_api Interface
+for jpilot, to sync phonebook (and later calender)
+between phone and palm.
+
+I provide it for free use under GPL.
+I provide the program AS IS without any warranty.
+
+For MGNETD you need a running mygnokii installation !
+
+
+To start MGNETD, chose a passwort and type:
+
+ mgnet password
+
+If all is OK, you see a small message:
+ 'init done, daemonizing'
+and mgnet runs in the background and serv udp
+requests from any client who knows the password.
+
+
+By default MGNETD listen at udp Port 50963.
+You can add a entry to your '/etc/services' file
+to change this, eg. to listen port 21007 add this line:
+
+mygnokii 21007/udp
+
+
+--------------------------------------------
+
+In Version 0.3 you could:
+- read IMEI,REVISION,HW of connected phone
+- read phonebookentrys
+- write phonebookentrys
+- delete phonebookentrys
+- send sms messages
+
+TODOS:
+- implement timeout for client
+- handle receive sms
+
+Ralf Thelen <ralf@mythelen.de>
--- /dev/null
+gnokii (@VERSION@) stable; urgency=low
+ * - Not changes for debian package in source
+ * - This file generate gnokii's build system (sorry deb's guru..)
+
+ -- Karel Zak <zakkr@zf.jcu.cz> Wed, 17 May 2000 13:56:28 +0100
+
+gnokii (0.3.2_pre1) unstable; urgency=low
+ * - Not changes for debian package in source
+
+ -- Karel Zak <zakkr@zf.jcu.cz> Tue, 11 Jan 2000 16:57:00 +0100
+
+Local variables:
+mode: debian-changelog
+End:
--- /dev/null
+1.What is this ?
+----------------
+This is my own version of gnokii...
+
+It's related rather to improvements in command line gnokii and in the main code.
+It was created from CVS gnokii 0.3.3_pre8-gold and contains many other changes.
+I decided to make it, since gnokii project seemed to be frozen (from 07.2000 ?)
+and my changes were ignored
+
+In this moment CVS gnokii is developed again. It went into different
+direction (doesn't use threads and probably will work better on multi CPU
+systems), but many functions still are worse than in mygnokii
+Now there is small cooperation of these two projects(some new CVS source is in mygnokii and some things from mygnokii are in CVS),but they're more and more different and I don't know, if they will join
+again (well, I implemented almost all Smart Messaging and other functions
+Everything works rather correct and only bugs need to be removed. Because of
+it I'm not sure, if it will have sence for me to write it again for CVS gnokii- especially, that I don't like organisation there and IMHO every change needs
+there tons of explanations and emails)
+
+So, if you think, that mygnokii works better for you, use it and please help
+in improving or testing. I will try to answer on each your email (of course,
+I can't promise :-( ).
+
+If you like more CVS gnokii, use gnokii. That's all.
+
+2.Where to send your updates to gnokii ?
+----------------------------------------
+If you made something - patch, script, etc., which could be useful for gnokii
+users, please send it to the Marcin-Wiacek@Topnet.PL. THX
+
+3.How to apply patches ?
+------------------------
+Make "patch < patchfile", where patchfile is name of file with patch.
+
+4.How to create patches ?
+-------------------------
+1.copy source with gnokii, you start from, into "gnokii" dir
+2.copy source with gnokii, you want to modify, into "work" dir
+3.make changes in "work"
+4.go into subdirectory with "gnokii" and "work"
+5.make "diff -urx CVS gnokii work > patchfile"
+6.send "patchfile" to me ;-)
+
+5.TODO
+------
+6210:
+ * setting Picture Images
+ * support for voice tags in phonebook
+ * NBS (with preview) uploading for caller/op logos
+ * test and eventually make full support for speed dials
+
+Other:
+ * make DLR3 init using AT-commands (will work for more phones)
+ * support for 5210, 5510, 6310, 6510, 8310 (sniffs required)
+ * support for irda sockets in win32
+ * EMS
+ * support for more AT phones and commands
+ * compatibility with gnomecal (Bostjan - I remember ;-))
+ * end xgnokii
+ * move some things from gnokii (lockfile, setting smsc in gnokii)
+
+6.BUGS and INCOMPATIBILITIES
+----------------------------
+Other:
+ * gnome viewers have sometimes problems with displaying bmp files
+ written by gnokii. This is NOT mygnokii fault.
+ * phone sometimes doesn't want to speak over mbus (when previous
+ transmission was cut - some ACK were not sent/received) in command line
+ gnokii in Unix/Linux. Must restart phone and then and works...
+ * sometimes, when read alphanumeric numbers, name is 1 char too long
+ * when save some SMS to phone (8 bit with UDH), after forwarding them
+ from phone menu they're changed. 100% firmware bug (6210, probably
+ each Nokia phone with SMS memory)
+
+-----
+If know some other, please let me know to marcin-wiacek@topnet.pl.
+Please include version of mygnokii, description of bug and debug info from it
+(you can use "logfile" option in gnokiirc to make it).
+
\ No newline at end of file
--- /dev/null
+#!/bin/bash
+###############################################################################
+#
+# SENDSMS -- Script to send sms by 'gnokii'
+# Author : Gabriele Zappi - Rimini <gzappi@inwind.it>
+# History:
+# feb 17, 2001 Script created (v1.0)
+###############################################################################
+
+###############################################################################
+###############################################################################
+# PROGNAME=`basename $0`
+
+# var settings.
+
+PROGNAME=${0##*/}
+VERSION="1.02"
+GNOKII=./gnokii
+PID=$$
+SMSDIR=~/tmp/sms
+TMP=~/tmp/SMStmp.$PID
+BACKTITLE="SENDSMS V$VERSION"
+AUTHOR="Gabriele Zappi - Rimini <gzappi@inwind.it>"
+
+help() {
+echo "$PROGNAME: $BACKTITLE - A gnokii interface for sending SMS."
+echo "Written by $AUTHOR"
+
+echo -e "\
+\n\
+Usage: $PROGNAME [OPTION]...\n\
+\n\
+Examples:\n\
+ $PROGNAME # simply run $PROGNAME in standard mode\n\
+ $PROGNAME --simulate # Simulates. doesn't really send sms (for debug)\n\
+ echo \"Hello Beauty ;-)\" | $PROGNAME --smsset\n\
+ # Preset \"Hello Beauty ;-)\" as SMS message.\n\
+ $PROGNAME --smsset < mymessage.txt\n\
+ # Preset contents of file mymessage.txt \n\
+ as SMS message.\n\
+ $PROGNAME --version # Display version, author and quits.\n\
+\n\
+NOTE:\n\
+If you require to pickup number from phone's memory (really from SIM card),\n\
+for the first time, it anyway reads phonebook from your cellular phone. \n\
+(It may take a while... please, be patient ;-) \n\
+\n\
+Available options:\n\
+ --debug, -D May bother with more debugging messages ;-)\n\
+ For debugging purpose.\n\
+ --simul[ate], -S Simulation mode. Doesn't really send SMS by phone. \n\
+ Only simulates. For debugging purpose.\n\
+ --forcememread, -F Forces $PROGNAME to read phonebook from SIM card,\n\
+ and to parse the generated file in order to update\n\
+ the numbers' list (useful only if required to pickup\n\
+ number from the phone's memory). see NOTE.\n\
+ --skipgnokiicheck, -K Skip the test of the presence of binary 'gnokii'.\n\
+ (It must be somewhere in your \$PATH). It allows you\n\
+ to try this script program, even if you don't have\n\
+ 'gnokii' already. ;)\n\
+ --smsset, --setsms Allows you to preset a SMS message from STDIN. (pipe\n\
+ or input redirection).\n\
+ This message will be proposed on the 'SMS message'\n\
+ field during the program input cycle.\n\
+ --help, -h, /h display this help and exit\n\
+ --version, -V output version information and exit"
+echo
+exit 0
+}
+
+acex()
+{
+ rm -rf $TMP >/dev/null 2>&1
+ clear
+ exit $1
+}
+
+parse_stdin() {
+ # Switch initialization
+ SW_DEBUG=no
+ SW_SIMUL=no
+ SW_FORCEMREAD=no
+ SW_SKIPGNOKITST=no
+ SW_PRESETSMS=no
+ PRESETSMS=""
+
+ while [ -n "$1" ]
+ do
+ case "$1" in
+ --help|-h|/h)
+ help
+ ;;
+ --version|-V)
+ echo
+ echo "$BACKTITLE - A gnokii interface for sending SMS."
+ echo "Written by $AUTHOR"
+ echo
+ exit 0
+ ;;
+ --simul*|-S)
+ SW_SIMUL=yes
+ ;;
+ --debug*|-D)
+ SW_DEBUG=yes
+ SW_SIMUL=yes
+ ;;
+ --forcememread|-F)
+ SW_FORCEMREAD=yes
+ ;;
+ --skipgnokiicheck|-K)
+ SW_SKIPGNOKITST=yes
+ ;;
+ --smsset|--msgset|--setsms)
+ SW_PRESETSMS=yes
+ # will read from stdin
+ echo "reading sms from stdin .."
+ PRESETSMS=`cat`
+ ;;
+ *)
+ echo "$PROGNAME: Invalid parameter: "
+ help
+ ;;
+ esac
+ shift
+ done
+}
+
+sure_to_quit() {
+ dialog --backtitle "$BACKTITLE" \
+ --yesno "Really sure to quit? " 6 50
+ if [ $? -eq 0 ]; then
+ acex 0
+ fi
+}
+
+SMS_phoneread() {
+dialog --backtitle "$BACKTITLE" --infobox "Reading phonebook by phone's SIM\n Please wait" 4 40
+$GNOKII --getmemory SM 1 130 > $SMSDIR/.SMlist.temp
+}
+
+SMS_choicefrommem() {
+ # read from phonebook.
+ if [ "$SW_FORCEMREAD" = "yes" ] ; then
+ readsim=1
+ elif [ -s $SMSDIR/.SMlist.sim ]; then
+ dialog --backtitle "INSERT NUMBER(s).." \
+ --yesno "A SIM phonebook file is already present. \
+ Do you want to read phone memory anyway?" 8 60
+ if [ $? -eq 0 ] ; then
+ readsim=1
+ else
+ readsim=0
+ fi
+ else
+ readsim=1
+ fi
+
+ ERROR=0
+ if [ $readsim -eq 1 ] ; then
+ SMS_phoneread
+ if [ $? -ne 0 ] ; then
+ dialog --backtitle "INSERT NUMBER(s).." \
+ --msgbox "ERROR during reading memory from your phone... \
+ Insert manually destination number." 8 60
+ ERROR=1
+ else
+ mv -f $SMSDIR/.SMlist.temp $SMSDIR/.SMlist.sim
+ fi
+ fi
+
+ if [ $ERROR -eq 0 ]; then
+ # Parsing sim file...
+ if [ ! -s $SMSDIR/.SMlist.chklst -o ! -s $SMSDIR/.SMlist.choice \
+ -o $readsim -eq 1 ] ; then
+ > $SMSDIR/.SMlist.menu
+ > $SMSDIR/.SMlist.chklst
+ > $SMSDIR/.SMlist.choice
+ totrows=`cat $SMSDIR/.SMlist.sim | wc -l`
+ rownow=0
+ (while read riga
+ do
+ rownow=`expr $rownow + 1`
+ perc=`expr $rownow \* 100 / $totrows`
+ pos=`echo $riga | cut -f4 -d";"`
+ name=`echo $riga | cut -f1 -d";"`
+ num=`echo $riga | cut -f2 -d";"`
+ if [ -n "$pos" -a -n "$num" ] ; then
+ echo -e "$pos \"$name - $num\"" >> $SMSDIR/.SMlist.menu
+ echo -e "$pos \"$name - $num\" off" >> $SMSDIR/.SMlist.chklst
+ echo "$pos;$num" >> $SMSDIR/.SMlist.choice
+ fi
+ echo $perc
+ done < $SMSDIR/.SMlist.sim) | dialog \
+ --gauge "Parsing phonebook file..." 12 70 0
+ fi
+
+ chkok=0
+ option=0
+ while [ $chkok -eq 0 ]
+ do
+ eval dialog --backtitle \"SENDSM CKECKLIST\" \
+ --checklist \"Check your MEMORY number\(s\).\
+ \\nPress ESC key \for options..... \" \
+ 16 60 9 \
+ `cat $SMSDIR/.SMlist.chklst` 2> $TMP/rspTEMP02
+ option=$?
+ if [ $option -eq 255 ] ; then
+ dialog --backtitle "SENDSM CKECKLIST" --menu \
+ "Options sub-menus for Phonebook choise list:" \
+ 10 50 4 \
+ "1" "Sort by Memory Pos" \
+ "2" "Sort by Names" \
+ "9" "Quit $PROGNAME" 2> $TMP/rspTEMP04
+ if [ $? -eq 0 ]; then
+ sorttype=`cat $TMP/rspTEMP04`
+ case $sorttype in
+ 1) sort -n $SMSDIR/.SMlist.chklst > $TMP/.SMlist.tmp
+ mv -f $TMP/.SMlist.tmp $SMSDIR/.SMlist.chklst
+ ;;
+ 2) sort +1 $SMSDIR/.SMlist.chklst > $TMP/.SMlist.tmp
+ mv -f $TMP/.SMlist.tmp $SMSDIR/.SMlist.chklst
+ ;;
+ 9) sure_to_quit
+ ;;
+ esac
+ fi
+ else
+ chkok=1
+ fi
+ done
+
+ if [ $? -eq 0 ] ; then
+ for val in `cat $TMP/rspTEMP02`
+ do
+ tok1=`eval echo $val`
+ tok2=`grep "^$tok1;" $SMSDIR/.SMlist.choice`
+ tok3=`echo $tok2 | cut -f2 -d";"`
+ if [ -z "$NUMBERS" ] ; then
+ NUMBERS="$tok3"
+ else
+ NUMBERS="$NUMBERS $tok3"
+ fi
+ done
+ fi
+ fi
+}
+
+###########################################################################
+###########################################################################
+# MAIN PROCEDURE #
+###########################################################################
+###########################################################################
+
+parse_stdin $*
+
+# This is the 'help' test...
+# if [ "$1" = "--help" -o "$1" = "/h" ] ; then
+# help
+# fi
+
+if ! type -all "dialog" >/dev/null 2>&1 ; then
+echo
+echo "${PROGNAME}: error:"
+echo "Can't find 'dialog', i can't run without 'dialog' on your system."
+echo "You can get a compiled elf version of 'dialog' from here."
+echo "http://www.tux.org/pub/people/kent-robotti/index.html"
+echo "ftp://ftp.tux.org/pub/people/kent-robotti 'dialog-0.9a-15.elf.tar.gz'"
+echo
+exit 1
+fi
+
+if [ $SW_SKIPGNOKITST = no ] ; then
+ if ! type -all "$GNOKII" >/dev/null 2>&1 ; then
+ echo
+ echo "${PROGNAME}: error:"
+ echo "Can't find 'gnokii'. This script needs 'gnokii' in order to work."
+ echo "You can get a version of 'gnokii' from following links:"
+ echo "GNOKII: http://multivac.fatburen.org/gnokii/ , http://www.gnokii.org/"
+ echo
+ echo " Pavel Janik (who is to thank for a vast part of the 6110 development) "
+ echo "also keeps an ftp archive of some recent things."
+ echo " "
+ echo "Source code and pre-compiled binaries for gnokii are available from "
+ echo "a number of sites"
+ echo
+ echo "ftp.gnokii.org located in California, USA"
+ echo "linuxcare.com.au located in Canberra, Australia"
+ echo "multivac.fatburen.org located in Stockholm, Sweden "
+ echo
+ echo "Pre release versions are kept here, maintained by Pawel Kot"
+ echo "urtica.linuxnews.pl located in Warsaw, Poland"
+ echo
+ echo "MYGNOKII (can handle other newer Nokia models...)"
+ echo "--------"
+ echo "Marcin Wiacek -> mailto:marcin-wiacek@topnet.pl"
+ echo "http://marcin-wiacek.topnet.pl (http://www.fkn.pl/marcinw) -> netmonitor,"
+ echo "firmware, mygnokii (GSM & Nokia)"
+ echo "http://grumble.zereau.com/gnokii/ &"
+ echo "http://www.mds.mdh.se/~cel95eig/mygnokii/ -> mygnokii mirrors"
+ echo
+ exit 1
+ fi
+fi
+
+if [ ! -d ~/tmp ]; then
+mkdir ~/tmp
+chmod 755 ~/tmp
+fi
+
+if [ ! -d $SMSDIR ]; then
+mkdir -p $SMSDIR
+chmod 755 $SMSDIR
+fi
+
+if [ -d $TMP ]; then
+ rm -rf $TMP
+fi
+mkdir -p $TMP
+chmod 700 $TMP
+
+
+echo "$BACKTITLE" > $TMP/txtTEMP01
+echo >> $TMP/txtTEMP01
+echo "Written by Gabriele Zappi <gzappi@inwind.it> " >> $TMP/txtTEMP01
+echo >> $TMP/txtTEMP01
+echo "This script is a front-end to type SMS messages directly" >> $TMP/txtTEMP01
+echo "from your computer and send them using gnokii through" >> $TMP/txtTEMP01
+echo "your cellular phone connected to your computer." >> $TMP/txtTEMP01
+echo >> $TMP/txtTEMP01
+echo "Press [Enter] to continue with SENDSMS." >> $TMP/txtTEMP01
+
+dialog --backtitle "$BACKTITLE" --textbox "$TMP/txtTEMP01" 14 70
+TURN=0
+
+while true
+do
+ echo "Please, enter in the box below, your SMS message." > $TMP/txtTEMP$$
+ echo "Remember that it cannot be longer than 160 chars." >> $TMP/txtTEMP$$
+ echo " " >> $TMP/txtTEMP$$
+ echo "Press [ESC] or [CANCEL] to quit the program. " >> $TMP/txtTEMP$$
+
+ len=999
+ if [ $TURN -eq 0 ]; then
+ if [ "$SW_PRESETSMS" = "yes" ]; then
+ echo "$PRESETSMS" > $TMP/rspTEMP01
+ else
+ > $TMP/rspTEMP01
+ fi
+ fi
+ while test "$len" -le 0 -o "$len" -gt 160
+ do
+ dialog --backtitle "INSERT SMS ....." \
+ --inputbox "`cat $TMP/txtTEMP$$`" 10 70 "`cat $TMP/rspTEMP01`" \
+ 2> $TMP/rspTEMP01
+ if [ $? -ne 0 ] ; then
+ sure_to_quit
+ fi
+ len=`cat $TMP/rspTEMP01 | wc -c `
+
+ if [ $len -le 0 -o $len -gt 160 ] ; then
+ echo "Invalid SMS: It must be < 160 chars and > 0 long.." > $TMP/txtTEMP02
+ dialog --textbox "$TMP/txtTEMP02" 6 70
+ fi
+ done
+
+ NUMBERS=""
+ okcycle=0
+ while [ "$NUMBERS" = "" -o "$okcycle" -eq 0 ]
+ do
+ dialog --backtitle "INSERT NUMBER(s).." \
+ --yesno "would you like to pick up number(s) \
+ from your phone memory" 8 60
+
+
+ if [ $? -eq 0 ] ; then # Yes, gimme num from phonebook.
+ SMS_choicefrommem
+ fi
+
+ # Manual telephone number completion or insertion.
+ echo "Please, insert/modify in the box below, the NUMBER(S)" > $TMP/txtTEMP$$
+ echo "where you want to send the message to. " >> $TMP/txtTEMP$$
+ echo "(Multiple numbers must be separated by a space.) " >> $TMP/txtTEMP$$
+ echo "Press [ESC] or [CANCEL] to quit the program. " >> $TMP/txtTEMP$$
+ echo " " >> $TMP/txtTEMP$$
+ echo "OUTGOING MESSAGE: " >> $TMP/txtTEMP$$
+ echo -n " "
+ cat $TMP/rspTEMP01 | cut -c1-60 >> $TMP/txtTEMP$$
+ cat $TMP/rspTEMP01 | cut -c61-120 >> $TMP/txtTEMP$$
+ cat $TMP/rspTEMP01 | cut -c121-160 >> $TMP/txtTEMP$$
+
+ okcycle=1
+ dialog --backtitle "INSERT NUMBER(s).." \
+ --inputbox "`cat $TMP/txtTEMP$$`" \
+ 16 70 "$NUMBERS" 2> $TMP/rspTEMP03
+
+ if [ $? -ne 0 ] ; then
+ sure_to_quit
+ okcycle=0
+ else
+ NUMBERS=`cat $TMP/rspTEMP03`
+ if [ "$NUMBERS" = "" ] ; then
+ dialog --backtitle "INSERT NUMBER(s).." \
+ --infobox "Number cannot be empty.\n Try again.." 4 28
+ sleep 2
+ okcycle=0
+ fi
+ fi
+ done
+
+ # Last confirmation before sending messages....
+
+ okcycle=0
+ while [ $okcycle -eq 0 ]
+ do
+ echo "Ok. If you confirm the operation, the the SMS" > $TMP/txtTEMP$$
+ echo "is going to be sent to the selected number(s)." >> $TMP/txtTEMP$$
+ echo >> $TMP/txtTEMP$$
+ echo "Press [ESC] to quit the program. " >> $TMP/txtTEMP$$
+ echo "Press [CANCEL] to return to SMS input. " >> $TMP/txtTEMP$$
+ dialog --backtitle "$BACKTITLE" \
+ --yesno "`cat $TMP/txtTEMP$$`" 9 60
+ case $? in
+ 0)
+ okcycle=1;;
+ 1)
+ TURN=`expr $TURN + 1`
+ continue 2;;
+ 255)
+ sure_to_quit ;;
+ esac
+ done
+ TURN=`expr $TURN + 1`
+
+ for num in $NUMBERS
+ do
+ # echo "Sending sms to number $num ... "
+ dialog --backtitle "$BACKTITLE" --infobox "Sending sms to number $num ...\n Please wait" 4 45
+ if [ "$SW_SIMUL" = "yes" ] ; then
+ sleep 2
+ else
+ $GNOKII --sendsms $num < $TMP/rspTEMP01 > /dev/null 2>&1
+ fi
+ if [ $? -eq 0 ] ; then
+ dialog --backtitle "$BACKTITLE" \
+ --infobox "Message correctly sent to number $num !" 3 55
+ else
+ dialog --backtitle "$BACKTITLE" \
+ --infobox "Sent Failed to num $num! Sorry!" 3 55
+ fi
+ sleep 2
+ done
+
+done
+
+
+acex 0
+# zap - fin qui
+
--- /dev/null
+@echo off\r
+if not "%1"=="make" goto info\r
+del *.c > nul\r
+del *.h > nul\r
+del protocol\*.h > nul\r
+rmdir protocol > nul\r
+del newmodules\sniff\*.h > nul\r
+rmdir newmodules\sniff > nul\r
+del newmodules\*.h > nul\r
+rmdir newmodules > nul\r
+del files\*.h > nul\r
+rmdir files > nul\r
+del data\*.h > nul\r
+rmdir data > nul\r
+del devices\*.h > nul\r
+rmdir devices > nul\r
+goto end\r
+:info\r
+echo Used by bat in subdirs for cleaning source files\r
+:end
\ No newline at end of file
--- /dev/null
+[Project ID]\r
+Signature=UE Proj: v.1\r
+\r
+[Files]\r
+0=D:\Nokia\Gnokii\GnokiiAPI\gnokiiAPI.c\r
+\r
+[Open Files]\r
+Open File0=D:\Nokia\Gnokii\GnokiiAPI\gnokiiAPI.c\r
+Open File Pos0=39400\r
+Open File Line0=39063\r
+Active File Index=0\r
+Open File Window Pos0=2,3,0,0,-4,-26,25,25,291,433\r
+Open File1=\r
+Active File Display Mode=3\r
--- /dev/null
+; GnokiiAPI.def : Declares the module parameters for the DLL.\r
+\r
+LIBRARY "GnokiiAPI"\r
+DESCRIPTION 'GnokiiAPI Windows Dynamic Link Library'\r
+\r
+EXPORTS\r
+ ; Explicit exports can go here \r
+\r
+ myinitialize @1\r
+ mygetnetworkinfo @2\r
+ myterminate @3\r
+ mygetnetworkname @4\r
+ mynetmonitor @5\r
+ mygetmemorylocation @6\r
+ mygetmemorystatus @7\r
+ myreadringtonefile @8\r
+ myispointbitmap @9\r
+ myreadbitmapfile @10\r
+ myplayringtone @11\r
+ mygetimei @12\r
+ mygetrevision @13\r
+ mygetmodel @14\r
+ mygetmodelnumber @15\r
+ mysetringtone @16\r
+ mygetdllversion @17\r
+ mysetpointbitmap @18\r
+ myclearpointbitmap @19\r
+ myclearbitmap @20\r
+ myresizebitmap @21\r
+ mygetbitmap @22\r
+ mysetbitmap @23\r
+ mysavebitmapfile @24\r
+ mygetnetworkcode @25\r
+ mygetnetworkdata @26\r
+ mygetspeeddial @27\r
+ myreset @28\r
+ mygetcalendarnote @29\r
+ mygetsmscenter @30\r
+ mygetalarm @31\r
+ mygetprofile @32\r
+ mygetsimlock @33\r
+ mygetsmsstatus @34\r
+ mygetsmsfolders @35\r
+ mygetsmsmessage @36\r
+ mywritecalendarnote @37\r
+ mydeletecalendarnote @38\r
+ mysavesmsmessage @39\r
+ mymakemultipartsms2 @40\r
+ myplaynote @41\r
+ mygettempo @42\r
+ myplaytone @43\r
+ mysetsmscenter @44\r
+ mydeletesmsmessage @45\r
+ myreadconfig @46\r
+ mysetlocale @47\r
+ mysaveringtonetosms @48\r
+ mysavecalendarnotetosms @49\r
+ mysavebitmaptosms @50\r
+ mysavephonebookentrytosms @51\r
+ mygetsecuritycode @52\r
+ myreadbinringtonefile @53\r
+ mysetbinringtone @54\r
+ mysendsmsmessage @55\r
+ mygetmodelfeature @56\r
+ mygetwapbookmark @57\r
+ mygetwapsettings @58\r
+ mycalldivert @59\r
+ mysetwapbookmark @60\r
+ mywritephonebooklocation @61\r
+ mysavewapbookmarktosms @62\r
+ mysavewapsettingstosms @63\r
+ mysavebackupfile @64\r
+ myreadbackupfile @65\r
+ mygetphoneringtone @66\r
+ mysaveringtonefile @67\r
+ mysavebinringtonefile @68\r
+ mydialvoice @69\r
--- /dev/null
+# Microsoft Developer Studio Generated Dependency File, included by GnokiiAPI.mak\r
+\r
--- /dev/null
+# Microsoft Developer Studio Project File - Name="GnokiiAPI" - Package Owner=<4>\r
+# Microsoft Developer Studio Generated Build File, Format Version 6.00\r
+# ** DO NOT EDIT **\r
+\r
+# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102\r
+\r
+CFG=GnokiiAPI - Win32 Debug\r
+!MESSAGE This is not a valid makefile. To build this project using NMAKE,\r
+!MESSAGE use the Export Makefile command and run\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "GnokiiAPI.mak".\r
+!MESSAGE \r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "GnokiiAPI.mak" CFG="GnokiiAPI - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "GnokiiAPI - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE "GnokiiAPI - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")\r
+!MESSAGE \r
+\r
+# Begin Project\r
+# PROP AllowPerConfigDependencies 0\r
+# PROP Scc_ProjName ""\r
+# PROP Scc_LocalPath ""\r
+CPP=cl.exe\r
+MTL=midl.exe\r
+RSC=rc.exe\r
+\r
+!IF "$(CFG)" == "GnokiiAPI - Win32 Release"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 0\r
+# PROP BASE Output_Dir "Release"\r
+# PROP BASE Intermediate_Dir "Release"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 0\r
+# PROP Output_Dir "Release"\r
+# PROP Intermediate_Dir "Release"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "USE_NLS" /D "SECURITY" /D "HAVE_TIMEOPS" /D "WIN32" /D "VC6" /D "__svr4__" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GNOKIIAPI_EXPORTS" /YX /FD /c\r
+# ADD CPP /nologo /MT /W3 /GX /O2 /D "USE_NLS" /D "SECURITY" /D "HAVE_TIMEOPS" /D "WIN32" /D "VC6" /D "__svr4__" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GNOKIIAPI_EXPORTS" /YX /FD /c\r
+# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x404 /d "NDEBUG"\r
+# ADD RSC /l 0x404 /d "NDEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386\r
+\r
+!ELSEIF "$(CFG)" == "GnokiiAPI - Win32 Debug"\r
+\r
+# PROP BASE Use_MFC 0\r
+# PROP BASE Use_Debug_Libraries 1\r
+# PROP BASE Output_Dir "Debug"\r
+# PROP BASE Intermediate_Dir "Debug"\r
+# PROP BASE Target_Dir ""\r
+# PROP Use_MFC 0\r
+# PROP Use_Debug_Libraries 1\r
+# PROP Output_Dir "Debug"\r
+# PROP Intermediate_Dir "Debug"\r
+# PROP Target_Dir ""\r
+# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "USE_NLS" /D "SECURITY" /D "HAVE_TIMEOPS" /D "WIN32" /D "VC6" /D "__svr4__" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GNOKIIAPI_EXPORTS" /YX /FD /GZ /c\r
+# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "USE_NLS" /D "SECURITY" /D "HAVE_TIMEOPS" /D "WIN32" /D "VC6" /D "__svr4__" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "GNOKIIAPI_EXPORTS" /FR /YX /FD /GZ /c\r
+# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32\r
+# ADD BASE RSC /l 0x404 /d "_DEBUG"\r
+# ADD RSC /l 0x404 /d "_DEBUG"\r
+BSC32=bscmake.exe\r
+# ADD BASE BSC32 /nologo\r
+# ADD BSC32 /nologo\r
+LINK32=link.exe\r
+# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\r
+# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept\r
+\r
+!ENDIF \r
+\r
+# Begin Target\r
+\r
+# Name "GnokiiAPI - Win32 Release"\r
+# Name "GnokiiAPI - Win32 Debug"\r
+# Begin Group "Source Files"\r
+\r
+# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"\r
+# Begin Source File\r
+\r
+SOURCE=".\at.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\cfgreader.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\device.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\fbus.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\fbusirda.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\getopt.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gnokiiapi.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gnokiiapi.def"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-api.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-bitmaps.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-calendar.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-coding.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-datetime.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-filetypes.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-networks.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-phonebook.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-ringtones.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-sms.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-wap.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\mbus.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\midifile.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\misc.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\n6110.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\n7110.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\newat.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\rlp-common.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\rlp-crc24.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\sniff.c"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\winserial.c"\r
+# End Source File\r
+# End Group\r
+# Begin Group "Header Files"\r
+\r
+# PROP Default_Filter "h;hpp;hxx;hm;inl"\r
+# Begin Source File\r
+\r
+SOURCE=".\at.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\cfgreader.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\fbusirda.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\getopt.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\gnokiiapi.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-api.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-coding.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-common.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-datetime.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-filetypes.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-networks.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\gsm-wap.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\misc.h\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\win32\misc_win32.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\n6110.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\newat.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\rlp-common.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=".\rlp-crc24.h"\r
+# End Source File\r
+# Begin Source File\r
+\r
+SOURCE=.\winserial.h\r
+# End Source File\r
+# End Group\r
+# Begin Group "Resource Files"\r
+\r
+# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"\r
+# Begin Source File\r
+\r
+SOURCE=.\Script1.rc\r
+# End Source File\r
+# End Group\r
+# End Target\r
+# End Project\r
--- /dev/null
+Microsoft Developer Studio Workspace File, Format Version 6.00\r
+# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!\r
+\r
+###############################################################################\r
+\r
+Project: "GnokiiAPI"=.\GnokiiAPI.dsp - Package Owner=<4>\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<4>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
+Global:\r
+\r
+Package=<5>\r
+{{{\r
+}}}\r
+\r
+Package=<3>\r
+{{{\r
+}}}\r
+\r
+###############################################################################\r
+\r
--- /dev/null
+//Microsoft Developer Studio generated resource script.\r
+//\r
+#include "resource.h"\r
+\r
+#define APSTUDIO_READONLY_SYMBOLS\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 2 resource.\r
+//\r
+#include "afxres.h"\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#undef APSTUDIO_READONLY_SYMBOLS\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+// Polish resources\r
+\r
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_PLK)\r
+#ifdef _WIN32\r
+LANGUAGE LANG_POLISH, SUBLANG_DEFAULT\r
+#pragma code_page(1250)\r
+#endif //_WIN32\r
+\r
+#ifndef _MAC\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Version\r
+//\r
+\r
+VS_VERSION_INFO VERSIONINFO\r
+ FILEVERSION 0,3,0,0\r
+ PRODUCTVERSION 0,3,0,0\r
+ FILEFLAGSMASK 0x3fL\r
+#ifdef _DEBUG\r
+ FILEFLAGS 0x1L\r
+#else\r
+ FILEFLAGS 0x0L\r
+#endif\r
+ FILEOS 0x4L\r
+ FILETYPE 0x2L\r
+ FILESUBTYPE 0x0L\r
+BEGIN\r
+ BLOCK "StringFileInfo"\r
+ BEGIN\r
+ BLOCK "041504b0"\r
+ BEGIN\r
+ VALUE "Comments", "\0"\r
+ VALUE "CompanyName", " \0"\r
+ VALUE "FileDescription", "GnokiiAPI\0"\r
+ VALUE "FileVersion", "0, 3, 0, 0\0"\r
+ VALUE "InternalName", "GnokiiAPI\0"\r
+ VALUE "LegalCopyright", "Marcin Wiacek http://marcin-wiacek.topnet.pl\0"\r
+ VALUE "LegalTrademarks", "\0"\r
+ VALUE "OriginalFilename", "GnokiiAPI.dll\0"\r
+ VALUE "PrivateBuild", "\0"\r
+ VALUE "ProductName", " GnokiiAPI\0"\r
+ VALUE "ProductVersion", "0, 3, 0, 0\0"\r
+ VALUE "SpecialBuild", "\0"\r
+ END\r
+ END\r
+ BLOCK "VarFileInfo"\r
+ BEGIN\r
+ VALUE "Translation", 0x415, 1200\r
+ END\r
+END\r
+\r
+#endif // !_MAC\r
+\r
+\r
+#ifdef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// TEXTINCLUDE\r
+//\r
+\r
+1 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+ "resource.h\0"\r
+END\r
+\r
+2 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+ "#include ""afxres.h""\r\n"\r
+ "\0"\r
+END\r
+\r
+3 TEXTINCLUDE DISCARDABLE \r
+BEGIN\r
+ "\r\n"\r
+ "\0"\r
+END\r
+\r
+#endif // APSTUDIO_INVOKED\r
+\r
+#endif // Polish resources\r
+/////////////////////////////////////////////////////////////////////////////\r
+\r
+\r
+\r
+#ifndef APSTUDIO_INVOKED\r
+/////////////////////////////////////////////////////////////////////////////\r
+//\r
+// Generated from the TEXTINCLUDE 3 resource.\r
+//\r
+\r
+\r
+/////////////////////////////////////////////////////////////////////////////\r
+#endif // not APSTUDIO_INVOKED\r
+\r
--- /dev/null
+@echo off\r
+ren gnokiiapi.c gnokiiapi.1 > nul\r
+ren gnokiiapi.h gnokiiapi.2 > nul\r
+call ..\clean.bat make\r
+del release\*.pch > nul\r
+del release\*.exe > nul\r
+del release\*.idb > nul\r
+del release\*.obj > nul\r
+del release\*.pdb > nul\r
+del release\*.ilk > nul\r
+rmdir release > nul\r
+del debug\*.pch > nul\r
+del debug\*.exe > nul\r
+del debug\*.idb > nul\r
+del debug\*.obj > nul\r
+del debug\*.pdb > nul\r
+del debug\*.ilk > nul\r
+rmdir debug > nul\r
+ren gnokiiapi.1 gnokiiapi.c > nul\r
+ren gnokiiapi.2 gnokiiapi.h > nul\r
+del log > nul
\ No newline at end of file
--- /dev/null
+@echo off\r
+call ..\fcopy.bat make\r
--- /dev/null
+/*\r
+ G N O K I I\r
+\r
+ A Linux/Unix toolset and driver for Nokia mobile phones.\r
+\r
+ Released under the terms of the GNU GPL, see file COPYING for more details.\r
+\r
+*/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <signal.h>\r
+#include <string.h>\r
+#include <ctype.h>\r
+#include <time.h>\r
+#include <sys/stat.h>\r
+\r
+#ifndef VC6\r
+ #if defined(__svr4__) || defined(__FreeBSD__)\r
+ # include <strings.h> /* for bzero */\r
+ #endif\r
+#endif\r
+\r
+#ifdef WIN32\r
+\r
+ #include <windows.h>\r
+ #define sleep(x) Sleep((x) * 1000)\r
+ #define usleep(x) Sleep(((x) < 1000) ? 1 : ((x) / 1000))\r
+ #include "getopt.h"\r
+\r
+ #define DEV_CONSOLE "CON:"\r
+\r
+#else\r
+\r
+ #include <unistd.h>\r
+ #include <termios.h>\r
+ #include <fcntl.h>\r
+ #include <sys/types.h>\r
+ #include <sys/time.h>\r
+ #include <getopt.h>\r
+\r
+ #define DEV_CONSOLE "/dev/tty"\r
+#endif\r
+\r
+#include "misc.h"\r
+#include "gsm-common.h"\r
+#include "gsm-api.h"\r
+#include "gsm-networks.h"\r
+#include "files/cfgreader.h"\r
+#include "gnokiiapi.h"\r
+#include "files/gsm-filetypes.h"\r
+#include "gsm-ringtones.h"\r
+#include "gsm-bitmaps.h"\r
+#include "gsm-sms.h"\r
+#include "newmodules/n6110.h"\r
+\r
+#include "mversion.h"\r
+\r
+#ifdef USE_NLS\r
+ #include <locale.h>\r
+#endif\r
+\r
+extern GSM_Network GSM_Networks[];\r
+\r
+int WINAPI myinitialize (char *port, char *model, int connectiontype)\r
+{\r
+ return GSM_Initialise(model, port, "30", connectiontype, NULL, "no");\r
+}\r
+\r
+int WINAPI mygetnetworkinfo (GSM_NetworkInfo *NetworkInfo)\r
+{\r
+ return GSM->GetNetworkInfo(NetworkInfo);\r
+}\r
+\r
+int WINAPI myterminate ()\r
+{\r
+ GSM->Terminate();\r
+ return 0;\r
+}\r
+\r
+int WINAPI mygetnetworkname(char *NetworkName, char *NetworkCode)\r
+{\r
+ strcpy(NetworkName,GSM_GetNetworkName(NetworkCode));\r
+ return 0;\r
+}\r
+\r
+int WINAPI mynetmonitor(int mode, char *Screen)\r
+{\r
+ return GSM->NetMonitor(mode, Screen);\r
+}\r
+\r
+int WINAPI mygetmemorylocation(GSM_PhonebookEntry *entry)\r
+{\r
+ return GSM->GetMemoryLocation(entry);\r
+}\r
+\r
+int WINAPI mywritephonebooklocation(GSM_PhonebookEntry *entry)\r
+{\r
+ return GSM->WritePhonebookLocation(entry);\r
+}\r
+\r
+int WINAPI mygetmemorystatus(GSM_MemoryStatus *Status)\r
+{\r
+ return GSM->GetMemoryStatus(Status);\r
+}\r
+\r
+int WINAPI myreadringtonefile(char *FileName, GSM_Ringtone *ringtone)\r
+{\r
+ return GSM_ReadRingtoneFile(FileName, ringtone);\r
+}\r
+\r
+int WINAPI myplayringtone(GSM_Ringtone *ringtone)\r
+{\r
+ GSM_PlayRingtone(ringtone);\r
+ return 0;\r
+}\r
+\r
+int WINAPI myplaynote(GSM_RingtoneNote note)\r
+{\r
+ GSM_PlayOneNote(note);\r
+ return 0;\r
+}\r
+\r
+int WINAPI myreadbitmapfile(char *FileName, GSM_Bitmap *bitmap)\r
+{\r
+ return GSM_ReadBitmapFile(FileName, bitmap);\r
+}\r
+\r
+int WINAPI mysavebitmapfile(char *FileName, GSM_Bitmap *bitmap)\r
+{\r
+ return GSM_SaveBitmapFile(FileName, bitmap);\r
+}\r
+\r
+bool WINAPI myispointbitmap(GSM_Bitmap *bitmap,int x, int y)\r
+{\r
+ return GSM_IsPointBitmap(bitmap,x,y);\r
+}\r
+\r
+int WINAPI mygetimei(char *IMEI)\r
+{\r
+ return GSM->GetIMEI(IMEI);\r
+}\r
+\r
+int WINAPI mygetrevision(char *revision)\r
+{\r
+ return GSM->GetRevision(revision);\r
+}\r
+\r
+int WINAPI mygetmodel(char *model)\r
+{\r
+ return GSM->GetModel(model);\r
+}\r
+\r
+int WINAPI mygetmodelnumber(char *model,char *model2)\r
+{\r
+ strcpy(model2,GetModelName(model));\r
+ return 0;\r
+}\r
+\r
+int WINAPI mysetringtone(GSM_Ringtone *ringtone, int *notes)\r
+{\r
+ return GSM->SetRingtone(ringtone,notes);\r
+}\r
+\r
+int WINAPI mygetdllversion(char *version)\r
+{\r
+ strcpy(version,VERSION);\r
+ return 0;\r
+}\r
+\r
+int WINAPI mysetpointbitmap(GSM_Bitmap *bmp, int x, int y)\r
+{\r
+ GSM_SetPointBitmap(bmp,x,y);\r
+ return 0;\r
+}\r
+\r
+int WINAPI myclearpointbitmap(GSM_Bitmap *bmp, int x, int y)\r
+{\r
+ GSM_ClearPointBitmap(bmp,x,y);\r
+ return 0;\r
+}\r
+\r
+int WINAPI myclearbitmap(GSM_Bitmap *bmp)\r
+{\r
+ GSM_ClearBitmap(bmp);\r
+ return 0;\r
+}\r
+\r
+int WINAPI myresizebitmap (GSM_Bitmap *bitmap, GSM_Bitmap_Types target)\r
+{\r
+ GSM_ResizeBitmap(bitmap,target);\r
+ return 0;\r
+}\r
+\r
+int WINAPI mysetbitmap(GSM_Bitmap *Bitmap)\r
+{\r
+ return GSM->SetBitmap(Bitmap);\r
+}\r
+\r
+int WINAPI mygetbitmap(GSM_Bitmap *Bitmap)\r
+{\r
+ return GSM->GetBitmap(Bitmap);\r
+}\r
+\r
+int WINAPI mygetnetworkdata(int number, char *Name, char *Code)\r
+{\r
+ strcpy(Name,GSM_Networks[number].Name);\r
+ strcpy(Code,GSM_Networks[number].Code);\r
+ return 0;\r
+}\r
+\r
+int WINAPI mygetnetworkcode(char *NetworkName, char *NetworkCode)\r
+{\r
+ strcpy(NetworkCode,GSM_GetNetworkCode(NetworkName));\r
+ return 0;\r
+}\r
+\r
+int WINAPI mygetspeeddial(GSM_SpeedDial *entry)\r
+{\r
+ return GSM->GetSpeedDial(entry);\r
+}\r
+\r
+int WINAPI myreset(unsigned char type)\r
+{\r
+ return GSM->Reset(type);\r
+}\r
+\r
+int WINAPI mygetcalendarnote(GSM_CalendarNote *note)\r
+{\r
+ return GSM->GetCalendarNote(note);\r
+}\r
+\r
+int WINAPI mygetsmscenter(GSM_MessageCenter *center)\r
+{\r
+ return GSM->GetSMSCenter(center);\r
+}\r
+\r
+int WINAPI mysetsmscenter(GSM_MessageCenter *center)\r
+{\r
+ return GSM->SetSMSCenter(center);\r
+}\r
+\r
+int WINAPI mygetalarm(int alarm_number, GSM_DateTime *alarm)\r
+{\r
+ return GSM->GetAlarm(alarm_number,alarm);\r
+}\r
+\r
+int WINAPI mygetprofile(GSM_Profile *profile)\r
+{\r
+ return GSM->GetProfile(profile);\r
+}\r
+\r
+int WINAPI mygetsimlock(GSM_AllSimlocks *simlocks)\r
+{\r
+ return GSM->SimlockInfo(simlocks);\r
+}\r
+\r
+int WINAPI mygetsmsstatus(GSM_SMSStatus *status)\r
+{\r
+ return GSM->GetSMSStatus(status);\r
+}\r
+\r
+int WINAPI mygetsmsfolders(GSM_SMSFolders *folders)\r
+{\r
+ return GSM->GetSMSFolders(folders);\r
+}\r
+\r
+int WINAPI mygetsmsmessage(GSM_SMSMessage *sms)\r
+{\r
+ return GSM->GetSMSMessage(sms);\r
+}\r
+\r
+int WINAPI mywritecalendarnote(GSM_CalendarNote *note)\r
+{\r
+ return GSM->WriteCalendarNote(note);\r
+}\r
+\r
+int WINAPI mydeletecalendarnote(GSM_CalendarNote *note)\r
+{\r
+ return GSM->DeleteCalendarNote(note);\r
+}\r
+\r
+int WINAPI mysavesmsmessage(GSM_SMSMessage *sms)\r
+{\r
+ return GSM->SaveSMSMessage(sms);\r
+}\r
+\r
+int WINAPI mysendsmsmessage(GSM_SMSMessage *sms)\r
+{\r
+ return GSM->SendSMSMessage(sms);\r
+}\r
+\r
+int WINAPI mydeletesmsmessage(GSM_SMSMessage *sms)\r
+{\r
+ return GSM->DeleteSMSMessage(sms);\r
+}\r
+\r
+int WINAPI mygettempo(int beats)\r
+{\r
+ GSM_GetTempo(beats);\r
+ return 0;\r
+}\r
+\r
+int WINAPI myplaytone(int Herz, u8 Volume)\r
+{\r
+ return GSM->PlayTone(Herz,Volume);\r
+}\r
+\r
+int WINAPI myreadconfig(char *model, char *port, char *initlength,\r
+ char *connection, char *synchronizetime)\r
+{\r
+ char *model0;\r
+ char *port0;\r
+ char *initlength0;\r
+ char *connection0;\r
+ char *bindir0;\r
+ char *synchronizetime0;\r
+\r
+ CFG_ReadConfig(&model0, &port0, &initlength0,&connection0,&bindir0,&synchronizetime0,false);\r
+\r
+ strcpy(model,model0);\r
+ strcpy(port,port0);\r
+ strcpy(initlength,initlength0);\r
+ *connection=GetConnectionTypeFromString(connection0);\r
+ strcpy(synchronizetime,synchronizetime0); \r
+\r
+ return 0;\r
+}\r
+\r
+int WINAPI mysetlocale(char *locale)\r
+{\r
+ setlocale(LC_ALL, locale);\r
+ return 0;\r
+}\r
+\r
+int WINAPI mymakemultipartsms2(GSM_MultiSMSMessage *SMS,\r
+ u8 *MessageBuffer,int MessageLength, GSM_UDH UDHType, GSM_Coding_Type Coding)\r
+{\r
+ GSM_MakeMultiPartSMS2(SMS,MessageBuffer,MessageLength,UDHType,Coding);\r
+ return 0;\r
+}\r
+\r
+int WINAPI mysaveringtonetosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_Ringtone *ringtone, bool profilestyle)\r
+{\r
+ return GSM_SaveRingtoneToSMS(SMS,ringtone,profilestyle);\r
+}\r
+\r
+int WINAPI mysavewapbookmarktosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_WAPBookmark *bookmark)\r
+{\r
+ return GSM_SaveWAPBookmarkToSMS(SMS,bookmark);\r
+}\r
+\r
+int WINAPI mysavewapsettingstosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_WAPSettings *settings)\r
+{\r
+ return GSM_SaveWAPSettingsToSMS(SMS,settings);\r
+}\r
+\r
+int WINAPI mysavebitmaptosms(GSM_MultiSMSMessage *SMS, GSM_Bitmap *bitmap,\r
+ bool ScreenSaver, bool UnicodeText)\r
+{\r
+ return GSM_SaveBitmapToSMS(SMS,bitmap,ScreenSaver,UnicodeText);\r
+}\r
+\r
+int WINAPI mysavecalendarnotetosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_CalendarNote *note)\r
+{\r
+ return GSM_SaveCalendarNoteToSMS(SMS,note);\r
+}\r
+\r
+int WINAPI mysavephonebookentrytosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_PhonebookEntry *entry, int version)\r
+{\r
+ return GSM_SavePhonebookEntryToSMS(SMS,entry,version);\r
+}\r
+\r
+int WINAPI mygetsecuritycode(GSM_SecurityCode *SecurityCode)\r
+{\r
+ return GSM->GetSecurityCode(SecurityCode);\r
+}\r
+\r
+int WINAPI myreadbinringtonefile(char *FileName, GSM_BinRingtone *ringtone)\r
+{\r
+ return GSM_ReadBinRingtoneFile(FileName,ringtone);\r
+}\r
+\r
+int WINAPI mysetbinringtone(GSM_BinRingtone *ringtone)\r
+{\r
+ return GSM->SetBinRingtone(ringtone);\r
+}\r
+\r
+int WINAPI mygetmodelfeature (featnum_index num)\r
+{\r
+ return GetModelFeature (num);\r
+}\r
+\r
+int WINAPI mygetwapbookmark(GSM_WAPBookmark *bookmark)\r
+{\r
+ return GSM->GetWAPBookmark(bookmark);\r
+}\r
+\r
+int WINAPI mygetwapsettings(GSM_WAPSettings *settings)\r
+{\r
+ return GSM->GetWAPSettings(settings);\r
+}\r
+\r
+int WINAPI mycalldivert(GSM_CallDivert *divert)\r
+{\r
+ return GSM->CallDivert(divert);\r
+}\r
+\r
+int WINAPI mysetwapbookmark(GSM_WAPBookmark *bookmark)\r
+{\r
+ return GSM->SetWAPBookmark(bookmark);\r
+}\r
+\r
+int WINAPI mysavebackupfile(char *FileName, GSM_Backup *backup)\r
+{\r
+ return GSM_SaveBackupFile(FileName,backup);\r
+}\r
+\r
+int WINAPI myreadbackupfile(char *FileName, GSM_Backup *backup)\r
+{\r
+ return GSM_ReadBackupFile(FileName,backup);\r
+}\r
+\r
+int WINAPI mygetphoneringtone(GSM_BinRingtone *ringtone,GSM_Ringtone *SMringtone)\r
+{\r
+ return GSM_GetPhoneRingtone(ringtone,SMringtone);\r
+}\r
+\r
+int WINAPI mysaveringtonefile(char *FileName, GSM_Ringtone *ringtone)\r
+{\r
+ return GSM_SaveRingtoneFile(FileName,ringtone);\r
+}\r
+\r
+int WINAPI mysavebinringtonefile(char *FileName, GSM_BinRingtone *ringtone)\r
+{\r
+ return GSM_SaveBinRingtoneFile(FileName,ringtone);\r
+}\r
+\r
+int WINAPI mydialvoice(char *Number)\r
+{\r
+ return GSM->DialVoice(Number);\r
+}\r
+\r
--- /dev/null
+/*\r
+\r
+ G N O K I I\r
+\r
+ A Linux/Unix toolset and driver for Nokia mobile phones.\r
+\r
+ Released under the terms of the GNU GPL, see file COPYING for more details.\r
+\r
+*/\r
+\r
+/* Prototypes */\r
+\r
+int WINAPI myinitialize (char *port, char *model, int connectiontype);\r
+int WINAPI myterminate ();\r
+\r
+int WINAPI mygetnetworkname(char *NetworkName, char *NetworkCode);\r
+int WINAPI mygetnetworkcode(char *NetworkName, char *NetworkCode);\r
+int WINAPI mygetnetworkinfo (GSM_NetworkInfo *NetworkInfo);\r
+int WINAPI mygetnetworkdata(int number, char *Name, char *Code);\r
+\r
+int WINAPI mynetmonitor(int mode, char *Screen);\r
+\r
+int WINAPI mygetmemorylocation(GSM_PhonebookEntry *entry);\r
+int WINAPI mywritephonebooklocation(GSM_PhonebookEntry *entry);\r
+int WINAPI mygetmemorystatus(GSM_MemoryStatus *Status);\r
+\r
+int WINAPI myreadringtonefile(char *FileName, GSM_Ringtone *ringtone);\r
+int WINAPI mysetringtone(GSM_Ringtone *ringtone, int *notes);\r
+int WINAPI myplaynote(GSM_RingtoneNote note);\r
+int WINAPI myplayringtone(GSM_Ringtone *ringtone);\r
+int WINAPI mygettempo(int beats);\r
+int WINAPI myplaytone(int Herz, u8 Volume);\r
+int WINAPI myreadbinringtonefile(char *FileName, GSM_BinRingtone *ringtone);\r
+int WINAPI mysetbinringtone(GSM_BinRingtone *ringtone);\r
+int WINAPI mygetphoneringtone(GSM_BinRingtone *ringtone,GSM_Ringtone *SMringtone);\r
+int WINAPI mysaveringtonefile(char *FileName, GSM_Ringtone *ringtone);\r
+int WINAPI mysavebinringtonefile(char *FileName, GSM_BinRingtone *ringtone);\r
+\r
+int WINAPI myreadbitmapfile(char *FileName, GSM_Bitmap *bitmap);\r
+int WINAPI mysavebitmapfile(char *FileName, GSM_Bitmap *bitmap);\r
+int WINAPI mysetpointbitmap(GSM_Bitmap *bmp, int x, int y);\r
+int WINAPI myclearpointbitmap(GSM_Bitmap *bmp, int x, int y);\r
+int WINAPI myclearbitmap(GSM_Bitmap *bmp);\r
+int WINAPI myresizebitmap (GSM_Bitmap *bitmap, GSM_Bitmap_Types target);\r
+int WINAPI mysetbitmap(GSM_Bitmap *Bitmap);\r
+int WINAPI mygetbitmap(GSM_Bitmap *Bitmap);\r
+bool WINAPI myispointbitmap(GSM_Bitmap *bitmap,int x, int y);\r
+\r
+int WINAPI mygetimei(char *IMEI);\r
+int WINAPI mygetrevision(char *revision);\r
+int WINAPI mygetmodel(char *model);\r
+int WINAPI mygetmodelnumber(char *model,char *model2);\r
+\r
+int WINAPI mygetdllversion(char *version);\r
+\r
+int WINAPI mygetspeeddial(GSM_SpeedDial *entry);\r
+\r
+int WINAPI myreset(unsigned char type);\r
+\r
+int WINAPI mygetcalendarnote(GSM_CalendarNote *note);\r
+int WINAPI mywritecalendarnote(GSM_CalendarNote *note);\r
+int WINAPI mydeletecalendarnote(GSM_CalendarNote *note);\r
+\r
+int WINAPI mygetsmscenter(GSM_MessageCenter *center);\r
+int WINAPI mysetsmscenter(GSM_MessageCenter *center);\r
+\r
+int WINAPI mygetalarm(int alarm_number, GSM_DateTime *alarm);\r
+\r
+int WINAPI mygetprofile(GSM_Profile *profile);\r
+\r
+int WINAPI mygetsimlock(GSM_AllSimlocks *simlocks);\r
+\r
+int WINAPI mygetsmsstatus(GSM_SMSStatus *status);\r
+int WINAPI mygetsmsfolders(GSM_SMSFolders *folders);\r
+int WINAPI mygetsmsmessage(GSM_SMSMessage *sms);\r
+int WINAPI mydeletesmsmessage(GSM_SMSMessage *sms);\r
+int WINAPI mysavesmsmessage(GSM_SMSMessage *sms);\r
+int WINAPI mysendsmsmessage(GSM_SMSMessage *sms);\r
+int WINAPI mymakemultipartsms2(GSM_MultiSMSMessage *SMS,\r
+ u8 *MessageBuffer,int MessageLength, GSM_UDH UDHType, GSM_Coding_Type Coding);\r
+\r
+int WINAPI mysaveringtonetosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_Ringtone *ringtone, bool profilestyle);\r
+int WINAPI mysavebitmaptosms(GSM_MultiSMSMessage *SMS, GSM_Bitmap *bitmap,\r
+ bool ScreenSaver, bool UnicodeText);\r
+int WINAPI mysavecalendarnotetosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_CalendarNote *note);\r
+int WINAPI mysavephonebookentrytosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_PhonebookEntry *entry, int version);\r
+int WINAPI mysavewapbookmarktosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_WAPBookmark *bookmark);\r
+int WINAPI mysavewapsettingstosms(GSM_MultiSMSMessage *SMS,\r
+ GSM_WAPSettings *settings);\r
+\r
+int WINAPI myreadconfig(char *model, char *port, char *initlength,\r
+ char *connection, char *synchronizetime);\r
+\r
+int WINAPI mysetlocale(char *locale);\r
+\r
+int WINAPI mygetsecuritycode(GSM_SecurityCode *SecurityCode);\r
+\r
+int WINAPI mygetmodelfeature (featnum_index num);\r
+\r
+int WINAPI mygetwapbookmark(GSM_WAPBookmark *bookmark);\r
+int WINAPI mysetwapbookmark(GSM_WAPBookmark *bookmark);\r
+\r
+int WINAPI mygetwapsettings(GSM_WAPSettings *settings);\r
+\r
+int WINAPI mycalldivert(GSM_CallDivert *divert);\r
+\r
+int WINAPI mysavebackupfile(char *FileName, GSM_Backup *backup);\r
+int WINAPI myreadbackupfile(char *FileName, GSM_Backup *backup);\r
+\r
+int WINAPI mydialvoice(char *Number);\r
--- /dev/null
+//{{NO_DEPENDENCIES}}\r
+// Microsoft Developer Studio generated include file.\r
+// Used by Script1.rc\r
+//\r
+\r
+// Next default values for new objects\r
+// \r
+#ifdef APSTUDIO_INVOKED\r
+#ifndef APSTUDIO_READONLY_SYMBOLS\r
+#define _APS_NEXT_RESOURCE_VALUE 101\r
+#define _APS_NEXT_COMMAND_VALUE 40001\r
+#define _APS_NEXT_CONTROL_VALUE 1000\r
+#define _APS_NEXT_SYMED_VALUE 101\r
+#endif\r
+#endif\r
--- /dev/null
+@echo off\r
+if not "%1"=="make" goto info\r
+echo Preparing files\r
+start /wait ..\mversion.js make\r
+copy ..\..\common\*.c *.c > nul\r
+copy ..\..\common\protocol\*.c *.c > nul\r
+copy ..\..\common\devices\*.c *.c > nul\r
+copy ..\..\getopt\win32\*.c *.c > nul\r
+copy ..\..\getopt\win32\*.h *.h > nul\r
+copy ..\..\common\data\*.c *.c > nul\r
+copy ..\..\common\files\*.c *.c > nul\r
+copy ..\..\common\newmodules\*.c *.c > nul\r
+copy ..\..\common\newmodules\sniff\*.c *.c > nul\r
+copy ..\..\gnokii\gnokii.c gnokii.c > nul\r
+copy ..\..\gnokii\gnokii.h gnokii.h > nul\r
+copy ..\..\include\*.h *.h > nul\r
+mkdir files > nul\r
+copy ..\..\include\files\*.h files\*.h >nul\r
+mkdir data > nul\r
+copy ..\..\include\data\*.h data\*.h >nul\r
+mkdir newmodules > nul\r
+copy ..\..\include\newmodules\*.h newmodules\*.h >nul\r
+cd newmodules > nul\r
+mkdir sniff > nul\r
+cd .. > nul\r
+copy ..\..\include\newmodules\sniff\*.h newmodules\sniff\*.h >nul\r
+mkdir protocol > nul\r
+copy ..\..\include\protocol\*.h protocol\*.h >nul\r
+mkdir devices > nul\r
+copy ..\..\include\devices\*.h devices\*.h >nul\r
+del unixserial.* > nul\r
+goto end\r
+:info\r
+echo Used by bat in subdirs for copying source files\r
+:end
\ No newline at end of file
--- /dev/null
+@echo off\r
+call ..\clean.bat make\r
+del release\*.pch > nul\r
+rem del release\*.exe > nul\r
+del release\*.idb > nul\r
+del release\*.obj > nul\r
+del release\*.pdb > nul\r
+del release\*.ilk > nul\r
+rmdir release > nul\r
+del debug\*.pch > nul\r
+rem del debug\*.exe > nul\r
+del debug\*.idb > nul\r
+del debug\*.obj > nul\r
+del debug\*.pdb > nul\r
+del debug\*.ilk > nul\r
+rmdir debug > nul\r
+del log > nul\r
--- /dev/null
+@echo off\r
+call ..\fcopy.bat make\r
+echo Making\r
+NMAKE /f "gnokii.mak" CFG="gnokii - Win32 Debug" > log\r
+echo Gnokii.exe is in the DEBUG directory\r
+call ..\clean.bat make\r
--- /dev/null
+# Microsoft Developer Studio Generated NMAKE File, Based on gnokii.dsp\r
+!IF "$(CFG)" == ""\r
+CFG=gnokii - Win32 Debug\r
+!MESSAGE No configuration specified. Defaulting to gnokii - Win32 Debug.\r
+!ENDIF \r
+\r
+# here are some configuration\r
+MODEL=\"5110\" \r
+PORT=\"COM2\"\r
+\r
+!IF "$(CFG)" != "gnokii - Win32 Release" && "$(CFG)" != "gnokii - Win32 Debug"\r
+!MESSAGE Invalid configuration "$(CFG)" specified.\r
+!MESSAGE You can specify a configuration when running NMAKE\r
+!MESSAGE by defining the macro CFG on the command line. For example:\r
+!MESSAGE \r
+!MESSAGE NMAKE /f "gnokii.mak" CFG="gnokii - Win32 Debug"\r
+!MESSAGE \r
+!MESSAGE Possible choices for configuration are:\r
+!MESSAGE \r
+!MESSAGE "gnokii - Win32 Release" (based on "Win32 (x86) Console Application")\r
+!MESSAGE "gnokii - Win32 Debug" (based on "Win32 (x86) Console Application")\r
+!MESSAGE \r
+!ERROR An invalid configuration is specified.\r
+!ENDIF \r
+\r
+!IF "$(OS)" == "Windows_NT"\r
+NULL=\r
+!ELSE \r
+NULL=nul\r
+!ENDIF \r
+\r
+!IF "$(CFG)" == "gnokii - Win32 Release"\r
+\r
+OUTDIR=.\Release\r
+INTDIR=.\Release\r
+# Begin Custom Macros\r
+OutDir=.\Release\r
+# End Custom Macros\r
+\r
+ALL : "$(OUTDIR)\gnokii.exe"\r
+\r
+\r
+CLEAN :\r
+ -@erase "$(INTDIR)\cfgreader.obj"\r
+ -@erase "$(INTDIR)\device.obj"\r
+ -@erase "$(INTDIR)\at.obj"\r
+ -@erase "$(INTDIR)\fbus.obj"\r
+ -@erase "$(INTDIR)\fbusirda.obj"\r
+ -@erase "$(INTDIR)\mbus.obj"\r
+ -@erase "$(INTDIR)\n7110.obj"\r
+ -@erase "$(INTDIR)\newat.obj"\r
+ -@erase "$(INTDIR)\n6110.obj"\r
+ -@erase "$(INTDIR)\sniff.obj"\r
+ -@erase "$(INTDIR)\misc.obj"\r
+ -@erase "$(INTDIR)\getopt.obj"\r
+ -@erase "$(INTDIR)\gnokii.obj"\r
+ -@erase "$(INTDIR)\gsm-api.obj"\r
+ -@erase "$(INTDIR)\gsm-calendar.obj"\r
+ -@erase "$(INTDIR)\gsm-coding.obj"\r
+ -@erase "$(INTDIR)\gsm-datetime.obj"\r
+ -@erase "$(INTDIR)\gsm-phonebook.obj"\r
+ -@erase "$(INTDIR)\gsm-sms.obj"\r
+ -@erase "$(INTDIR)\gsm-wap.obj"\r
+ -@erase "$(INTDIR)\gsm-filetypes.obj"\r
+ -@erase "$(INTDIR)\gsm-networks.obj"\r
+ -@erase "$(INTDIR)\gsm-bitmaps.obj"\r
+ -@erase "$(INTDIR)\gsm-ringtones.obj"\r
+ -@erase "$(INTDIR)\rlp-common.obj"\r
+ -@erase "$(INTDIR)\rlp-crc24.obj"\r
+ -@erase "$(INTDIR)\midifile.obj"\r
+ -@erase "$(INTDIR)\vc60.idb"\r
+ -@erase "$(INTDIR)\winserial.obj"\r
+ -@erase "$(OUTDIR)\gnokii.exe"\r
+\r
+"$(OUTDIR)" :\r
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /ML /W3 /GX /O2 /D "USE_NLS" /D "SECURITY" /D "HAVE_TIMEOPS" /D "WIN32" /D "VC6" /D "__svr4__" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /D MODEL=$(MODEL) /D PORT=$(PORT) /D VERSION=$(VERSION) $(DEBUG) /Fp"$(INTDIR)\gnokii.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /c \r
+\r
+.c{$(INTDIR)}.obj::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(INTDIR)}.obj::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(INTDIR)}.obj::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(INTDIR)}.sbr::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(INTDIR)}.sbr::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(INTDIR)}.sbr::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+RSC=rc.exe\r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\gnokii.bsc" \r
+BSC32_SBRS= \\r
+ \r
+LINK32=link.exe\r
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /pdb:"$(OUTDIR)\gnokii.pdb" /machine:I386 /out:"$(OUTDIR)\gnokii.exe" \r
+LINK32_OBJS= \\r
+ "$(INTDIR)\cfgreader.obj" \\r
+ "$(INTDIR)\n6110.obj" \\r
+ "$(INTDIR)\sniff.obj" \\r
+ "$(INTDIR)\fbusirda.obj" \\r
+ "$(INTDIR)\n7110.obj" \\r
+ "$(INTDIR)\newat.obj" \\r
+ "$(INTDIR)\mbus.obj" \\r
+ "$(INTDIR)\fbus.obj" \\r
+ "$(INTDIR)\at.obj" \\r
+ "$(INTDIR)\device.obj" \\r
+ "$(INTDIR)\gsm-sms.obj" \\r
+ "$(INTDIR)\gsm-wap.obj" \\r
+ "$(INTDIR)\gsm-calendar.obj" \\r
+ "$(INTDIR)\gsm-phonebook.obj" \\r
+ "$(INTDIR)\misc.obj" \\r
+ "$(INTDIR)\getopt.obj" \\r
+ "$(INTDIR)\gnokii.obj" \\r
+ "$(INTDIR)\gsm-api.obj" \\r
+ "$(INTDIR)\gsm-coding.obj" \\r
+ "$(INTDIR)\gsm-datetime.obj" \\r
+ "$(INTDIR)\gsm-ringtones.obj" \\r
+ "$(INTDIR)\gsm-bitmaps.obj" \\r
+ "$(INTDIR)\gsm-networks.obj" \\r
+ "$(INTDIR)\rlp-common.obj" \\r
+ "$(INTDIR)\rlp-crc24.obj" \\r
+ "$(INTDIR)\midifile.obj" \\r
+ "$(INTDIR)\winserial.obj" \\r
+ "$(INTDIR)\gsm-filetypes.obj" \\r
+\r
+"$(OUTDIR)\gnokii.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+ $(LINK32) @<<\r
+ $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ELSEIF "$(CFG)" == "gnokii - Win32 Debug"\r
+\r
+OUTDIR=.\Debug\r
+INTDIR=.\Debug\r
+# Begin Custom Macros\r
+OutDir=.\Debug\r
+# End Custom Macros\r
+\r
+ALL : "$(OUTDIR)\gnokii.exe"\r
+\r
+\r
+CLEAN :\r
+ -@erase "$(INTDIR)\cfgreader.obj"\r
+ -@erase "$(INTDIR)\fbus.obj"\r
+ -@erase "$(INTDIR)\mbus.obj"\r
+ -@erase "$(INTDIR)\at.obj"\r
+ -@erase "$(INTDIR)\n7110.obj"\r
+ -@erase "$(INTDIR)\n6110.obj"\r
+ -@erase "$(INTDIR)\sniff.obj"\r
+ -@erase "$(INTDIR)\fbusirda.obj"\r
+ -@erase "$(INTDIR)\newat.obj"\r
+ -@erase "$(INTDIR)\device.obj"\r
+ -@erase "$(INTDIR)\gsm-sms.obj"\r
+ -@erase "$(INTDIR)\getopt.obj"\r
+ -@erase "$(INTDIR)\misc.obj"\r
+ -@erase "$(INTDIR)\gnokii.obj"\r
+ -@erase "$(INTDIR)\gsm-api.obj"\r
+ -@erase "$(INTDIR)\gsm-coding.obj"\r
+ -@erase "$(INTDIR)\gsm-datetime.obj"\r
+ -@erase "$(INTDIR)\gsm-wap.obj"\r
+ -@erase "$(INTDIR)\gsm-calendar.obj"\r
+ -@erase "$(INTDIR)\gsm-phonebook.obj"\r
+ -@erase "$(INTDIR)\gsm-filetypes.obj"\r
+ -@erase "$(INTDIR)\gsm-ringtones.obj"\r
+ -@erase "$(INTDIR)\gsm-bitmaps.obj"\r
+ -@erase "$(INTDIR)\gsm-networks.obj"\r
+ -@erase "$(INTDIR)\rlp-common.obj"\r
+ -@erase "$(INTDIR)\rlp-crc24.obj"\r
+ -@erase "$(INTDIR)\midifile.obj"\r
+ -@erase "$(INTDIR)\vc60.idb"\r
+ -@erase "$(INTDIR)\vc60.pdb"\r
+ -@erase "$(INTDIR)\winserial.obj"\r
+ -@erase "$(OUTDIR)\gnokii.exe"\r
+ -@erase "$(OUTDIR)\gnokii.ilk"\r
+ -@erase "$(OUTDIR)\gnokii.pdb"\r
+\r
+"$(OUTDIR)" :\r
+ if not exist "$(OUTDIR)/$(NULL)" mkdir "$(OUTDIR)"\r
+\r
+CPP=cl.exe\r
+CPP_PROJ=/nologo /MLd /W3 /Gm /GX /ZI /Od /D "USE_NLS" /D "SECURITY" /D "HAVE_TIMEOPS" /D "WIN32" /D "VC6" /D "DEBUG" /D "_DEBUG" /D "__svr4__" /D "_CONSOLE" /D "_MBCS" /D MODEL=$(MODEL) /D PORT=$(PORT) /D VERSION=$(VERSION) $(DEBUG) /Fp"$(INTDIR)\gnokii.pch" /YX /Fo"$(INTDIR)\\" /Fd"$(INTDIR)\\" /FD /GZ /c \r
+\r
+.c{$(INTDIR)}.obj::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(INTDIR)}.obj::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(INTDIR)}.obj::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.c{$(INTDIR)}.sbr::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cpp{$(INTDIR)}.sbr::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+.cxx{$(INTDIR)}.sbr::\r
+ $(CPP) @<<\r
+ $(CPP_PROJ) $< \r
+<<\r
+\r
+RSC=rc.exe\r
+BSC32=bscmake.exe\r
+BSC32_FLAGS=/nologo /o"$(OUTDIR)\gnokii.bsc" \r
+BSC32_SBRS= \\r
+ \r
+LINK32=link.exe\r
+LINK32_FLAGS=kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:yes /pdb:"$(OUTDIR)\gnokii.pdb" /debug /machine:I386 /out:"$(OUTDIR)\gnokii.exe" /pdbtype:sept \r
+LINK32_OBJS= \\r
+ "$(INTDIR)\cfgreader.obj" \\r
+ "$(INTDIR)\n6110.obj" \\r
+ "$(INTDIR)\sniff.obj" \\r
+ "$(INTDIR)\fbusirda.obj" \\r
+ "$(INTDIR)\n7110.obj" \\r
+ "$(INTDIR)\newat.obj" \\r
+ "$(INTDIR)\mbus.obj" \\r
+ "$(INTDIR)\at.obj" \\r
+ "$(INTDIR)\fbus.obj" \\r
+ "$(INTDIR)\device.obj" \\r
+ "$(INTDIR)\gsm-sms.obj" \\r
+ "$(INTDIR)\gsm-wap.obj" \\r
+ "$(INTDIR)\gsm-calendar.obj" \\r
+ "$(INTDIR)\misc.obj" \\r
+ "$(INTDIR)\getopt.obj" \\r
+ "$(INTDIR)\gnokii.obj" \\r
+ "$(INTDIR)\gsm-api.obj" \\r
+ "$(INTDIR)\gsm-coding.obj" \\r
+ "$(INTDIR)\gsm-datetime.obj" \\r
+ "$(INTDIR)\gsm-ringtones.obj" \\r
+ "$(INTDIR)\gsm-phonebook.obj" \\r
+ "$(INTDIR)\gsm-bitmaps.obj" \\r
+ "$(INTDIR)\gsm-networks.obj" \\r
+ "$(INTDIR)\rlp-common.obj" \\r
+ "$(INTDIR)\rlp-crc24.obj" \\r
+ "$(INTDIR)\midifile.obj" \\r
+ "$(INTDIR)\winserial.obj" \\r
+ "$(INTDIR)\gsm-filetypes.obj"\r
+\r
+"$(OUTDIR)\gnokii.exe" : "$(OUTDIR)" $(DEF_FILE) $(LINK32_OBJS)\r
+ $(LINK32) @<<\r
+ $(LINK32_FLAGS) $(LINK32_OBJS)\r
+<<\r
+\r
+!ENDIF \r
+\r
+\r
+!IF "$(NO_EXTERNAL_DEPS)" != "1"\r
+!IF EXISTS("gnokii.dep")\r
+!INCLUDE "gnokii.dep"\r
+!ELSE \r
+!MESSAGE Warning: cannot find "gnokii.dep"\r
+!ENDIF \r
+!ENDIF \r
+\r
+\r
+!IF "$(CFG)" == "gnokii - Win32 Release" || "$(CFG)" == "gnokii - Win32 Debug"\r
+SOURCE=cfgreader.c\r
+\r
+"$(INTDIR)\cfgreader.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-sms.c"\r
+\r
+"$(INTDIR)\gsm-sms.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-coding.c"\r
+\r
+"$(INTDIR)\gsm-coding.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-datetime.c"\r
+\r
+"$(INTDIR)\gsm-datetime.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="at.c"\r
+\r
+"$(INTDIR)\at.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-wap.c"\r
+\r
+"$(INTDIR)\gsm-wap.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-calendar.c"\r
+\r
+"$(INTDIR)\gsm-calendar.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-phonebook.c"\r
+\r
+"$(INTDIR)\gsm-phonebook.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="device.c"\r
+\r
+"$(INTDIR)\device.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="n7110.c"\r
+\r
+"$(INTDIR)\n7110.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="n6110.c"\r
+\r
+"$(INTDIR)\n6110.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="sniff.c"\r
+\r
+"$(INTDIR)\sniff.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="newat.c"\r
+\r
+"$(INTDIR)\newat.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="mbus.c"\r
+\r
+"$(INTDIR)\mbus.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="fbus.c"\r
+\r
+"$(INTDIR)\fbus.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-ringtones.c"\r
+\r
+"$(INTDIR)\gsm-ringtones.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="gsm-bitmaps.c"\r
+\r
+"$(INTDIR)\gsm-bitmaps.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="midifile.c"\r
+\r
+"$(INTDIR)\midifile.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE=getopt.c\r
+\r
+"$(INTDIR)\getopt.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE=gnokii.c\r
+\r
+"$(INTDIR)\gnokii.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+\r
+SOURCE="gsm-api.c"\r
+\r
+"$(INTDIR)\gsm-api.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+\r
+SOURCE="gsm-filetypes.c"\r
+\r
+"$(INTDIR)\gsm-filetypes.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+\r
+SOURCE="gsm-networks.c"\r
+\r
+"$(INTDIR)\gsm-networks.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE="rlp-common.c"\r
+\r
+"$(INTDIR)\rlp-common.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+\r
+SOURCE="rlp-crc24.c"\r
+\r
+"$(INTDIR)\rlp-crc24.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE=winserial.c\r
+\r
+"$(INTDIR)\winserial.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE=misc.c\r
+\r
+"$(INTDIR)\misc.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+SOURCE=fbusirda.c\r
+\r
+"$(INTDIR)\fbusirda.obj" : $(SOURCE) "$(INTDIR)"\r
+ $(CPP) $(CPP_PROJ) $(SOURCE)\r
+\r
+!ENDIF \r
+\r
--- /dev/null
+@echo off\r
+call ..\fcopy.bat make\r
+echo Making\r
+NMAKE /f "gnokii.mak" CFG="gnokii - Win32 Release" > log\r
+echo Gnokii.exe is in the RELEASE directory\r
+call ..\clean.bat make\r
--- /dev/null
+object CalendarForm: TCalendarForm\r
+ Left = 290\r
+ Top = 105\r
+ BorderIcons = [biSystemMenu, biMinimize]\r
+ BorderStyle = bsDialog\r
+ Caption = 'Edit/Add calendar'\r
+ ClientHeight = 287\r
+ ClientWidth = 299\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ OnShow = FormShow\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Label1: TLabel\r
+ Left = 16\r
+ Top = 16\r
+ Width = 63\r
+ Height = 13\r
+ Caption = 'Type of note:'\r
+ end\r
+ object Label2: TLabel\r
+ Left = 16\r
+ Top = 112\r
+ Width = 26\r
+ Height = 13\r
+ Caption = 'Date:'\r
+ end\r
+ object Label3: TLabel\r
+ Left = 16\r
+ Top = 48\r
+ Width = 60\r
+ Height = 13\r
+ Caption = 'Text of note:'\r
+ end\r
+ object Label4: TLabel\r
+ Left = 16\r
+ Top = 80\r
+ Width = 34\r
+ Height = 13\r
+ Caption = 'Phone:'\r
+ end\r
+ object Label5: TLabel\r
+ Left = 88\r
+ Top = 112\r
+ Width = 32\r
+ Height = 13\r
+ Caption = 'Label5'\r
+ end\r
+ object ComboBox1: TComboBox\r
+ Left = 88\r
+ Top = 16\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 0\r
+ Text = 'Birthday'\r
+ OnSelect = ComboBox1Select\r
+ Items.Strings = (\r
+ 'Birthday'\r
+ 'Call'\r
+ 'Meeting'\r
+ 'Reminder (Memo)')\r
+ end\r
+ object DateTimePicker1: TDateTimePicker\r
+ Left = 120\r
+ Top = 112\r
+ Width = 89\r
+ Height = 25\r
+ CalAlignment = dtaLeft\r
+ Date = 37172.5632527778\r
+ Time = 37172.5632527778\r
+ DateFormat = dfShort\r
+ DateMode = dmComboBox\r
+ Kind = dtkDate\r
+ ParseInput = False\r
+ TabOrder = 2\r
+ OnChange = DateTimePicker1Change\r
+ end\r
+ object GroupBox1: TGroupBox\r
+ Left = 8\r
+ Top = 144\r
+ Width = 289\r
+ Height = 73\r
+ Caption = 'Alarm'\r
+ TabOrder = 4\r
+ object Label6: TLabel\r
+ Left = 80\r
+ Top = 16\r
+ Width = 32\r
+ Height = 13\r
+ Caption = 'Label6'\r
+ end\r
+ object CheckBox1: TCheckBox\r
+ Left = 8\r
+ Top = 16\r
+ Width = 65\r
+ Height = 17\r
+ Caption = 'Enabled'\r
+ Checked = True\r
+ State = cbChecked\r
+ TabOrder = 0\r
+ OnClick = CheckBox1Click\r
+ end\r
+ object DateTimePicker2: TDateTimePicker\r
+ Left = 112\r
+ Top = 16\r
+ Width = 89\r
+ Height = 25\r
+ CalAlignment = dtaLeft\r
+ Date = 37172.5661734144\r
+ Time = 37172.5661734144\r
+ DateFormat = dfShort\r
+ DateMode = dmComboBox\r
+ Kind = dtkDate\r
+ ParseInput = False\r
+ TabOrder = 1\r
+ OnChange = DateTimePicker2Change\r
+ end\r
+ object DateTimePicker4: TDateTimePicker\r
+ Left = 208\r
+ Top = 16\r
+ Width = 73\r
+ Height = 25\r
+ CalAlignment = dtaLeft\r
+ Date = 37172.5977914468\r
+ Time = 37172.5977914468\r
+ DateFormat = dfShort\r
+ DateMode = dmComboBox\r
+ Kind = dtkTime\r
+ ParseInput = False\r
+ TabOrder = 2\r
+ end\r
+ object RadioButton1: TRadioButton\r
+ Left = 112\r
+ Top = 40\r
+ Width = 57\r
+ Height = 25\r
+ Caption = 'Silent'\r
+ Checked = True\r
+ TabOrder = 3\r
+ TabStop = True\r
+ end\r
+ object RadioButton2: TRadioButton\r
+ Left = 208\r
+ Top = 48\r
+ Width = 73\r
+ Height = 17\r
+ Caption = 'With Tone'\r
+ TabOrder = 4\r
+ end\r
+ end\r
+ object Edit2: TEdit\r
+ Left = 88\r
+ Top = 48\r
+ Width = 201\r
+ Height = 21\r
+ TabOrder = 1\r
+ Text = 'Edit2'\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 256\r
+ Width = 81\r
+ Height = 25\r
+ Caption = '&OK'\r
+ TabOrder = 5\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 208\r
+ Top = 256\r
+ Width = 89\r
+ Height = 25\r
+ Caption = '&Cancel'\r
+ TabOrder = 6\r
+ OnClick = Button2Click\r
+ end\r
+ object DateTimePicker3: TDateTimePicker\r
+ Left = 216\r
+ Top = 112\r
+ Width = 73\r
+ Height = 25\r
+ CalAlignment = dtaLeft\r
+ Date = 37172.5971435185\r
+ Time = 37172.5971435185\r
+ DateFormat = dfShort\r
+ DateMode = dmComboBox\r
+ Kind = dtkTime\r
+ ParseInput = False\r
+ TabOrder = 3\r
+ end\r
+ object CheckBox2: TCheckBox\r
+ Left = 16\r
+ Top = 224\r
+ Width = 81\r
+ Height = 17\r
+ Caption = 'Recurrance'\r
+ TabOrder = 7\r
+ OnClick = CheckBox2Click\r
+ end\r
+ object ComboBox2: TComboBox\r
+ Left = 120\r
+ Top = 224\r
+ Width = 169\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 8\r
+ Text = '1 day'\r
+ Items.Strings = (\r
+ '1 day'\r
+ '1 week (7 days)'\r
+ '2 weeks (14 days)'\r
+ '1 year (365 days)')\r
+ end\r
+ object ComboBox3: TComboBox\r
+ Left = 88\r
+ Top = 80\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 9\r
+ end\r
+end\r
--- /dev/null
+unit Calendar;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, ComCtrls, StdCtrls,GnokiiAPI,MainUnit;\r
+\r
+type\r
+ TCalendarForm = class(TForm)\r
+ Label1: TLabel;\r
+ ComboBox1: TComboBox;\r
+ DateTimePicker1: TDateTimePicker;\r
+ Label2: TLabel;\r
+ GroupBox1: TGroupBox;\r
+ CheckBox1: TCheckBox;\r
+ DateTimePicker2: TDateTimePicker;\r
+ Edit2: TEdit;\r
+ Label3: TLabel;\r
+ Label4: TLabel;\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ DateTimePicker3: TDateTimePicker;\r
+ DateTimePicker4: TDateTimePicker;\r
+ Label5: TLabel;\r
+ Label6: TLabel;\r
+ CheckBox2: TCheckBox;\r
+ ComboBox2: TComboBox;\r
+ RadioButton1: TRadioButton;\r
+ RadioButton2: TRadioButton;\r
+ ComboBox3: TComboBox;\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure CheckBox1Click(Sender: TObject);\r
+ procedure DateTimePicker1Change(Sender: TObject);\r
+ procedure DateTimePicker2Change(Sender: TObject);\r
+ procedure FormShow(Sender: TObject);\r
+ procedure ComboBox1Select(Sender: TObject);\r
+ procedure CheckBox2Click(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ CalendarForm: TCalendarForm;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TCalendarForm.Button1Click(Sender: TObject);\r
+var\r
+ i,j,z:integer;\r
+ s:string;\r
+begin\r
+ case ComboBox1.ItemIndex of\r
+ 0:setcalendarnote.Type2:=GCN_BIRTHDAY;\r
+ 1:setcalendarnote.Type2:=GCN_CALL;\r
+ 2:setcalendarnote.Type2:=GCN_MEETING;\r
+ 3:setcalendarnote.Type2:=GCN_REMINDER;\r
+ end;\r
+\r
+ for i:=1 to 59 do\r
+ setcalendarnote.Text[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit2.text)) do\r
+ setcalendarnote.Text[i]:=Edit2.Text[i];\r
+\r
+ for i:=1 to 37 do\r
+ setcalendarnote.Phone[i]:=chr(0);\r
+ if (ComboBox3.ItemIndex=-1) then\r
+ begin\r
+ for i:=1 to strlen(pchar(ComboBox3.text)) do\r
+ setcalendarnote.Phone[i]:=ComboBox3.Text[i];\r
+ end else\r
+ begin\r
+ ReadPBKOffline;\r
+ for z:=1 to PBKOfflineNumber do\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[z].Name;\r
+ if (MainForm.Label16.Caption=ComboBox3.Text) then\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[z].Number[1]<>chr(0)) then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[z].Number;\r
+ for i:=1 to strlen(pchar(MainForm.Label14.Caption)) do\r
+ setcalendarnote.Phone[i]:=PhoneBackup.PhonePhonebook[z].Number[i];\r
+ end else\r
+ begin\r
+ for j:=1 to PhoneBackup.PhonePhonebook[z].SubEntriesCount do\r
+ begin\r
+ if PhoneBackup.PhonePhonebook[z].SubEntries[j].EntryType=GSM_Number then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[z].SubEntries[j].Number;\r
+ for i:=1 to strlen(pchar(MainForm.Label14.Caption)) do\r
+ setcalendarnote.Phone[i]:=PhoneBackup.PhonePhonebook[z].SubEntries[j].Number[i];\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ DateTimeToString(s, 'yyyy',CalendarForm.DateTimePicker1.Date);\r
+ setcalendarnote.Time.Year:=strtoint(s);\r
+ DateTimeToString(s, 'm',CalendarForm.DateTimePicker1.Date);\r
+ setcalendarnote.Time.Month:=strtoint(s);\r
+ DateTimeToString(s, 'd',CalendarForm.DateTimePicker1.Date);\r
+ setcalendarnote.Time.Day:=strtoint(s);\r
+ DateTimeToString(s, 'h',CalendarForm.DateTimePicker3.Time);\r
+ setcalendarnote.Time.Hour:=strtoint(s);\r
+ DateTimeToString(s, 'n',CalendarForm.DateTimePicker3.Time);\r
+ setcalendarnote.Time.Minute:=strtoint(s);\r
+ DateTimeToString(s, 's',CalendarForm.DateTimePicker3.Time);\r
+ setcalendarnote.Time.Second:=strtoint(s);\r
+ setcalendarnote.Time.IsSet:=1;\r
+\r
+ DateTimeToString(s, 'yyyy',CalendarForm.DateTimePicker2.Date);\r
+ setcalendarnote.Alarm.Year:=strtoint(s);\r
+ DateTimeToString(s, 'm',CalendarForm.DateTimePicker2.Date);\r
+ setcalendarnote.Alarm.Month:=strtoint(s);\r
+ DateTimeToString(s, 'd',CalendarForm.DateTimePicker2.Date);\r
+ setcalendarnote.Alarm.Day:=strtoint(s);\r
+ DateTimeToString(s, 'h',CalendarForm.DateTimePicker4.Time);\r
+ setcalendarnote.Alarm.Hour:=strtoint(s);\r
+ DateTimeToString(s, 'n',CalendarForm.DateTimePicker4.Time);\r
+ setcalendarnote.Alarm.Minute:=strtoint(s);\r
+ DateTimeToString(s, 's',CalendarForm.DateTimePicker4.Time);\r
+ setcalendarnote.Alarm.Second:=strtoint(s);\r
+\r
+ if not CheckBox1.Checked then\r
+ setcalendarnote.Alarm.Year:=0;\r
+\r
+ if CheckBox2.Checked then\r
+ begin\r
+ case ComboBox2.ItemIndex of\r
+ 0:setcalendarnote.Recurrance:=1*24;\r
+ 1:setcalendarnote.Recurrance:=7*24;\r
+ 2:setcalendarnote.Recurrance:=14*24;\r
+ 3:setcalendarnote.Recurrance:=365*24;\r
+ end;\r
+ end else\r
+ begin\r
+ setcalendarnote.Recurrance:=0;\r
+ end;\r
+\r
+ if RadioButton1.Checked then\r
+ setcalendarnote.AlarmType:=0\r
+ else\r
+ setcalendarnote.AlarmType:=1;\r
+ \r
+ GSM_DeleteCalendarNote(@setcalendarnote);\r
+ GSM_WriteCalendarNote(@setcalendarnote);\r
+\r
+ MainForm.CalendarTabSheetShow(nil);\r
+\r
+ CalendarForm.Close;\r
+end;\r
+\r
+procedure TCalendarForm.Button2Click(Sender: TObject);\r
+begin\r
+ CalendarForm.Close;\r
+end;\r
+\r
+procedure TCalendarForm.CheckBox1Click(Sender: TObject);\r
+begin\r
+ if CheckBox1.Checked then\r
+ begin\r
+ DateTimePicker2.Enabled:=true;\r
+ DateTimePicker4.Enabled:=true;\r
+ end else\r
+ begin\r
+ DateTimePicker2.Enabled:=false;\r
+ DateTimePicker4.Enabled:=false;\r
+ end;\r
+end;\r
+\r
+procedure TCalendarForm.DateTimePicker1Change(Sender: TObject);\r
+begin\r
+ Label5.Caption:=DayOfWeek3(DateTimePicker1.Date);\r
+end;\r
+\r
+procedure TCalendarForm.DateTimePicker2Change(Sender: TObject);\r
+begin\r
+ Label6.Caption:=DayOfWeek3(DateTimePicker2.Date);\r
+end;\r
+\r
+procedure TCalendarForm.FormShow(Sender: TObject);\r
+begin\r
+ Label5.Caption:=DayOfWeek3(DateTimePicker1.Date);\r
+ Label6.Caption:=DayOfWeek3(DateTimePicker2.Date);\r
+end;\r
+\r
+procedure TCalendarForm.ComboBox1Select(Sender: TObject);\r
+begin\r
+ if GSM_GetModelFeature(FN_CALENDAR)=F_CAL71 then\r
+ begin\r
+ CalendarForm.RadioButton1.Visible:=True;\r
+ CalendarForm.RadioButton2.Visible:=True;\r
+ CalendarForm.CheckBox2.Visible:=True;\r
+ CalendarForm.ComboBox2.Visible:=True;\r
+ if ComboBox1.ItemIndex=0 then //birthday\r
+ begin\r
+ CalendarForm.RadioButton1.Enabled:=True;\r
+ CalendarForm.RadioButton2.Enabled:=True;\r
+ CalendarForm.CheckBox2.Enabled:=False;\r
+ CalendarForm.ComboBox2.Enabled:=False;\r
+ end else\r
+ begin\r
+ CalendarForm.RadioButton1.Enabled:=False;\r
+ CalendarForm.RadioButton2.Enabled:=False;\r
+ CalendarForm.CheckBox2.Enabled:=True;\r
+ CalendarForm.ComboBox2.Enabled:=CalendarForm.CheckBox2.Checked;\r
+ end;\r
+ if ComboBox1.ItemIndex=3 then //memo\r
+ begin\r
+ CalendarForm.CheckBox1.Enabled:=False;\r
+ CalendarForm.Label6.Enabled:=False;\r
+ CalendarForm.DateTimePicker2.Enabled:=False;\r
+ CalendarForm.DateTimePicker4.Enabled:=False;\r
+ end else begin\r
+ CalendarForm.CheckBox1.Enabled:=True;\r
+ CalendarForm.Label6.Enabled:=True;\r
+ CalendarForm.DateTimePicker2.Enabled:=True;\r
+ CalendarForm.DateTimePicker4.Enabled:=True;\r
+ end;\r
+ end else begin\r
+ CalendarForm.RadioButton1.Visible:=False;\r
+ CalendarForm.RadioButton2.Visible:=False;\r
+ CalendarForm.CheckBox2.Visible:=False;\r
+ CalendarForm.ComboBox2.Visible:=False;\r
+ end;\r
+ if ComboBox1.ItemIndex=1 then //call\r
+ begin\r
+ CalendarForm.ComboBox3.Enabled:=True;\r
+ CalendarForm.Label4.Enabled:=True;\r
+ end else\r
+ begin\r
+ CalendarForm.ComboBox3.Enabled:=False;\r
+ CalendarForm.Label4.Enabled:=False;\r
+ end;\r
+end;\r
+\r
+procedure TCalendarForm.CheckBox2Click(Sender: TObject);\r
+begin\r
+ CalendarForm.ComboBox2.Enabled:=CalendarForm.CheckBox2.Checked;\r
+end;\r
+\r
+end.\r
--- /dev/null
+// This is header file for gnokiiapi.dll\r
+// Latest version: http://marcin-wiacek.topnet.pl\r
+\r
+unit GnokiiAPI;\r
+\r
+interface\r
+\r
+uses Classes,Forms,SysUtils;\r
+\r
+const\r
+ GSM_General = 10;\r
+ GSM_General2= 11;\r
+ GSM_Mobile = 3;\r
+ GSM_Work = 6;\r
+ GSM_Fax = 4;\r
+ GSM_Home = 2;\r
+\r
+ GSM_Date = 19;\r
+ GSM_Number = 11;\r
+ GSM_Note = 10;\r
+ GSM_Postal = 9;\r
+ GSM_Email = 8;\r
+\r
+const\r
+ GMT_ME=0;\r
+ GMT_SM=1;\r
+ GMT_FD=2;\r
+ GMT_ON=3;\r
+ GMT_EN=4;\r
+ GMT_DC=5;\r
+ GMT_RC=6;\r
+ GMT_MC=7;\r
+ GMT_LD=8;\r
+ GMT_MT=9;\r
+ GMT_TA=10;\r
+ GMT_CB=11;\r
+ GMT_CG=12;\r
+\r
+ GCT_FBUS=0;\r
+ GCT_MBUS=3;\r
+\r
+ GSS_SENTREAD=1;\r
+ GSS_NOTSENTREAD=3;\r
+\r
+const\r
+ GSM_None=0;\r
+ GSM_StartupLogo=1; //size 84*48\r
+ GSM_OperatorLogo=2; //size 72*14\r
+ GSM_CallerLogo=3; //size 72*14\r
+ GSM_PictureImage=4; //size 72*28\r
+ GSM_7110OperatorLogo=5; //size 78*21\r
+ GSM_7110StartupLogo=6; //size 96*65\r
+ GSM_6210StartupLogo=7; //size 96*60\r
+ GSM_WelcomeNoteText=8;\r
+ GSM_DealerNoteText=9;\r
+\r
+const\r
+ GSM_SoftReset=3;\r
+\r
+const\r
+ GCN_REMINDER=1;\r
+ GCN_CALL=2;\r
+ GCN_MEETING=3;\r
+ GCN_BIRTHDAY=4;\r
+\r
+const\r
+ GSMF_Text = 0;\r
+ GSMF_Fax = 34;\r
+ GSMF_Voice = 36;\r
+ GSMF_ERMES = 37;\r
+ GSMF_Paging = 38;\r
+ GSMF_UCI = 45;\r
+ GSMF_Email = 50;\r
+ GSMF_X400 = 49;\r
+\r
+ GSMV_1_Hour = 11;\r
+ GSMV_6_Hours = 71;\r
+ GSMV_24_Hours = 167;\r
+ GSMV_72_Hours = 169;\r
+ GSMV_1_Week = 173;\r
+ GSMV_Max_Time = 255;\r
+\r
+ GST_SMS=0;\r
+ GST_DR=1;\r
+\r
+ GSM_Coding_Unicode = 1;\r
+ GSM_Coding_Default = 2;\r
+\r
+ GSCT_SecurityCode = 1;\r
+\r
+ GSM_NoUDH=0;\r
+\r
+const\r
+ FN_CALENDAR=0;\r
+ FN_CALLERGROUPS=2;\r
+ FN_PHONEBOOK=3;\r
+ FN_SMS=11;\r
+ FN_STARTUP=13;\r
+ FN_PROFILES=14;\r
+ FN_RINGTONES=15;\r
+ FN_WAP=16;\r
+ FN_RINGNUMBER=17;\r
+\r
+ F_CAL61=0; //Calendar in 6110 style - 4 types,...\r
+ F_CAL33=1; //Calendar in 3310 style - 10 reminders, Unicode, 3 coding types\r
+ F_CAL71=2; //Calendar in 7110 style - 4 types, recurrance, etc.\r
+ F_PBK33SIM=3;//Phonebook in Unicode(3310 style).Name and number.No internal\r
+ F_PBK33INT=4;//Phonebook in Unicode(3310 style).Name and number.Internal available\r
+ F_PBK71INT=5;//Extended phonebook-multiple numbers,Unicode(7110 style).Internal available\r
+ F_PBK61INT=6;//Name and number,no Unicode(6110 style).Internal available\r
+ F_SMS =9; //SMS with Inbox, Outbox\r
+ F_SMS71=10; //SMS with SMS folders like in 7110\r
+ F_STANIM=20; //Startup logo animated or static\r
+ F_STA=21; //Startup logo static\r
+ F_STA62=22; //Startup logo static size 6210\r
+ F_STA71=23; //Startup logo static size 7110\r
+ F_PROF61=24; //Profiles numbered like in N6110\r
+ F_PROF51=25; //Profiles numbered like in N5110\r
+ F_PROF33=26; //Profiles numbered like in N3310.Unicode names\r
+ F_RING_SM=27;//Binary ringtone in Smart Messaging\r
+ F_RINGBIN=28;//Binary ringtone in binary format\r
+\r
+const\r
+ GE_SMSTOOLONG=22;\r
+\r
+const\r
+ PROFILE_MESSAGE_NOTONE=0;\r
+ PROFILE_MESSAGE_STANDARD=1;\r
+ PROFILE_MESSAGE_SPECIAL=2;\r
+ PROFILE_MESSAGE_BEEPONCE=3;\r
+ PROFILE_MESSAGE_ASCENDING=4;\r
+\r
+ PROFILE_WARNING_OFF=255;\r
+ PROFILE_WARNING_ON =4;\r
+\r
+ PROFILE_CALLALERT_RINGING=1;\r
+ PROFILE_CALLALERT_BEEPONCE=2;\r
+ PROFILE_CALLALERT_OFF=4;\r
+ PROFILE_CALLALERT_RINGONCE=5;\r
+ PROFILE_CALLALERT_ASCENDING=6;\r
+ PROFILE_CALLALERT_CALLERGROUPS=7;\r
+\r
+ PROFILE_KEYPAD_OFF=255;\r
+ PROFILE_KEYPAD_LEVEL1=0;\r
+ PROFILE_KEYPAD_LEVEL2=1;\r
+ PROFILE_KEYPAD_LEVEL3=2;\r
+\r
+ PROFILE_VOLUME_LEVEL1=6;\r
+ PROFILE_VOLUME_LEVEL2=7;\r
+ PROFILE_VOLUME_LEVEL3=8;\r
+ PROFILE_VOLUME_LEVEL4=9;\r
+ PROFILE_VOLUME_LEVEL5=10;\r
+\r
+ PROFILE_CALLERGROUPS_ALL=255;\r
+ PROFILE_CALLERGROUPS_FAMILY=1;\r
+ PROFILE_CALLERGROUPS_VIP=2;\r
+ PROFILE_CALLERGROUPS_FRIENDS=4;\r
+ PROFILE_CALLERGROUPS_COLLEAGUES=8;\r
+ PROFILE_CALLERGROUPS_OTHERS=16;\r
+\r
+ PROFILE_VIBRATION_OFF=0;\r
+ PROFILE_VIBRATION_ON=1;\r
+ PROFILE_VIBRATION_FIRST=2;\r
+\r
+type\r
+ GSM_NetworkInfo= record\r
+ NetworkCode: array[1..10] of char; // GSM network code\r
+ CellID: array[1..10] of char; // CellID\r
+ LAC: array[1..10] of char; // LAC\r
+ end;\r
+ PGSM_NetworkInfo=^GSM_NetworkInfo;\r
+\r
+ GSM_DateTime=record\r
+ IsSet:integer;\r
+ Year:integer;\r
+ Month:integer;\r
+ Day:integer;\r
+ Hour:integer;\r
+ Minute:integer;\r
+ Second:integer;\r
+ Timezone:integer;\r
+ end;\r
+ PGSM_DateTime=^GSM_DateTime;\r
+\r
+ GSM_SubPhonebookEntry= record\r
+ EntryType:integer;\r
+ NumberType:integer;\r
+ Number:array[1..61] of char;\r
+ Date:GSM_DateTime;\r
+ BlockNumber:integer;\r
+ end;\r
+\r
+ GSM_PhonebookEntry= record\r
+ Empty:integer;\r
+ Name:array[1..51] of char;\r
+ Number:array[1..49] of char;\r
+ MemoryType:integer;\r
+ Group:integer;\r
+ Location:integer;\r
+ SubEntries:array[1..8] of GSM_SubPhonebookEntry;\r
+ SubEntriesCount:integer;\r
+ end;\r
+ PGSM_PhonebookEntry=^GSM_PhonebookEntry;\r
+\r
+ GSM_MemoryStatus=record\r
+ MemoryType:integer;\r
+ Used:integer;\r
+ Free:integer;\r
+ end;\r
+ PGSM_memoryStatus=^GSM_MemoryStatus;\r
+\r
+ GSM_RingtoneNote=record\r
+ duration:byte;\r
+ note:byte;\r
+ tempo:integer;\r
+ style:byte;\r
+ end;\r
+\r
+ GSM_Ringtone=record\r
+ name:array[1..20] of char;\r
+ Loop:byte;\r
+ NrNotes:byte;\r
+ notes:array[1..256] of GSM_RingtoneNote;\r
+ allnotesscale:integer;\r
+ location:integer;\r
+ end;\r
+ PGSM_Ringtone=^GSM_Ringtone;\r
+\r
+ GSM_BinRingtone=record\r
+ name:array[1..20] of char;\r
+ frame:array[1..1000] of char;\r
+ length:integer;\r
+ location:integer;\r
+ end;\r
+ PGSM_BinRingtone=^GSM_BinRingtone;\r
+\r
+ GSM_Bitmap=record\r
+ heigh:byte;\r
+ width:byte;\r
+ size:word;\r
+ type2:integer;\r
+ netcode:array[1..7] of char;\r
+ text:array[1..256] of char;\r
+ bitmap:array[1..864] of char;\r
+ number:byte;\r
+ ringtone:byte;\r
+ enabled:integer;\r
+ Sender:array[1..41] of char;\r
+ end;\r
+ PGSM_Bitmap=^GSM_Bitmap;\r
+\r
+ GSM_SpeedDial=record\r
+ Number:integer;\r
+ MemoryType:integer;\r
+ Location:integer;\r
+ end;\r
+ PGSM_SpeedDial=^GSM_SpeedDial;\r
+\r
+ GSM_CalendarNote=record\r
+ Location:integer;\r
+ Type2:integer;\r
+ Time:GSM_DateTime;\r
+ Alarm:GSM_DateTime;\r
+ Text:array[1..59] of char;\r
+ Phone:array[1..37] of char;\r
+\r
+ Recurrance:integer;\r
+ YearOfBirth:integer;\r
+ AlarmType:byte;\r
+ ReadNotesInfo:integer;\r
+ end;\r
+ PGSM_CalendarNote=^GSM_CalendarNote;\r
+\r
+ GSM_MessageCenter=record\r
+ No:integer;\r
+ Name:array[1..20] of char;\r
+ Format:integer;\r
+ Validity:integer;\r
+ Number:array[1..40] of char;\r
+ DefaultRecipient:array[1..40] of char;\r
+ end;\r
+ PGSM_MessageCenter=^GSM_MessageCenter;\r
+\r
+ GSM_Profile=record\r
+ Number:integer;\r
+ Name:array[1..40] of char;\r
+ DefaultName:integer;\r
+ KeypadTone:integer;\r
+ Lights:integer;\r
+ CallAlert:integer;\r
+ Ringtone:integer;\r
+ Volume:integer;\r
+ MessageTone:integer;\r
+ WarningTone:integer;\r
+ Vibration:integer;\r
+ CallerGroups:integer;\r
+ ScreenSaver:integer;\r
+ AutomaticAnswer:integer;\r
+ end;\r
+ PGSM_Profile=^GSM_Profile;\r
+\r
+ GSM_OneSimlock=record\r
+ data:array[1..11] of char;\r
+ enabled:integer;\r
+ counter:integer;\r
+ factory:integer;\r
+ end;\r
+\r
+ GSM_AllSimlocks=record\r
+ simlocks:array[1..4] of GSM_OneSimlock;\r
+ end;\r
+ PGSM_AllSimlocks=^GSM_AllSimlocks;\r
+\r
+ GSM_OneSMSFolder=record\r
+ Name:array[1..15] of char;\r
+ locations:array[1..160] of byte;\r
+ number:byte;\r
+ end;\r
+\r
+ GSM_SMSFolders=record\r
+ Folder: array[1..24] of GSM_OneSMSFolder;\r
+ FoldersID: array[1..24] of byte;\r
+ number:byte;\r
+ end;\r
+ PGSM_SMSFolders=^GSM_SMSFolders;\r
+\r
+ GSM_SMSMessage=record\r
+ Coding:integer;\r
+ Time:GSM_DateTime;\r
+ SMSCTime:GSM_DateTime;\r
+ Length:integer;\r
+ Validity:integer;\r
+ UDHType:integer;\r
+ UDH:array[1..140] of char;\r
+ MessageText:array[1..161] of char;\r
+ MessageCenter:GSM_MessageCenter;\r
+ Sender:array[1..41] of char;\r
+ Destination:array[1..41] of char;\r
+ MessageNumber:integer;\r
+ MemoryType:integer;\r
+ Type2:integer;\r
+ Status:integer;\r
+ Class2:integer;\r
+ Compression:integer;\r
+ Location:integer;\r
+ ReplyViaSameSMSC:integer;\r
+ folder:integer;\r
+ SMSData:integer;\r
+ Name:array[1..26] of char;\r
+ end;\r
+ PGSM_SMSMessage=^GSM_SMSMessage;\r
+\r
+ GSM_MultiSMSMessage=record\r
+ number:integer;\r
+ SMS:array[1..6] of GSM_SMSMessage;\r
+ end;\r
+ PGSM_MultiSMSMessage=^GSM_MultiSMSMessage;\r
+\r
+ GSM_SMS2Foldertable=record\r
+ smsnum:integer;\r
+ folder:shortint;\r
+ location:integer;\r
+ end;\r
+\r
+ GSM_SMSStatus=record\r
+ UnRead:integer;\r
+ Number:integer;\r
+ foldertable:array[1..255] of GSM_SMS2FolderTable;\r
+ end;\r
+ PGSM_SMSStatus=^GSM_SMSStatus;\r
+\r
+ GSM_SecurityCode=record\r
+ Type2:integer;\r
+ Code:array[1..10] of char;\r
+ end;\r
+ PGSM_SecurityCode=^GSM_SecurityCode;\r
+\r
+ GSM_WAPBookmark=record\r
+ adress:array[1..256] of char;\r
+ title:array[1..51] of char;\r
+ location:Word;\r
+ end;\r
+ PGSM_WAPBookmark=^GSM_WAPBookmark;\r
+\r
+ GSM_WAPSettings=record\r
+ location:byte;\r
+ homepage:array[1..101] of char;\r
+ title:array[1..21] of char;\r
+ bearer:integer;\r
+ issecurity:integer;\r
+ iscontinuous:integer;\r
+\r
+ //for data bearer\r
+ ipaddress:array[1..21] of char;\r
+ dialup:array[1..21] of char;\r
+ user:array[1..51] of char;\r
+ password:array[1..51] of char;\r
+ isspeed14400:integer;\r
+ isISDNcall:integer;\r
+ isnormalauthentication:integer;\r
+\r
+ //for sms bearer\r
+ server:array[1..22] of char;\r
+\r
+ //for sms or ussd bearer\r
+ service:array[1..21] of char;\r
+ isIP:integer;\r
+\r
+ //for ussd bearer\r
+ code:array[1..11] of char;\r
+ end;\r
+ PGSM_WAPSettings=^GSM_WAPSettings;\r
+\r
+const\r
+ WAPSETTINGS_BEARER_SMS=0;\r
+ WAPSETTINGS_BEARER_DATA=1;\r
+ WAPSETTINGS_BEARER_USSD=2;\r
+\r
+const\r
+ GSM_CDV_Busy = 1; // Divert when busy\r
+ GSM_CDV_NoAnswer = 2; // Divert when not answered\r
+ GSM_CDV_OutOfReach = 3; // Divert when phone off or no coverage\r
+ GSM_CDV_AllTypes = 4; // Divert all calls without ringing\r
+\r
+ GSM_CDV_VoiceCalls = 1;\r
+ GSM_CDV_FaxCalls = 2;\r
+ GSM_CDV_DataCalls = 3;\r
+ GSM_CDV_AllCalls = 4;\r
+\r
+ GSM_CDV_Disable = 0;\r
+ GSM_CDV_Enable = 1;\r
+ GSM_CDV_Query = 2; // Is concrete divert enabled ?\r
+ GSM_CDV_Register = 3; // Sets divert\r
+ GSM_CDV_Erasure = 4; // Erase concrete divert\r
+\r
+type\r
+ GSM_CallDivert=record\r
+ DType:integer;\r
+ CType:integer;\r
+ Operation:integer;\r
+ Number:array[1..41] of char;\r
+ timeout:longword;\r
+ enabled:integer;\r
+ end;\r
+ PGSM_CallDivert=^GSM_CallDivert;\r
+\r
+ GSM_Backup=record\r
+ SIMPhonebookUsed:integer;\r
+ SIMPhonebookSize:integer;\r
+ SIMPhonebook:array[1..250] of GSM_PhonebookEntry;\r
+\r
+ PhonePhonebookUsed:integer;\r
+ PhonePhonebookSize:integer;\r
+ PhonePhonebook:array[1..500] of GSM_PhonebookEntry;\r
+\r
+ CallerAvailable:integer;\r
+ CallerGroups:array[1..5] of GSM_Bitmap;\r
+\r
+ SpeedAvailable:integer;\r
+ SpeedDials:array[1..8] of GSM_SpeedDial;\r
+\r
+ OperatorLogoAvailable:integer;\r
+ OperatorLogo:GSM_Bitmap;\r
+\r
+ StartupLogoAvailable:integer;\r
+ StartupLogo:GSM_Bitmap;\r
+\r
+ StartupText:GSM_Bitmap;\r
+ end;\r
+ PGSM_Backup=^GSM_Backup;\r
+\r
+var\r
+ GSMPhoneConnected: boolean=false;\r
+ GSMNetworkInfo: GSM_NetworkInfo;\r
+\r
+ GSMPort: array[1..256] of Char;\r
+ GSMModel: array[1..256] of Char;\r
+ GSMInitLength: Array[1..256] of char;\r
+ GSMSynchronizeTime: array[1..256] of char;\r
+ GSMConnection: integer=GCT_FBUS;\r
+\r
+type\r
+ TSparkyThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+\r
+var\r
+ SparkyThread: TSparkyThread;\r
+\r
+function GSM_Initialize(Port:Pchar;Model:Pchar;connectiontype:integer): integer; stdcall; external 'gnokiiapi.dll' name 'myinitialize';\r
+function GSM_Terminate(): integer; stdcall; external 'gnokiiapi.dll' name 'myterminate';\r
+\r
+function GSM_GetNetworkInfo(NetworkInfo:PGSM_NetworkInfo): integer; stdcall; external 'gnokiiapi.dll' name 'mygetnetworkinfo';\r
+function GSM_GetNetworkName(NetworkName:Pchar;NetworkCode:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetnetworkname';\r
+function GSM_GetNetworkCode(NetworkName:Pchar;NetworkCode:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetnetworkcode';\r
+function GSM_GetNetworkData(number:integer; NetworkName:Pchar;NetworkCode:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetnetworkdata';\r
+\r
+function GSM_Netmonitor(mode:integer;Screen:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mynetmonitor';\r
+\r
+function GSM_GetMemoryLocation(entry:PGSM_Phonebookentry): integer; stdcall; external 'gnokiiapi.dll' name 'mygetmemorylocation';\r
+function GSM_WritePhonebookLocation(entry:PGSM_Phonebookentry): integer; stdcall; external 'gnokiiapi.dll' name 'mywritephonebooklocation';\r
+function GSM_GetMemoryStatus(status:PGSM_MemoryStatus): integer; stdcall; external 'gnokiiapi.dll' name 'mygetmemorystatus';\r
+\r
+function GSM_ReadRingtoneFile(filename:Pchar;ringtone:PGSM_Ringtone): integer; stdcall; external 'gnokiiapi.dll' name 'myreadringtonefile';\r
+function GSM_SetRingtone(ringtone:PGSM_Ringtone;notes:Pinteger): integer; stdcall; external 'gnokiiapi.dll' name 'mysetringtone';\r
+function GSM_ReadBinRingtoneFile(filename:Pchar;ringtone:PGSM_BinRingtone): integer; stdcall; external 'gnokiiapi.dll' name 'myreadbinringtonefile';\r
+function GSM_SetBinRingtone(ringtone:PGSM_BinRingtone): integer; stdcall; external 'gnokiiapi.dll' name 'mysetbinringtone';\r
+function GSM_GetPhoneRingtone(ringtone:PGSM_BinRingtone;SMringtone:PGSM_Ringtone): integer; stdcall; external 'gnokiiapi.dll' name 'mygetphoneringtone';\r
+function GSM_PlayRingtone(ringtone:PGSM_Ringtone): integer; stdcall; external 'gnokiiapi.dll' name 'myplayringtone';\r
+function GSM_SaveRingtoneFile(filename:Pchar;ringtone:PGSM_Ringtone): integer; stdcall; external 'gnokiiapi.dll' name 'mysaveringtonefile';\r
+function GSM_SaveBinRingtoneFile(filename:Pchar;ringtone:PGSM_BinRingtone): integer; stdcall; external 'gnokiiapi.dll' name 'mysavebinringtonefile';\r
+function GSM_PlayNote(note:GSM_RingtoneNote): integer; stdcall; external 'gnokiiapi.dll' name 'myplaynote';\r
+function GSM_PlayTone(herz:integer;volume:byte): integer; stdcall; external 'gnokiiapi.dll' name 'myplaytone';\r
+function GSM_GetTempo(beats:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mygettempo';\r
+\r
+function GSM_ReadBitmapFile(filename:Pchar;bitmap:PGSM_Bitmap): integer; stdcall; external 'gnokiiapi.dll' name 'myreadbitmapfile';\r
+function GSM_SaveBitmapFile(filename:Pchar;bitmap:PGSM_Bitmap): integer; stdcall; external 'gnokiiapi.dll' name 'mysavebitmapfile';\r
+function GSM_IsPointBitmap(bitmap:PGSM_Bitmap;x:integer;y:integer): integer; stdcall; external 'gnokiiapi.dll' name 'myispointbitmap';\r
+function GSM_SetPointBitmap(bitmap:PGSM_Bitmap;x:integer;y:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mysetpointbitmap';\r
+function GSM_ClearPointBitmap(bitmap:PGSM_Bitmap;x:integer;y:integer): integer; stdcall; external 'gnokiiapi.dll' name 'myclearpointbitmap';\r
+function GSM_ClearBitmap(bitmap:PGSM_Bitmap): integer; stdcall; external 'gnokiiapi.dll' name 'myclearbitmap';\r
+function GSM_GetBitmap(bitmap:PGSM_Bitmap): integer; stdcall; external 'gnokiiapi.dll' name 'mygetbitmap';\r
+function GSM_SetBitmap(bitmap:PGSM_Bitmap): integer; stdcall; external 'gnokiiapi.dll' name 'mysetbitmap';\r
+function GSM_ResizeBitmap(bitmap:PGSM_Bitmap;bitmaptype:integer): integer; stdcall; external 'gnokiiapi.dll' name 'myresizebitmap';\r
+\r
+function GSM_GetImei(IMEI:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetimei';\r
+function GSM_GetRevision(revision:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetrevision';\r
+function GSM_GetModel(model:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetmodel';\r
+function GSM_GetModelNumber(model:Pchar;model2:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetmodelnumber';\r
+\r
+function GSM_GetDLLVersion(version:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mygetdllversion';\r
+\r
+function GSM_GetSpeedDial(entry:PGSM_SpeedDial): integer; stdcall; external 'gnokiiapi.dll' name 'mygetspeeddial';\r
+\r
+function GSM_Reset(mode:byte): integer; stdcall; external 'gnokiiapi.dll' name 'myreset';\r
+\r
+function GSM_GetCalendarNote(entry:PGSM_CalendarNote): integer; stdcall; external 'gnokiiapi.dll' name 'mygetcalendarnote';\r
+function GSM_WriteCalendarNote(entry:PGSM_CalendarNote): integer; stdcall; external 'gnokiiapi.dll' name 'mywritecalendarnote';\r
+function GSM_DeleteCalendarNote(entry:PGSM_CalendarNote): integer; stdcall; external 'gnokiiapi.dll' name 'mydeletecalendarnote';\r
+\r
+function GSM_GetAlarm(alarmnumber:integer;alarm:PGSM_DateTime): integer; stdcall; external 'gnokiiapi.dll' name 'mygetalarm';\r
+\r
+function GSM_GetSMSCenter(center:PGSM_MessageCenter): integer; stdcall; external 'gnokiiapi.dll' name 'mygetsmscenter';\r
+function GSM_SetSMSCenter(center:PGSM_MessageCenter): integer; stdcall; external 'gnokiiapi.dll' name 'mysetsmscenter';\r
+\r
+function GSM_GetProfile(profile:PGSM_Profile): integer; stdcall; external 'gnokiiapi.dll' name 'mygetprofile';\r
+\r
+function GSM_GetSimlock(simlock:PGSM_AllSimlocks): integer; stdcall; external 'gnokiiapi.dll' name 'mygetsimlock';\r
+\r
+function GSM_GetSMSFolders(folders:PGSM_SMSFolders): integer; stdcall; external 'gnokiiapi.dll' name 'mygetsmsfolders';\r
+function GSM_GetSMSMessage(sms:PGSM_SMSMessage): integer; stdcall; external 'gnokiiapi.dll' name 'mygetsmsmessage';\r
+function GSM_SaveSMSMessage(sms:PGSM_SMSMessage): integer; stdcall; external 'gnokiiapi.dll' name 'mysavesmsmessage';\r
+function GSM_SendSMSMessage(sms:PGSM_SMSMessage): integer; stdcall; external 'gnokiiapi.dll' name 'mysendsmsmessage';\r
+function GSM_DeleteSMSMessage(sms:PGSM_SMSMessage): integer; stdcall; external 'gnokiiapi.dll' name 'mydeletesmsmessage';\r
+function GSM_GetSMSStatus(folders:PGSM_SMSStatus): integer; stdcall; external 'gnokiiapi.dll' name 'mygetsmsstatus';\r
+function GSM_MakeMultiPartSMS2(SMS:PGSM_MultiSMSMessage;MessageBuffer:PByte;MessageLength:Integer;UDHType:integer;Coding:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mymakemultipartsms2';\r
+\r
+function GSM_SaveRingtoneToSMS(SMS:PGSM_MultiSMSMessage;ringtone:PGSM_Ringtone;profilestyle:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mysaveringtonetosms';\r
+function GSM_SaveCalendarNoteToSMS(SMS:PGSM_MultiSMSMessage;note:PGSM_CalendarNote): integer; stdcall; external 'gnokiiapi.dll' name 'mysavecalendarnotetosms';\r
+function GSM_SaveBitmapToSMS(SMS:PGSM_MultiSMSMessage;bitmap:PGSM_Bitmap;ScreenSaver:integer;Unicode:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mysavebitmaptosms';\r
+function GSM_SavePhonebookEntryToSMS(SMS:PGSM_MultiSMSMessage;entry:PGSM_PhonebookEntry;version:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mysavephonebookentrytosms';\r
+function GSM_SaveWAPBookmarkToSMS(SMS:PGSM_MultiSMSMessage;bookmark:PGSM_WAPBookmark): integer; stdcall; external 'gnokiiapi.dll' name 'mysavewapbookmarktosms';\r
+function GSM_SaveWAPSettingsToSMS(SMS:PGSM_MultiSMSMessage;settings:PGSM_WAPSettings): integer; stdcall; external 'gnokiiapi.dll' name 'mysavewapsettingstosms';\r
+\r
+function GSM_ReadConfig(model:Pchar;port:Pchar;initlength:Pchar;connection:Pinteger;synchronizetime:Pchar): integer; stdcall; external 'gnokiiapi.dll' name 'myreadconfig';\r
+\r
+function GSM_SetLocale(locale:pchar): integer; stdcall; external 'gnokiiapi.dll' name 'mysetlocale';\r
+\r
+function GSM_GetSecurityCode(code:PGSM_SecurityCode): integer; stdcall; external 'gnokiiapi.dll' name 'mygetsecuritycode';\r
+\r
+function GSM_GetModelFeature(featurenumber:integer): integer; stdcall; external 'gnokiiapi.dll' name 'mygetmodelfeature';\r
+\r
+function GSM_GetWAPBookmark(bookmark:PGSM_WAPBookmark): integer; stdcall; external 'gnokiiapi.dll' name 'mygetwapbookmark';\r
+function GSM_SetWAPBookmark(bookmark:PGSM_WAPBookmark): integer; stdcall; external 'gnokiiapi.dll' name 'mysetwapbookmark';\r
+\r
+function GSM_GetWAPSettings(settings:PGSM_WAPSettings): integer; stdcall; external 'gnokiiapi.dll' name 'mygetwapsettings';\r
+\r
+function GSM_CallDivertOperation(divert:PGSM_CallDivert): integer; stdcall; external 'gnokiiapi.dll' name 'mycalldivert';\r
+\r
+function GSM_SaveBackupFile(filename:Pchar;backup:PGSM_Backup): integer; stdcall; external 'gnokiiapi.dll' name 'mysavebackupfile';\r
+function GSM_ReadBackupFile(filename:Pchar;backup:PGSM_Backup): integer; stdcall; external 'gnokiiapi.dll' name 'myreadbackupfile';\r
+\r
+function GSM_DialVoice(Number:PChar): integer; stdcall; external 'gnokiiapi.dll' name 'mydialvoice';\r
+\r
+implementation\r
+\r
+procedure TSparkyThread.Execute;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ if GSM_GetNetworkInfo(@GSMNetworkInfo)<>0 then\r
+ begin\r
+ GSMPhoneConnected:=false;\r
+ GSM_Terminate();\r
+ end else\r
+ begin\r
+ if not SparkyThread.Suspended then SparkyThread.Suspend;\r
+ end;\r
+ end else\r
+ begin\r
+ if GSM_Initialize(@GSMPort,@GSMModel,GSMConnection)=0 then\r
+ begin\r
+ GSMPhoneConnected:=true;\r
+ end else\r
+ GSM_Terminate();\r
+ end;\r
+ end;\r
+ GSMPhoneConnected:=false;\r
+end;\r
+\r
+begin\r
+ GSM_ReadConfig(@GSMmodel,@GSMport,@GSMinitlength,@GSMconnection,@GSMsynchronizetime);\r
+ GSM_SetLocale('.1250');\r
+ GSMPhoneConnected:=false;\r
+ SparkyThread:=TSparkyThread.Create(True);\r
+ SparkyThread.Priority:=tpIdle;\r
+// SparkyThread.Priority:=tpLowest;\r
+ SparkyThread.Resume;\r
+end.\r
--- /dev/null
+-$A8\r
+-$B-\r
+-$C+\r
+-$D+\r
+-$E-\r
+-$F-\r
+-$G+\r
+-$H+\r
+-$I+\r
+-$J-\r
+-$K-\r
+-$L+\r
+-$M-\r
+-$N+\r
+-$O+\r
+-$P+\r
+-$Q-\r
+-$R-\r
+-$S-\r
+-$T-\r
+-$U-\r
+-$V+\r
+-$W-\r
+-$X+\r
+-$YD\r
+-$Z1\r
+-cg\r
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;\r
+-H+\r
+-W+\r
+-M\r
+-$M16384,1048576\r
+-K$00400000\r
+-LE"d:\program files2\delphi\Projects\Bpl"\r
+-LN"d:\program files2\delphi\Projects\Bpl"\r
--- /dev/null
+[FileVersion]\r
+Version=6.0\r
+[Compiler]\r
+A=8\r
+B=0\r
+C=1\r
+D=1\r
+E=0\r
+F=0\r
+G=1\r
+H=1\r
+I=1\r
+J=0\r
+K=0\r
+L=1\r
+M=0\r
+N=1\r
+O=1\r
+P=1\r
+Q=0\r
+R=0\r
+S=0\r
+T=0\r
+U=0\r
+V=1\r
+W=0\r
+X=1\r
+Y=1\r
+Z=1\r
+ShowHints=1\r
+ShowWarnings=1\r
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;\r
+[Linker]\r
+MapFile=0\r
+OutputObjs=0\r
+ConsoleApp=1\r
+DebugInfo=0\r
+RemoteSymbols=0\r
+MinStackSize=16384\r
+MaxStackSize=1048576\r
+ImageBase=4194304\r
+ExeDescription=\r
+[Directories]\r
+OutputDir=\r
+UnitOutputDir=\r
+PackageDLLOutputDir=\r
+PackageDCPOutputDir=\r
+SearchPath=\r
+Packages=vcl;rtl;vclx;VclSmp;vclshlctrls\r
+Conditionals=\r
+DebugSourceDirs=\r
+UsePackages=0\r
+[Parameters]\r
+RunParams=\r
+HostApplication=\r
+Launcher=\r
+UseLauncher=0\r
+DebugCWD=\r
+[Version Info]\r
+IncludeVerInfo=1\r
+AutoIncBuild=1\r
+MajorVer=0\r
+MinorVer=3\r
+Release=0\r
+Build=0\r
+Debug=0\r
+PreRelease=1\r
+Special=0\r
+Private=0\r
+DLL=0\r
+Locale=1045\r
+CodePage=1250\r
+[Version Info Keys]\r
+CompanyName=\r
+FileDescription=\r
+FileVersion=0.3.0.0\r
+InternalName=\r
+LegalCopyright=Marcin Wiacek http://marcin-wiacek.topnet.pl\r
+LegalTrademarks=\r
+OriginalFilename=\r
+ProductName=\r
+ProductVersion=0.3.0.0\r
+Comments=\r
+[HistoryLists\hlUnitAliases]\r
+Count=1\r
+Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;\r
--- /dev/null
+program Project1;\r
+\r
+uses\r
+ Forms,\r
+ MainUnit in 'mainunit.pas' {MainForm},\r
+ GnokiiAPI in 'GnokiiAPI.pas',\r
+ LogosRing in 'LogosRing.pas' {LogosRingForm},\r
+ Netmon in 'netmon.pas' {NetmonForm},\r
+ Calendar in 'Calendar.pas' {CalendarForm},\r
+ SMSEdit in 'smsedit.pas' {SMSEditForm},\r
+ smscedit in 'smscedit.pas' {SMSCEditForm},\r
+ pbkedit in 'pbkedit.pas' {PbkForm},\r
+ backup in 'backup.pas' {BackupForm},\r
+ backup2 in 'backup2.pas' {BackupProgressForm},\r
+ pbkedit2 in 'pbkedit2.pas' {PBKEditForm},\r
+ wapbook in 'wapbook.pas' {WAPBookForm};\r
+\r
+{$R *.res}\r
+\r
+begin\r
+ Application.Initialize;\r
+ Application.Title := 'Mygnokii for WIN32';\r
+ Application.CreateForm(TMainForm, MainForm);\r
+ Application.CreateForm(TLogosRingForm, LogosRingForm);\r
+ Application.CreateForm(TNetmonForm, NetmonForm);\r
+ Application.CreateForm(TCalendarForm, CalendarForm);\r
+ Application.CreateForm(TSMSEditForm, SMSEditForm);\r
+ Application.CreateForm(TSMSCEditForm, SMSCEditForm);\r
+ Application.CreateForm(TPbkForm, PbkForm);\r
+ Application.CreateForm(TNetmonForm, NetmonForm);\r
+ Application.CreateForm(TBackupForm, BackupForm);\r
+ Application.CreateForm(TBackupProgressForm, BackupProgressForm);\r
+ Application.CreateForm(TPBKEditForm, PBKEditForm);\r
+ Application.CreateForm(TWAPBookForm, WAPBookForm);\r
+ Application.Run;\r
+end.\r
--- /dev/null
+object BackupForm: TBackupForm\r
+ Left = 414\r
+ Top = 99\r
+ Width = 290\r
+ Height = 290\r
+ BorderIcons = [biSystemMenu, biMinimize]\r
+ Caption = 'Backup/Restore settings'\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ OnActivate = FormActivate\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object GroupBox1: TGroupBox\r
+ Left = 8\r
+ Top = 8\r
+ Width = 265\r
+ Height = 129\r
+ Caption = ' '\r
+ TabOrder = 0\r
+ object CheckBox5: TCheckBox\r
+ Left = 8\r
+ Top = 88\r
+ Width = 185\r
+ Height = 17\r
+ Caption = 'Startup text and logo'\r
+ TabOrder = 4\r
+ end\r
+ object CheckBox1: TCheckBox\r
+ Left = 8\r
+ Top = 72\r
+ Width = 169\r
+ Height = 17\r
+ Caption = 'Phonebook from SIM card'\r
+ TabOrder = 0\r
+ end\r
+ object CheckBox2: TCheckBox\r
+ Left = 8\r
+ Top = 56\r
+ Width = 153\r
+ Height = 17\r
+ Caption = 'Phonebook from phone'\r
+ TabOrder = 1\r
+ end\r
+ object CheckBox4: TCheckBox\r
+ Left = 8\r
+ Top = 40\r
+ Width = 169\r
+ Height = 17\r
+ Caption = 'Operator logo'\r
+ TabOrder = 3\r
+ end\r
+ object CheckBox3: TCheckBox\r
+ Left = 8\r
+ Top = 24\r
+ Width = 153\r
+ Height = 17\r
+ Caption = 'Caller groups'\r
+ TabOrder = 2\r
+ end\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 232\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'OK'\r
+ TabOrder = 1\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 192\r
+ Top = 232\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'Cancel'\r
+ TabOrder = 2\r
+ OnClick = Button2Click\r
+ end\r
+ object GroupBox2: TGroupBox\r
+ Left = 8\r
+ Top = 144\r
+ Width = 265\r
+ Height = 81\r
+ Caption = 'Where do you want to export your settings ?'\r
+ TabOrder = 3\r
+ object ListBox1: TListBox\r
+ Left = 2\r
+ Top = 15\r
+ Width = 261\r
+ Height = 64\r
+ Align = alClient\r
+ ItemHeight = 13\r
+ Items.Strings = (\r
+ 'Save to Logo Manager Backup (LMB) file')\r
+ TabOrder = 0\r
+ end\r
+ end\r
+end\r
--- /dev/null
+unit backup;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls;\r
+\r
+type\r
+ TBackupForm = class(TForm)\r
+ GroupBox1: TGroupBox;\r
+ CheckBox1: TCheckBox;\r
+ CheckBox2: TCheckBox;\r
+ CheckBox3: TCheckBox;\r
+ CheckBox4: TCheckBox;\r
+ CheckBox5: TCheckBox;\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ GroupBox2: TGroupBox;\r
+ ListBox1: TListBox;\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure FormActivate(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ BackupForm: TBackupForm;\r
+\r
+implementation\r
+\r
+uses MainUnit;\r
+\r
+{$R *.dfm}\r
+\r
+procedure TBackupForm.Button2Click(Sender: TObject);\r
+begin\r
+ PhoneBackupAvailable:=false;\r
+ BackupForm.Close;\r
+end;\r
+\r
+procedure TBackupForm.Button1Click(Sender: TObject);\r
+begin\r
+ BackupForm.Close;\r
+end;\r
+\r
+procedure TBackupForm.FormActivate(Sender: TObject);\r
+begin\r
+ CheckBox1.Checked:=false;\r
+ CheckBox2.Checked:=false;\r
+ CheckBox3.Checked:=false;\r
+ CheckBox4.Checked:=false;\r
+ CheckBox5.Checked:=false;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object BackupProgressForm: TBackupProgressForm\r
+ Left = 234\r
+ Top = 220\r
+ BorderStyle = bsToolWindow\r
+ Caption = 'Backup/Restore'\r
+ ClientHeight = 219\r
+ ClientWidth = 329\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ OnActivate = FormActivate\r
+ OnCloseQuery = FormCloseQuery\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object GroupBox1: TGroupBox\r
+ Left = 8\r
+ Top = 16\r
+ Width = 313\r
+ Height = 153\r
+ Caption = 'Progress'\r
+ TabOrder = 0\r
+ object Label1: TLabel\r
+ Left = 8\r
+ Top = 72\r
+ Width = 114\r
+ Height = 13\r
+ Caption = 'Phonebook from phone:'\r
+ end\r
+ object Label2: TLabel\r
+ Left = 8\r
+ Top = 96\r
+ Width = 127\r
+ Height = 13\r
+ Caption = 'Phonebook from SIM card:'\r
+ end\r
+ object Label3: TLabel\r
+ Left = 8\r
+ Top = 24\r
+ Width = 64\r
+ Height = 13\r
+ Caption = 'Caller groups:'\r
+ end\r
+ object Label4: TLabel\r
+ Left = 8\r
+ Top = 48\r
+ Width = 67\r
+ Height = 13\r
+ Caption = 'Operator logo:'\r
+ end\r
+ object Label5: TLabel\r
+ Left = 144\r
+ Top = 48\r
+ Width = 57\r
+ Height = 13\r
+ Caption = ' '\r
+ end\r
+ object Label6: TLabel\r
+ Left = 8\r
+ Top = 120\r
+ Width = 101\r
+ Height = 13\r
+ Caption = 'Startup text and logo:'\r
+ end\r
+ object Label7: TLabel\r
+ Left = 144\r
+ Top = 120\r
+ Width = 108\r
+ Height = 13\r
+ Caption = ' '\r
+ end\r
+ object ProgressBar1: TProgressBar\r
+ Left = 144\r
+ Top = 72\r
+ Width = 153\r
+ Height = 17\r
+ Min = 0\r
+ Max = 100\r
+ Smooth = True\r
+ Step = 1\r
+ TabOrder = 0\r
+ end\r
+ object ProgressBar2: TProgressBar\r
+ Left = 144\r
+ Top = 96\r
+ Width = 153\r
+ Height = 17\r
+ Min = 0\r
+ Max = 100\r
+ Smooth = True\r
+ Step = 1\r
+ TabOrder = 1\r
+ end\r
+ object ProgressBar3: TProgressBar\r
+ Left = 144\r
+ Top = 24\r
+ Width = 153\r
+ Height = 17\r
+ Min = 0\r
+ Max = 5\r
+ Smooth = True\r
+ Step = 1\r
+ TabOrder = 2\r
+ end\r
+ end\r
+ object Button1: TButton\r
+ Left = 104\r
+ Top = 184\r
+ Width = 105\r
+ Height = 25\r
+ Caption = '&Cancel'\r
+ TabOrder = 1\r
+ OnClick = Button1Click\r
+ end\r
+end\r
--- /dev/null
+unit backup2;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, ComCtrls, StdCtrls, GnokiiAPI;\r
+\r
+type\r
+ TBackupThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+\r
+type\r
+ TBackupProgressForm = class(TForm)\r
+ GroupBox1: TGroupBox;\r
+ Button1: TButton;\r
+ Label1: TLabel;\r
+ ProgressBar1: TProgressBar;\r
+ ProgressBar2: TProgressBar;\r
+ Label2: TLabel;\r
+ Label3: TLabel;\r
+ ProgressBar3: TProgressBar;\r
+ Label4: TLabel;\r
+ Label5: TLabel;\r
+ Label6: TLabel;\r
+ Label7: TLabel;\r
+ procedure FormActivate(Sender: TObject);\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ BackupProgressForm: TBackupProgressForm;\r
+ BackupThread: TBackupThread;\r
+\r
+implementation\r
+\r
+uses MainUnit, backup;\r
+\r
+{$R *.dfm}\r
+\r
+procedure TBackupThread.Execute;\r
+var\r
+ pbkstatus:GSM_MemoryStatus;\r
+ bitmap:GSM_Bitmap;\r
+ pbkentry:GSM_PhonebookEntry;\r
+ i,j:integer;\r
+begin\r
+ if PhoneBackupAvailable then //backup\r
+ begin\r
+ if backupform.checkbox3.checked then\r
+ begin\r
+ PhoneBackup.CallerAvailable:=1;\r
+ for i:=1 to 5 do\r
+ begin\r
+ bitmap.type2:=GSM_CallerLogo;\r
+ bitmap.number:=i-1;\r
+ GSM_GetBitmap(@bitmap);\r
+ PhoneBackup.CallerGroups[i]:=bitmap;\r
+ backupprogressform.ProgressBar3.StepIt;\r
+ if Terminated then exit;\r
+ end;\r
+ end;\r
+ if backupform.checkbox4.checked then\r
+ begin\r
+ bitmap.type2:=GSM_7110OperatorLogo;\r
+ if (GSM_GetBitmap(@bitmap)<>0) then\r
+ begin\r
+ if Terminated then exit;\r
+ bitmap.type2:=GSM_OperatorLogo;\r
+ if (GSM_GetBitmap(@bitmap)=0) then\r
+ begin\r
+ PhoneBackup.OperatorLogoAvailable:=1;\r
+ end\r
+ end else PhoneBackup.OperatorLogoAvailable:=1;\r
+ if Terminated then exit;\r
+ if PhoneBackup.OperatorLogoAvailable=1 then\r
+ begin\r
+ PhoneBackup.OperatorLogo:=Bitmap;\r
+ BackupProgressForm.Label5.Caption:='Done';\r
+ end else\r
+ begin\r
+ BackupProgressForm.Label5.Caption:='Failed';\r
+ end;\r
+ end;\r
+ if backupform.checkbox2.checked then\r
+ begin\r
+ pbkstatus.MemoryType:=GMT_ME;\r
+ GSM_GetMemoryStatus(@pbkstatus);\r
+ if Terminated then exit;\r
+ backupprogressform.ProgressBar1.Max:=pbkstatus.Used;\r
+ PhoneBackup.PhonePhonebookSize:=pbkstatus.Used+pbkstatus.Free;\r
+ i:=1;j:=0;\r
+ while (i<>pbkstatus.Used+pbkstatus.Free) do\r
+ begin\r
+ pbkentry.MemoryType:=GMT_ME;\r
+ pbkentry.Location:=i;\r
+ GSM_GetMemoryLocation(@pbkentry);\r
+ if Terminated then exit;\r
+ if (pbkentry.Name[1]<>chr(0)) then\r
+ begin\r
+ PhoneBackup.PhonePhonebookUsed:=PhoneBackup.PhonePhonebookUsed+1;\r
+ PhoneBackup.PhonePhonebook[PhoneBackup.PhonePhonebookUsed]:=pbkentry;\r
+ backupprogressform.ProgressBar1.StepIt;\r
+ j:=j+1;\r
+ end;\r
+ if j=pbkstatus.Used then break;\r
+ i:=i+1;\r
+ end;\r
+ end;\r
+ if backupform.checkbox1.checked then\r
+ begin\r
+ pbkstatus.MemoryType:=GMT_SM;\r
+ GSM_GetMemoryStatus(@pbkstatus);\r
+ if Terminated then exit;\r
+ backupprogressform.ProgressBar2.Max:=pbkstatus.Used;\r
+ PhoneBackup.SIMPhonebookSize:=pbkstatus.Used+pbkstatus.Free;\r
+ i:=1;j:=0;\r
+ while (i<>pbkstatus.Used+pbkstatus.Free) do\r
+ begin\r
+ pbkentry.MemoryType:=GMT_SM;\r
+ pbkentry.Location:=i;\r
+ GSM_GetMemoryLocation(@pbkentry);\r
+ if Terminated then exit;\r
+ if (pbkentry.Name[1]<>chr(0)) then\r
+ begin\r
+ PhoneBackup.SIMPhonebookUsed:=PhoneBackup.SIMPhonebookUsed+1;\r
+ PhoneBackup.SIMPhonebook[PhoneBackup.SIMPhonebookUsed]:=pbkentry;\r
+ backupprogressform.ProgressBar2.StepIt;\r
+ j:=j+1;\r
+ end;\r
+ if j=pbkstatus.Used then break;\r
+ i:=i+1;\r
+ end;\r
+ end;\r
+ if backupform.checkbox5.checked then\r
+ begin\r
+ case GSM_GetModelFeature(FN_STARTUP) of\r
+ F_STANIM :PhoneBackup.StartupLogo.type2:=GSM_StartupLogo;\r
+ F_STA :PhoneBackup.StartupLogo.type2:=GSM_StartupLogo;\r
+ F_STA62 :PhoneBackup.StartupLogo.type2:=GSM_6210StartupLogo;\r
+ F_STA71 :PhoneBackup.StartupLogo.type2:=GSM_7110StartupLogo;\r
+ end;\r
+ if GSM_GetModelFeature(FN_STARTUP)<>0 then\r
+ begin\r
+ PhoneBackup.StartupLogoAvailable:=1;\r
+ GSM_GetBitmap(@PhoneBackup.StartupLogo);\r
+ if Terminated then exit;\r
+ end;\r
+ PhoneBackup.StartupText.type2:=GSM_WelcomeNoteText;\r
+ GSM_GetBitmap(@PhoneBackup.StartupText);\r
+ BackupProgressForm.Label7.Caption:='Done';\r
+ if Terminated then exit;\r
+ end;\r
+ if not Terminated then\r
+ begin\r
+ if MainForm.SaveDialog1.Execute then\r
+ begin\r
+ GSM_SaveBackupFile(PChar(MainForm.SaveDialog1.FileName),@phonebackup);\r
+ end;\r
+ BackupProgressForm.Close;\r
+ end;\r
+ end else //restore\r
+ begin\r
+ if backupform.checkbox3.checked then\r
+ begin\r
+ for i:=1 to 5 do\r
+ begin\r
+ GSM_SetBitmap(@PhoneBackup.CallerGroups[i]);\r
+ backupprogressform.ProgressBar3.StepIt;\r
+ if Terminated then exit;\r
+ end;\r
+ end;\r
+ if backupform.checkbox4.checked then\r
+ begin\r
+ GSM_SetBitmap(@PhoneBackup.OperatorLogo);\r
+ if Terminated then exit;\r
+ BackupProgressForm.Label5.Caption:='Done';\r
+ end;\r
+ if backupform.checkbox2.checked then\r
+ begin\r
+ pbkstatus.MemoryType:=GMT_ME;\r
+ GSM_GetMemoryStatus(@pbkstatus);\r
+ if Terminated then exit;\r
+ backupprogressform.ProgressBar1.Max:=pbkstatus.Used+pbkstatus.Free;\r
+ i:=1;j:=1;\r
+ while (i<>pbkstatus.Used+pbkstatus.Free) do\r
+ begin\r
+ pbkentry.MemoryType:=GMT_ME;\r
+ pbkentry.Location:=i;\r
+ pbkentry.Name[1]:=chr(0);\r
+ pbkentry.Number[1]:=chr(0);\r
+ pbkentry.SubEntriesCount:=0;\r
+ if j<=PhoneBackup.PhonePhonebookUsed then\r
+ begin\r
+ if PhoneBackup.PhonePhonebook[j].Location=pbkentry.Location then\r
+ begin\r
+ pbkentry:=PhoneBackup.PhonePhonebook[j];\r
+ j:=j+1;\r
+ end;\r
+ end;\r
+ GSM_WritePhonebookLocation(@pbkentry);\r
+ if Terminated then exit;\r
+ backupprogressform.ProgressBar1.StepIt;\r
+ i:=i+1;\r
+ end;\r
+ end;\r
+ if backupform.checkbox1.checked then\r
+ begin\r
+ pbkstatus.MemoryType:=GMT_SM;\r
+ GSM_GetMemoryStatus(@pbkstatus);\r
+ if Terminated then exit;\r
+ backupprogressform.ProgressBar2.Max:=pbkstatus.Used+pbkstatus.Free;\r
+ i:=1;j:=1;\r
+ while (i<>pbkstatus.Used+pbkstatus.Free) do\r
+ begin\r
+ pbkentry.MemoryType:=GMT_SM;\r
+ pbkentry.Location:=i;\r
+ pbkentry.Name[1]:=chr(0);\r
+ pbkentry.Number[1]:=chr(0);\r
+ pbkentry.SubEntriesCount:=0;\r
+ if j<=PhoneBackup.SIMPhonebookUsed then\r
+ begin\r
+ if PhoneBackup.SIMPhonebook[j].Location=pbkentry.Location then\r
+ begin\r
+ pbkentry:=PhoneBackup.SIMPhonebook[j];\r
+ j:=j+1;\r
+ end;\r
+ end;\r
+ GSM_WritePhonebookLocation(@pbkentry);\r
+ if Terminated then exit;\r
+ backupprogressform.ProgressBar2.StepIt;\r
+ i:=i+1;\r
+ end;\r
+ end;\r
+ if backupform.checkbox5.checked then\r
+ begin\r
+ if GSM_GetModelFeature(FN_STARTUP)<>0 then\r
+ begin\r
+ if PhoneBackup.StartupLogoAvailable<>0 then\r
+ begin\r
+ GSM_SetBitmap(@PhoneBackup.StartupLogo);\r
+ if Terminated then exit;\r
+ end;\r
+ end;\r
+ GSM_SetBitmap(@PhoneBackup.StartupText);\r
+ end;\r
+ if not Terminated then\r
+ begin\r
+ BackupProgressForm.Close;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TBackupProgressForm.FormActivate(Sender: TObject);\r
+begin\r
+ MainForm.Timer2.Enabled:=false;\r
+\r
+ BackupProgressForm.Label5.Caption:='';\r
+ BackupProgressForm.Label7.Caption:='';\r
+\r
+ ProgressBar1.Position:=0;\r
+ ProgressBar2.Position:=0;\r
+ ProgressBar3.Position:=0;\r
+\r
+ Label3.Enabled:=backupform.checkbox3.checked;\r
+ Label4.Enabled:=backupform.checkbox4.checked;\r
+ Label1.Enabled:=backupform.checkbox2.checked;\r
+ Label2.Enabled:=backupform.checkbox1.checked;\r
+ Label6.Enabled:=backupform.checkbox5.checked;\r
+\r
+ BackupThread:=TBackupThread.Create(false);\r
+end;\r
+\r
+procedure TBackupProgressForm.Button1Click(Sender: TObject);\r
+begin\r
+ BackupProgressForm.Close;\r
+end;\r
+\r
+procedure TBackupProgressForm.FormCloseQuery(Sender: TObject;\r
+ var CanClose: Boolean);\r
+begin\r
+ BackupThread.Terminate();\r
+ BackupProgressForm.Close;\r
+ MainForm.Timer2.Enabled:=true;\r
+ CanClose:=true;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object LogosRingForm: TLogosRingForm\r
+ Left = 192\r
+ Top = 108\r
+ BorderStyle = bsDialog\r
+ Caption = 'LogosRingForm'\r
+ ClientHeight = 106\r
+ ClientWidth = 202\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Label1: TLabel\r
+ Left = 8\r
+ Top = 8\r
+ Width = 32\r
+ Height = 13\r
+ Caption = 'Label1'\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 72\r
+ Width = 73\r
+ Height = 25\r
+ Caption = '&Yes'\r
+ TabOrder = 0\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 120\r
+ Top = 72\r
+ Width = 73\r
+ Height = 25\r
+ Caption = '&No'\r
+ TabOrder = 1\r
+ OnClick = Button2Click\r
+ end\r
+ object ComboBox3: TComboBox\r
+ Left = 8\r
+ Top = 32\r
+ Width = 185\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 2\r
+ Text = 'ComboBox3'\r
+ end\r
+end\r
--- /dev/null
+unit LogosRing;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls,GnokiiAPI,MainUnit;\r
+\r
+type\r
+ TLogosRingForm = class(TForm)\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ ComboBox3: TComboBox;\r
+ Label1: TLabel;\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure Button2Click(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ LogosRingForm: TLogosRingForm;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TLogosRingForm.Button1Click(Sender: TObject);\r
+begin\r
+ ComboBox3.Visible:=true;\r
+ LogosRingForm.Close;\r
+end;\r
+\r
+procedure TLogosRingForm.Button2Click(Sender: TObject);\r
+begin\r
+ ComboBox3.Visible:=false;\r
+ LogosRingForm.Close;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object MainForm: TMainForm\r
+ Left = 177\r
+ Top = 126\r
+ BorderStyle = bsSingle\r
+ Caption = 'Mygnokii for WIN32'\r
+ ClientHeight = 377\r
+ ClientWidth = 607\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ Menu = MainMenu1\r
+ OldCreateOrder = False\r
+ OnCreate = FormCreate\r
+ OnResize = FormResize\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Splitter1: TSplitter\r
+ Left = 93\r
+ Top = 0\r
+ Width = 4\r
+ Height = 360\r
+ Cursor = crHSplit\r
+ end\r
+ object StatusBar1: TStatusBar\r
+ Left = 0\r
+ Top = 360\r
+ Width = 607\r
+ Height = 17\r
+ Panels = <\r
+ item\r
+ Width = 300\r
+ end\r
+ item\r
+ Alignment = taCenter\r
+ BiDiMode = bdLeftToRight\r
+ ParentBiDiMode = False\r
+ Width = 50\r
+ end>\r
+ SimplePanel = False\r
+ end\r
+ object TreeView1: TTreeView\r
+ Left = 0\r
+ Top = 0\r
+ Width = 93\r
+ Height = 360\r
+ Align = alLeft\r
+ AutoExpand = True\r
+ BevelInner = bvNone\r
+ BevelOuter = bvNone\r
+ Indent = 19\r
+ ReadOnly = True\r
+ ShowRoot = False\r
+ TabOrder = 1\r
+ OnKeyUp = TreeView1KeyUp\r
+ OnMouseDown = TreeView1MouseDown\r
+ Items.Data = {\r
+ 020000001E0000000000000000000000FFFFFFFFFFFFFFFF000000000D000000\r
+ 0550686F6E65210000000100000000000000FFFFFFFFFFFFFFFF000000000000\r
+ 00000843616C656E646172240000000200000000000000FFFFFFFFFFFFFFFF00\r
+ 000000000000000B43616C6C20646976657274260000000300000000000000FF\r
+ FFFFFFFFFFFFFF00000000000000000D43616C6C65722067726F7570731E0000\r
+ 000400000000000000FFFFFFFFFFFFFFFF0000000000000000054C6F676F7323\r
+ 0000000500000000000000FFFFFFFFFFFFFFFF00000000000000000A4E65746D\r
+ 6F6E69746F72220000000600000000000000FFFFFFFFFFFFFFFF000000000000\r
+ 00000950686F6E65626F6F6B210000000700000000000000FFFFFFFFFFFFFFFF\r
+ 00000000000000000850726F66696C6573220000000800000000000000FFFFFF\r
+ FFFFFFFFFF00000000000000000952696E67746F6E65731C0000000900000000\r
+ 000000FFFFFFFFFFFFFFFF000000000000000003534D53240000000A00000000\r
+ 000000FFFFFFFFFFFFFFFF00000000000000000B534D532063656E7465727324\r
+ 0000000B00000000000000FFFFFFFFFFFFFFFF00000000000000000B53706565\r
+ 64206469616C73260000000C00000000000000FFFFFFFFFFFFFFFF0000000000\r
+ 0000000D57415020626F6F6B6D61726B73250000000D00000000000000FFFFFF\r
+ FFFFFFFFFF00000000000000000C5741502073657474696E67731B0000000E00\r
+ 000000000000FFFFFFFFFFFFFFFF0000000003000000025043210000000F0000\r
+ 0000000000FFFFFFFFFFFFFFFF00000000000000000843616C656E6461722200\r
+ 00001000000000000000FFFFFFFFFFFFFFFF00000000000000000950686F6E65\r
+ 626F6F6B1C0000001100000000000000FFFFFFFFFFFFFFFF0000000000000000\r
+ 03534D53}\r
+ end\r
+ object PageControl1: TPageControl\r
+ Left = 97\r
+ Top = 0\r
+ Width = 510\r
+ Height = 360\r
+ ActivePage = ConfigTabSheet\r
+ Align = alClient\r
+ Style = tsFlatButtons\r
+ TabIndex = 12\r
+ TabOrder = 2\r
+ object NetmonitorTabSheet: TTabSheet\r
+ Caption = 'netm'\r
+ OnHide = NetmonitorTabSheetHide\r
+ OnShow = NetmonitorTabSheetShow\r
+ object GroupBox1: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Netmonitor'\r
+ TabOrder = 0\r
+ object Label1: TLabel\r
+ Left = 8\r
+ Top = 184\r
+ Width = 72\r
+ Height = 13\r
+ Caption = 'Number of test:'\r
+ end\r
+ object NetmonGroupBox: TGroupBox\r
+ Left = 8\r
+ Top = 24\r
+ Width = 169\r
+ Height = 121\r
+ Caption = ' Screen '\r
+ TabOrder = 0\r
+ object NetmonLabel: TLabel\r
+ Left = 9\r
+ Top = 17\r
+ Width = 10\r
+ Height = 18\r
+ Font.Charset = OEM_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -19\r
+ Font.Name = 'Terminal'\r
+ Font.Style = []\r
+ ParentFont = False\r
+ end\r
+ end\r
+ object SpinEdit1: TSpinEdit\r
+ Left = 88\r
+ Top = 184\r
+ Width = 41\r
+ Height = 22\r
+ MaxValue = 133\r
+ MinValue = 1\r
+ TabOrder = 1\r
+ Value = 1\r
+ OnChange = SpinEdit1Change\r
+ end\r
+ object Button11: TButton\r
+ Left = 232\r
+ Top = 24\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'Set in phone'\r
+ TabOrder = 2\r
+ OnClick = Button11Click\r
+ end\r
+ end\r
+ end\r
+ object PhonebookTabSheet: TTabSheet\r
+ Caption = 'phonebook'\r
+ ImageIndex = 1\r
+ OnHide = PhonebookTabSheetHide\r
+ OnShow = PhonebookTabSheetShow\r
+ object GroupBox2: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Phonebook'\r
+ TabOrder = 0\r
+ object Panel1: TPanel\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 25\r
+ Align = alTop\r
+ BevelOuter = bvNone\r
+ TabOrder = 0\r
+ object Label2: TLabel\r
+ Left = 8\r
+ Top = 0\r
+ Width = 63\r
+ Height = 13\r
+ Caption = 'Memory type:'\r
+ end\r
+ object ComboBox1: TComboBox\r
+ Left = 80\r
+ Top = 0\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 0\r
+ Text = 'None'\r
+ OnChange = ComboBox1Change\r
+ Items.Strings = (\r
+ 'None'\r
+ 'Dialed numbers'\r
+ 'Missed numbers'\r
+ 'Own numbers'\r
+ 'Phonebook in phone'\r
+ 'Phonebook in SIM'\r
+ 'Received numbers')\r
+ end\r
+ end\r
+ object ListView1: TListView\r
+ Left = 2\r
+ Top = 40\r
+ Width = 498\r
+ Height = 287\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Pos'\r
+ Width = 30\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 130\r
+ end\r
+ item\r
+ Caption = 'Number'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Group'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'Date'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Time'\r
+ Width = 100\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = PBKPopupMenu\r
+ SortType = stData\r
+ TabOrder = 1\r
+ ViewStyle = vsReport\r
+ OnSelectItem = ListView1SelectItem\r
+ end\r
+ end\r
+ end\r
+ object PhoneTabSheet: TTabSheet\r
+ Caption = 'phone'\r
+ ImageIndex = 2\r
+ OnShow = PhoneTabSheetShow\r
+ object GroupBox3: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Phone'\r
+ TabOrder = 0\r
+ object Label14: TLabel\r
+ Left = 432\r
+ Top = 24\r
+ Width = 38\r
+ Height = 13\r
+ Caption = 'Label14'\r
+ Visible = False\r
+ end\r
+ object Label16: TLabel\r
+ Left = 432\r
+ Top = 64\r
+ Width = 38\r
+ Height = 13\r
+ Caption = 'Label16'\r
+ Visible = False\r
+ end\r
+ object GroupBox12: TGroupBox\r
+ Left = 8\r
+ Top = 24\r
+ Width = 257\r
+ Height = 121\r
+ Caption = 'Info'\r
+ TabOrder = 2\r
+ object Label4: TLabel\r
+ Left = 8\r
+ Top = 24\r
+ Width = 32\r
+ Height = 13\r
+ Caption = 'Model:'\r
+ end\r
+ object Label5: TLabel\r
+ Left = 88\r
+ Top = 24\r
+ Width = 3\r
+ Height = 13\r
+ end\r
+ object Label7: TLabel\r
+ Left = 88\r
+ Top = 48\r
+ Width = 3\r
+ Height = 13\r
+ end\r
+ object Label8: TLabel\r
+ Left = 8\r
+ Top = 72\r
+ Width = 44\r
+ Height = 13\r
+ Caption = 'Revision:'\r
+ end\r
+ object Label9: TLabel\r
+ Left = 88\r
+ Top = 72\r
+ Width = 3\r
+ Height = 13\r
+ end\r
+ object Label6: TLabel\r
+ Left = 8\r
+ Top = 48\r
+ Width = 25\r
+ Height = 13\r
+ Caption = 'IMEI:'\r
+ end\r
+ object Label17: TLabel\r
+ Left = 8\r
+ Top = 96\r
+ Width = 68\r
+ Height = 13\r
+ Caption = 'Security code:'\r
+ end\r
+ object Label18: TLabel\r
+ Left = 88\r
+ Top = 96\r
+ Width = 3\r
+ Height = 13\r
+ end\r
+ end\r
+ object Button9: TButton\r
+ Left = 304\r
+ Top = 24\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'Reset'\r
+ Enabled = False\r
+ TabOrder = 0\r
+ OnClick = Button9Click\r
+ end\r
+ object GroupBox14: TGroupBox\r
+ Left = 8\r
+ Top = 216\r
+ Width = 257\r
+ Height = 105\r
+ Caption = 'Simlocks'\r
+ TabOrder = 3\r
+ object ListView8: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 253\r
+ Height = 88\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'num'\r
+ end\r
+ item\r
+ Caption = 'Data'\r
+ Width = 82\r
+ end\r
+ item\r
+ Caption = 'state'\r
+ Width = 65\r
+ end\r
+ item\r
+ Caption = 'counter'\r
+ end>\r
+ ColumnClick = False\r
+ Ctl3D = False\r
+ FlatScrollBars = True\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ end\r
+ object GroupBox11: TGroupBox\r
+ Left = 8\r
+ Top = 152\r
+ Width = 257\r
+ Height = 57\r
+ Caption = 'Alarm'\r
+ TabOrder = 1\r
+ object CheckBox1: TCheckBox\r
+ Left = 16\r
+ Top = 24\r
+ Width = 105\r
+ Height = 17\r
+ Caption = 'Enabled in phone'\r
+ Ctl3D = False\r
+ ParentCtl3D = False\r
+ TabOrder = 0\r
+ end\r
+ object DateTimePicker1: TDateTimePicker\r
+ Left = 128\r
+ Top = 24\r
+ Width = 65\r
+ Height = 25\r
+ CalAlignment = dtaLeft\r
+ Date = 37175.0035574074\r
+ Format = 'HH:mm'\r
+ Time = 37175.0035574074\r
+ DateFormat = dfShort\r
+ DateMode = dmComboBox\r
+ Enabled = False\r
+ Kind = dtkTime\r
+ ParseInput = False\r
+ TabOrder = 1\r
+ end\r
+ end\r
+ end\r
+ end\r
+ object LogosTabSheet: TTabSheet\r
+ Caption = 'logo'\r
+ ImageIndex = 3\r
+ OnShow = LogosTabSheetShow\r
+ object GroupBox4: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'logos'\r
+ TabOrder = 0\r
+ object LogosImage: TImage\r
+ Left = 152\r
+ Top = 48\r
+ Width = 305\r
+ Height = 121\r
+ OnMouseDown = LogosImageMouseDown\r
+ OnMouseMove = LogosImageMouseMove\r
+ end\r
+ object Image1: TImage\r
+ Left = 2\r
+ Top = 15\r
+ Width = 143\r
+ Height = 312\r
+ Align = alLeft\r
+ Transparent = True\r
+ OnMouseDown = Image1MouseDown\r
+ end\r
+ object Image2: TImage\r
+ Left = 152\r
+ Top = 176\r
+ Width = 121\r
+ Height = 105\r
+ Picture.Data = {\r
+ 07544269746D6170D6E10000424DD6E100000000000036040000280000008E00\r
+ 00008A0100000100080000000000A0DD0000320B0000320B0000000100000001\r
+ 000000000000000080000080000000808000800000008000800080800000C0C0\r
+ C000C0DCC000F0CAA60018080000000008000008080008000000080800000800\r
+ 0800080808000808100010080800101010001808000018100800181414002520\r
+ 080021181800212121002D211800292121003129210039292100292929003931\r
+ 2900313131003931310042392900423931004A3929004A393100526B08003942\r
+ 1000524229004A423100524231004E56310039393900424239004A4239005242\r
+ 39004A4A3900524A3900424242004A424200424A42004A4A4A004A524A005A42\r
+ 3900524A4200524A4A005A4A39005A4A4200634A4200525252005A5242005A52\r
+ 4A005A5252006352420063524A00525A52005A5A52005A5A5A00635A4200635A\r
+ 4A006B5A4A006B5A52006B5A5A00735A4A005A632900627331005A734A006B63\r
+ 520073635200736B52006B8C52005A635A0063635A0073635A00736B5A006363\r
+ 63006B6B63007B6352007B635A007B6B5A007B6B63007B73630084735A00846B\r
+ 630084736300ADAD5A00B5842900BD7B08006B736B0073736B006F6F73007B7B\r
+ 7300847B630084736B00847B6B0084847B008C7B63008C736B008C7B6B008C7B\r
+ 73008C84730094847B00848C84009C8C84008C948C0094948C00949494009C94\r
+ 8C007B9C6B0094B584009CBD8C009C9C9400A59C9400A5C694009C9C9C00ADA5\r
+ 9C00A5A5A500A5ADA500ADCEA500ADADAD00B5CEAD00B5D6AD00BDD6AD007363\r
+ B500B5B5B500C6BDB500BDC6B500BDBDBD00C6C6C600CECEC600CECECE00D6CE\r
+ D6008C5AF700C6D6BD00C6D6D600CED6CE00CED6D600CED6DE00D6D6CE00D6D6\r
+ D600D6D6DE00DED6D600DED6DE00CEDEDE00D6DECE00D6DED600D6DEDE00D6DE\r
+ E700DEDEDE00DEDEE700E7DEDE00DEE7DE00DEE7EF00E7E7DE00E7E7E700E7E7\r
+ EF00EFE7E700EFE7EF00D6EF8400E7EFE700E7EFEF00EFEFE700EFEFEF00EFEF\r
+ F700F7EFEF00F7EFF700EFF7EF00EFF7F700F7F7EF00F7F7F700F7F7FF00FFF7\r
+ F700FFF7FF00E7FFAD00F7FFF700F7FFFF00FFFFF700FFFFFF00F0FBFF00A4A0\r
+ A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF\r
+ FF00000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C598C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C598C5077E6432201B1610\r
+ 13131B231F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F\r
+ 232323232C2C2C2C2C32323232332F3233383838383333333833323232323232\r
+ 32322C232332323232232323232332322E291B100D1316182C3DC088C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C507C01600000F0D10131613130D1E3D4444444444444444534444\r
+ 4453444453535353535353535353535353534444445344444444444444444444\r
+ 444444444444444044444444444444444444444440444444444440403D3D3D3D\r
+ 402C0016161613100D00000016728BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5987B130016191B1B1C1C1C1C\r
+ 1C1F132C64676565656565656565656565656565656565656565656565656565\r
+ 656565656567656567676767C0C0C0C0C0C0C0C0C07272727272727272727272\r
+ 7272C0C0727272C07272C0C072C0C072743D15382F2E2929292E231B10000FC0\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C598530E181B1B1C23232E2929231F2E1F38677272727474747474747474\r
+ 747676747676767676767676767B7B7B7B7E7E7E7EBFBF7E7E80808383888888\r
+ 8B8B8B8B8B07070707070707078C8C070707070707070707070707070707078C\r
+ 8C57175B5049494F505550473B1F000066C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C544151B1F1F232E383B47423B42\r
+ 3E3A1F407E838383888888888B8B888B8B8B8B8B8B8B8B8B8B8B8B8B8B8B0707\r
+ 070707078C8D8D8C8C8D8E8E8E97979D9DA0A0A0A0A0A0A2A6A6A6A6A6A6A6A6\r
+ A6A6A6A6A6A5A6A6A6A6A6A6A6A6A6AEA0531D685B5B5C5B5C5B5B565B492313\r
+ 00C098C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C56517232E2F3E48414F4950505550505B1F578C978E979797979797979797\r
+ 978F8E8E8E8E8E8E8E979797979797979797979797979DA0A0A0A0A0A0A0A5A2\r
+ A6A5A6A6A6A6A6A6A6A6ADAEADADADAEAEAEAEAEAEADAEAEAEAEAEAEAEAEAEB5\r
+ A03D37695C5C605B5B5B5B5B5B5B502910007298C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5980719233B383E474F55505050555B5C\r
+ 5C6A243F8EA8A0A0A0A0A0A0A0A0A0A0A09D9D9D9D9797979DA0A09D9DA09D9D\r
+ 9D9D9D9D9D9DA0A0A0A0A2A5A3A0A2A5A5A6A6A6A2A6A6A6A6A6A8ADADAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBD8E23506F695C5D5B5C5C5C5C5D605C50\r
+ 1F0013BFC5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5383B4948474F4F50564F555050555B5C5D461F07AEA6A6A2A2A2A0A0A0A0A0\r
+ A0A0A0A0A09DA09DA0A0A0A0A0A0A09D9DA0A09D9DA0A0A0A0A0A0A0A0A0A2A5\r
+ A2A2A6A6A6A6A6A6A6A6A6ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB0AEB5B5\r
+ 8B1F6D6A69605C5C5B5C5D605D5C5C603E180032C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C598883A6A6E555056565D494F5650565D56\r
+ 5B5B5B1780B5A8A6A5A5A6A2A0A0A0A0A0A0A0A0A0A09D9D9DA0A0A0A0A0A0A0\r
+ A0A0A09D9DA0A0A0A0A0A0A3A0A0A2A5A5A5A6A6A6A6A6A6A6A6A8A8ADAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEB1AEB5B580236E5D605D5C695F5B565B5B5D6969\r
+ 5B23001083C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 675D736A505B565B56565555565B5D565B5D691774ACAEA6A6A6A6A5A3A0A0A0\r
+ A0A0A0A09DA0A0A0A0A0A0A0A0A0A0A0A09D9DA0A0A0A0A0A0A0A0A0A0A0A0A2\r
+ A5A6A5A5A6A6A6A6A6A6ABADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBDAE\r
+ C0236E5D5D5C5F5D5656605F5B5D60695F38160072C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5A05C7C7F69565C695B5C5C5549505B565C\r
+ 5B50601D57A0B2A6A2A5A6A5A2A0A0A0A0A0A0A0A0A0A0A09D9DA0A09D9DA0A0\r
+ A09D9DA0A0A0A0A0A0A0A0A0A0A2A2A0A2A5A5A5A5A6A6A6A6A6ADAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEB0B0B0B0B1BD9D393B605D5C5C5B5C5B5D60605D606069\r
+ 68471B003DC5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 557C835D5B565B505B5650555C5656605D565B411C07B5A6A6A6A0A2A5A3A0A2\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09DA0A0A0A0A0A0A0A0A0A0A0A3\r
+ A5A5A6A6A6A6A6A6A6A8ADADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB0B1B5B58B\r
+ 1B59605C5B5C5C5D5C5B5C5B5D605D605D501C00208CC5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C58B5C887C7056565C5B565D5B505C60695B\r
+ 555B5B5B157EB5A6A5A6A5A5A5A3A0A2A0A0A0A0A0A0A0A09DA0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A5A2A5A6A6A6A6A6A6A6A6A6AEADAEAE\r
+ AEAEAEAEAEAEAEB1B0AEAEAEAEBDB57B1B605C5B5B5B5B5C5B555B60605C5C60\r
+ 5D502300168BC5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C588\r
+ 708377695C695C5D49505B49495D605B5B5B55691767A6AEA5A6A5A3A5A5A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A09D9DA0A09D9DA0A09DA0A0A0A0A0A0A0A0A5A5\r
+ A6A5A5A6A6A6A6A6A6A6A8ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEB0B0B0BDA657\r
+ 246C5660605C5D5C5B5C605D5C5D60605F5B2E0E0080C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5807388735669505B5B5B5B504F565B4F49\r
+ 5B504F4F2A2E8CB4A6A0A5A0A2A5A2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A5A5A2A6A6A5A6A6A6A6A6A8ADAEAEAEAE\r
+ AEAEAEAEAEAEAEAEB0B0AEAEB5BD8C1C4F6960605D5C5D5C5C5D5C5C5D695D5D\r
+ 606038100074C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C577\r
+ 7C897156565B565C5D494F4749555B564F555C5555157BAEA6A6A6A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09D9DA0A0A0A0A0A0A0A0A2A0A0A0A0A2A5\r
+ A5A5A6A5A5A6A6A6A6A6A8ADAEAEAEAEAEAEAEAEAEAEB0AEAEAEAEAEB5B57615\r
+ 5B5D5D5C5B5B555B5B5D565C60605B5B6A693B160064C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5717C89715B5B5B5D505655484F55484F55\r
+ 555555486E1D65A6ADA0A0A2A5A5A3A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ 9DA0A0A0A0A0A0A0A0A0A0A0A0A0A2A5A5A0A0A6A6A6A6A6A6A6A8ADAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEB0BDA04424605C5B565B5C565B565B5D5C5A5C5B5C\r
+ 69603F160044C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C570\r
+ 88886A505B4F5B554F565B565B5B56484850565556311F07B4A0A0A5A3A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A09DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A3A2\r
+ A2A6A5A5A5A6A6A6A6A6A8ADAEAEAEAEAEAEAEB0AEAEAEAEAEAEAEB5B5881550\r
+ 5D5C60565B5B5B5D5C56565C5C5B5C5D696042180036C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5987088886F605D495A605D5B56495C564F4F\r
+ 50554F4F495B1574AEA2A0A0A0A0A0A2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A2A2A0A2A5A5A5A5A6A6A6A6A6ABAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEBDAE67155B5B5B565B5C5C5C5B5B565B5B5B5B5D5D\r
+ 5F60481B0033C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C56F\r
+ 838369506055484F5B5149425055494F5D564F55555D1D449DAEA0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A2A5A5A5A5A6A6A6A6A6A9ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEB4BD8E1F2460\r
+ 5C5C5C5B565B565C695C5B5B5D5C5C605C5D501C0032C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C57189885C555C5B5556564948485B504F50\r
+ 565050504F56501780B5A09DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09DA0A0A0\r
+ 9DA0A09DA0A0A0A0A0A0A0A0A0A0A0A0A2A0A0A0A2A2A6A6A6A6A6A6ADAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEB5B57415555D5B5B5C5B5B5B5C5D5C5D5C5C5C5C5B5D\r
+ 5C60501B002C8CC5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C573\r
+ 897F6A5D5056565B50474955564849505B565B55554F5C1D3897B5A0A0A09DA0\r
+ A09DA09D9D9DA0A09D9DA0A0A0A09D9D9DA0A09DA0A09DA0A0A0A0A0A0A0A0A0\r
+ A0A0A0A3A5A0A3A6A6A6A6ADAEAEAEAEAEADAEAEAEAEAEAEB0B5BD8D1B245D60\r
+ 5C5C5B5C5B565C5C5D5C5B5B5C5B5B5D5D695B1C002007C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C50777077F5F5048555556565056564F505B4F\r
+ 5C5C565C5B4F495B1558AEBDABA6A5A0A0A09DA09D9D9D9D9D9DA0A09D9D9D9D\r
+ 9D9D9DA0A0A0A0A0A0A0A3A2A5A5A6A3A0A2A2A0A0A0A2A5A6A6A6A6A8ADADAE\r
+ AEAEAEB5B5B5B5B5BDBD8E2C154F5D60565D5D5B5B5C56565C5C5C5D5C5C5C5D\r
+ 5D60561F001E8BC5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C58B77\r
+ 897C69554949504F4F5B565651695B555B4F50504F484F504F15328BA6B2B5B5\r
+ B1B1AEA6A6A6A6A0A0A0A0A0A0A0A0A2A6A6A6ADAEAEACADABADADADAEAEAEAE\r
+ AEAEAEAEAEADADA6A6AEAEAEB4B5B5B5B5B5B5B5B5AEA69D07C01517555B5C5B\r
+ 5B5C5B5B5C5D5C5B5C5C5B5C5C5B5C5B5B69562300198BC5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C58877077C695D55554F50505B4F50564F5056\r
+ 56505B5C4949555048481F10132E6474808B8D97A0A6A6A6A6A6ABABADADABA6\r
+ A09D8E0788BF7B7672C0C0C07274747E838B8D97A0A6A6A6ABA9ACA6A6A6A097\r
+ 8C8B8074653D1F1510152F555D605C5C5C5B5C5D5B5B5B5C605D5B5B5C5B5B5C\r
+ 5B605B2F001888C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5887C\r
+ 077C5B504F55555056554950554F495050555055554F505B564F49472E1F1715\r
+ 151515151B23385764C07476747264361B130000000000000D0D000D100D0000\r
+ 00000D101932576667675844381F1B171715171D1F2A3B47505C5B5B5B5B5D5C\r
+ 5B565B605B5B5C5C60605C5C5D5C5C5B5C605B2F0D1683C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5837C89775B425050554955504F504F4F4847\r
+ 555049474F50505049484F4F50504F4F48413B312A241F1D1717171515151515\r
+ 171B1C1C1F23232323292923292929292923231F1F1D1B17171D1F242A2F4150\r
+ 565B5B5D5D60605B565B5B5B565B5B555B56565D5D565C5C5B5C5C5C5B56565B\r
+ 6060502E130083C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5807C\r
+ 8977565055474F4F564F49554F5B4F46495050504F56554F504949494F505650\r
+ 504F474F4F47494F494948484F4942484F48464246414242424848484742474F\r
+ 504F4F5051565B5B51565D5B565B5D605D5B55565C5C5B5B55555D5D5B555055\r
+ 5B5B555B5C5B5B5B5B5B5B5C56565C5C60695B2F130080C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C57F7F89736050554F5150504F554F4749494F\r
+ 48494856555549505048474F4F4F4F4F4848495550494F505049494F48484F48\r
+ 49504947494948494F4F4F484F504F50504F4F505050555B56555550505B5B56\r
+ 5B5555565B565B5C5B555B565B55555B5B5B5B5B565B505B605C5C5C5C5B5C5D\r
+ 60605B2E13007BC5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57783\r
+ 07775B4F5055554F4F5650494F484955504F504F55494950484949494F4F4848\r
+ 474748484F4F50504F484850504F5549474F4F4848494F4948494F4F50554F49\r
+ 494F504F4F5050565651515050565B5655565B5B55565B5B5A565C555B5B5B5C\r
+ 5B5B5B565B5555565B5B5B565C5B565C5C5D5B38160074C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5778889735C504F49484F4F5C565055554F4F\r
+ 50484F42485050484850554850504F48424742505049494A4F48494F4F504F4F\r
+ 4850504F49494F50504F49495050505050504A4F4F50505056565B5650555656\r
+ 5656505655555B5B565B5B555B5C5C5B55555B55565B5B505B5B5B555C5D5B5C\r
+ 5B5D603B160072C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57189\r
+ 07715B4949505555485B5B4F49554F484F494948474F4F484F4F504F4F494850\r
+ 5049475056494849494950504948484F4F504F474949484F4F4F4F49494F4950\r
+ 50484F505055565050565556565050565B5B50565B565B55555B5B5656565C5B\r
+ 55555B5B56515B5B5C5B56565C5C5B5D5C5D5B38180064C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5708907735C565D5D5555505556474F504748\r
+ 4F4749554F47504F4949505049484242474F56504F4F49474850554947424850\r
+ 504948424749474247484747484748505048494F4F50555651505656515B554F\r
+ 5656555556565550565B5B565B5B5C5C5B5B56565B5C5B565B5B5B5D5B56605B\r
+ 5D5C5C3E190064C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C56A89\r
+ 8871695650504F5050494949564F4F4847474F5049484948505549474F504946\r
+ 475050494949484950564F49494848494F4F4F423E4142495651485050474147\r
+ 47494F49505550565550555555565650555B5650565B555050555550565B5B5C\r
+ 5C5B5B565D5D565B5C505B605B556056505C5D47190044C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C570897F6F6051505C564F4F5049505A494848\r
+ 484F484247484848494942414948424749494241474647505048424748474147\r
+ 4F4947485A5D68605D5D5C5B6A706E5D514241474F5650485056504F50565550\r
+ 555B50505B56555B5B555055565B55565B5656505B5C515B5C55565D565B5656\r
+ 5B5C5B481B0053C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C56F88\r
+ 88715B555C5B5655424F4947504F4141494747504849504847494F4247474747\r
+ 42484F494949494F48494F4746484747505B5E5B422E1F1B16161613161B2347\r
+ 70737150414F504F505B565555565B5555505056505055565B5B5B56565A5655\r
+ 5B5B56555556565B565B5C5B5D5B565B5C5C5D481B003DC5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C57189886A554955504F554950484149504747\r
+ 4948484F4748504842473E4148474A49484F504847494947495B55484842475B\r
+ 6E501F160E000000000B101313100000101B557C7046414F555155565B55555B\r
+ 5B5155565050565556555556505055565B565555565B5B5B5B565C5B56565B56\r
+ 565C5D501B0032C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57189\r
+ 8369504F4F4F47484F50554F48413E48473E3E41464148473B373B4748474241\r
+ 484841474847474F4F50554947506C56200F0000000F101016181E2C33363633\r
+ 20160013407C7141475550555B5B5B5B565B5650565655565B564F565B5B5B5C\r
+ 5B5C56555B5B50515B565C5D5B5C5B565B5D69501B0035C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C57089835D4849484F49485542424749493E41\r
+ 555B6D716F6A6F6F777C5A3B41473E4147424850484849484848424860602310\r
+ 000010101013161618192020323644535757441E001970775048565550565B56\r
+ 555055565655555B555168706C6E6F6E6E736E6C5D565B565B5B5B5C5056565B\r
+ 5D5D5D551B002C07C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57007\r
+ 88504F494F504F424248424141506E71715C381C1818181619588373413E4949\r
+ 47484F4F4F49494848474960501800000F1010100F0010161819191E2C333644\r
+ 53575865531800387C6E4F50505656565655505556555B505D6E551B00000F00\r
+ 101B385B70716A5D5C5C5C605C565B565B605C501B0032C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5077389835B554842424947464742486E6F3F18\r
+ 0C000000000000000B0016C07148424F4948494F4949504F484F603B10000B10\r
+ 101010001E582000161819202C32363D44535358656532002C776D47555B5650\r
+ 5B5B565B5C56556E6E2300001020202020180B00001F5C73705D565B5D605C60\r
+ 5C5C5D4F1B00208BC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57707\r
+ 7F55554948484248414F6E70291000000B0B0F1010101010161E1300577C503B\r
+ 4842424F504F4F47476E4916000C1010101000208EBD97330016131618192033\r
+ 445353575865C03D002C735D505B5C5C5C5D5C5C56506C5C16000F2057656565\r
+ 676765572C1000185C736F5B5C5D5B5D5D6060501C00208BC5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C58873077F5C49484947424250683810000B1010\r
+ 101010101313131310163220004073504747474F5B5050505C601C0000101010\r
+ 13100066A0BFA680101333443D3D534436445353586467C02C0D427155555C60\r
+ 5C5C5C565B6E5613000F2C5758646464656567C0C0C04410001B71735B5B5B5D\r
+ 605C5D5B1F002007C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5077789\r
+ 7C51423E483B3F5D4816000C101010101010101313131316161313332C004073\r
+ 56474955565656506A482C3216000F101610107E97648E881058BDA08E8E9DAE\r
+ 7B324457586465C044001C6A5B5B5B5D5D5B5B5C6E5B1600102C443D36535867\r
+ 676565676767C0C0440F004077685D5D5C5D605B23001883C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C58B7389775D4241474260381000101313161613\r
+ 101316161810101616161616392C00447048475050505050713B38C020001316\r
+ 130C007B9D648C88163566130F10197672364458586467724400195A5C5C5C5D\r
+ 5D5B5B6E5C19000F1E363665807E76646767676767676767C0671E002C7C6E56\r
+ 5D5D695B23002007C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5837307\r
+ 7C565A47415E231010161616161916101016161610442C131618181616441E10\r
+ 556E4F56554F5B4F5C4F1F676410101616100064A683A38316001016191E1E1E\r
+ 323644575864677232001B565C565B605D5B5B5B1F00001832393274A0A08C58\r
+ 656767676767676767C0C033001873715B5B5D5B29001988C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5887C8D7C493E425D1F0016181816161E005776\r
+ 1E10161300077B1813161619131E57161F5D5050565B564F506E1C2C83721800\r
+ 1016001E07BDA036001618181B1B202C3233353D536474641010385C5D5D5C60\r
+ 5D5C6F420000162033333688BDB5AE8853C067C0767674676767C0C036001377\r
+ 6E5B695D2300167EC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5BF7C07\r
+ 735547501F001618191B1E19107EA6B5AB4400208BB5BD8319101818160F3D20\r
+ 164A60554F565C5B50605B132007AB8BC03D2C101853200016181819191E202C\r
+ 3236445867725818001B506A695D5D605B6069230B16162C323636678EA69783\r
+ 57C067808E8B8C7B58C067C0723D0016776A5D5B29001883C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5BF7C07714F464210181E19202020200074B5BD\r
+ A0321616168B7419181B191816003D2013385650565B5C5B504F604716001653\r
+ 7272C0663D1B1E2C20202020202C333D443D363320130000163B5B5C5C5B5B5D\r
+ 605C5B233D66131932363672ABB5AE9764657B8EBF34BF8E7267C0C072743D00\r
+ 2373605D2E00167EC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C57C7F07\r
+ 71485B1B2C64191920202C2C1E7E9DA6A0571E1E16443219191E201B16205316\r
+ 16415B5C5D5C5C5656554F514F1F10000000001013161616161616161616130F\r
+ 000000000000131C3B495B5C5B5C5B5C605D68291EBF67132C44443683A08C07\r
+ 53C0C0808C078C88C067C0C0C074C010005060602E100C72C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5777F8D703E4F1720883D363644444444135374\r
+ 1E192C2C2C161E2C2C2C2C2C324419001B4255564F5055504F50504748494842\r
+ 381F1B1610101000000B0000000B000E10161B1C233E4850505656565B5B5D5D\r
+ 565B6A56101876441E36575767767B7B67C0C065C0BF7258C0727272747B6510\r
+ 002F606A2E1000BFC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5777F07\r
+ 734F423B0032768E978E8C8B83837BC07472C0666664645857443320160F0016\r
+ 293E47504F4F565B555B5D5B5B5D5D5C5D605F5A505050474142423E41474748\r
+ 50515B5B5D5B5B6A605B5D605B565C5D5D55506850130013191B325358586567\r
+ 74727274726772747474747272581600164860602F0F007BC5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5707F0770483842230E0020587B888C9DA6A6A3\r
+ A09D978E8B7EC0442010000000101C38505B5C696F7071706F6F6F70706E6F6F\r
+ 6A695D5B554F505048464249505048505B5B5B606A6A6E6F6E6C6F6F6E6E6060\r
+ 60605D5C685D29100000000B1932446465676767C0C067655844321E10000013\r
+ 385B685D38130067C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5708389\r
+ 6F42423E3B2E1B0E000000000000001316181813000000000010181C2F496871\r
+ 71716E69695C4A3F3B381F1B1B16161610100F0B10100B0B000000000B0B0B0F\r
+ 100F101616181B1C1F2E3B475555555C606F6F685D6C6E6E4F23161000000000\r
+ 00000B1010000000000000001018234F5D5C605D38100074C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C57088896A47473838292E382F23231C18161310\r
+ 000D0D0D13161C232E42565B4F504F3E291C1810100000000000000010101013\r
+ 161618181618191B1B1C1C1C1B19191919191916161310100B0B000010131316\r
+ 1C1F293B485556686F6E6E5B47381F1B1919151516161B1F233847505B60605E\r
+ 5B5C5D5F3B1000C0C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C56F8889\r
+ 5D4848413E2F23231F1F2329232E2E382E2E2F292E2E3B38291F1C1B16100F00\r
+ 0000101316191B1F23232E38383B3B41413B3B47484F4F494F4F4F5056505B5B\r
+ 504F474850504F4F48423E382E231F1B181610161616181B232E3E47565C5D5B\r
+ 565C5B565B5B60605B565B504F47424F5B5C5C5D3B160058C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5A06A89896A41474847423B2F2E231F1C1B191616\r
+ 1616161616101613100F1010181B1C1F232E312F3B3E4247414147423E3E3B3B\r
+ 3E474F484138231B191818191B1F38424F5B5B5046474F5555505056515B5D56\r
+ 5155504F412F231C1B16161918191C1C1F1F231F2323232323232F3B474F515D\r
+ 605B5B693F160066C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5986A8989\r
+ 6E42494946413F3E413B2F2E382E231F1F1C1C1F1F1C1C1F232E382F3B3E413B\r
+ 383E3E3E3E3E3E3E3E4748473E38415056472319100000000000101013131010\r
+ 161F425D69554647484F4F504F50505050555B5B5B60605B5D5B4F47423E382E\r
+ 2F3838383E414249555B565D5D605D5C5B5B60683B160058C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C56F8988694249494F483E4742413E473B3E4242\r
+ 3E2F2A3E47474747483B3138383B3E3B3B3E3E41423E383B3B3E47413E495B47\r
+ 1F100000000B1010161E2C32363D3D3320160B194A7160474850504F50565055\r
+ 5B505050515655555C5B5B606E6E6E6E6E6E696068685C6060605D5C5B5C5B5B\r
+ 5C5B5D603E160044C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5986F8988\r
+ 563E474F50474948483E3E423B2F3B41495655555D6F6A6F7170482F2F3B3E3E\r
+ 3E3B42423B413E3B383B3E41565B2910000010100B000F161619202C33364457\r
+ 6464441E101E5D7155424F504F5550565B56505150505055565C6E706A5D6969\r
+ 606E70706D5D565B605B5C5B5B5C5B5B5C5C5C5C41180057C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5987007885B3E494847474147423E3B2F3E485B55\r
+ 504738201B1E1E20204473603B3B3B3E3E3B3E423E424741413B486047160000\r
+ 0B1010000F0F001016161E202032363D44576467441610397150415050504F56\r
+ 565B5650555555566070501F131013131319234260706E605C5B5C5D5B5B5C5D\r
+ 5D60605D3B180053C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C598710783\r
+ 5646414841473E473E4242495B563819160C0000000000000000196970473B42\r
+ 42414747424747473E496E3F13000B10100B002007B57B160F19161E322C2C32\r
+ 3653535765652C002C7768475656505556555656504F5B6E6023000013202020\r
+ 2018130F101B426E71695B605D5C5D5D5B5D60693B160033C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C571897F494141474147474241505B471C160000\r
+ 00000B1010101010101613105771483B4247484847424242475D3E1000101010\r
+ 10001888A088AD66207657BF97663D8BC03257535765C0360B38735B505B565B\r
+ 5B55555650516E5516000F2C575865656565585332180013387073605C5B5B5B\r
+ 5B5D696042190036C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C598708C7F\r
+ 4F4949463E413B3E5B491F1000000B100B1010100B0F10100F10201E0B40714F\r
+ 3E424847424747384F5B1B0000101010130016809D88A6572088748388747EAE\r
+ 88343D5857586772320F4068505B50565B5655565B6F50100010324453585864\r
+ 646567C0C067531900135C776D5B5D5B5C5C5D6049190036C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C58C738C7F4F474942383848603B16000B00001000\r
+ 000010100B000010100B102C2C0B40734F424850504F4F425D3B3235160B1313\r
+ 16100036AEBD071844A0888074888D8B8DC034575864657244001C5D5555555B\r
+ 565B5B5B6F56130000103644535864656465656565C072C0531600296E6E5B5D\r
+ 5B565D6D4F18002C07C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C58C73077F\r
+ 473B3B473B485B1F1000001020100020C01800003653160000000010322C0B55\r
+ 734F4750504F504F6E2433722000161616100E769D83975357BD7B3653747453\r
+ 74C036536464657244001B5A50565B55515B5B6E5D190013677B2C3353444453\r
+ 585358656565576472C03200167373505C5C5C60501B002C8CC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C573897F503B423E495B1B000F10000097071619\r
+ 8E8E18328C077216588B530F103D1E166A715048484F55495D4119C067100013\r
+ 19160058B5BDA23619722C00161E2C2C323D5353586467722C001F5B50555656\r
+ 565B606A230000137EB5801964C0727272747483806583BFC0C0724400167073\r
+ 5D5C5D5B47190032C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C58B77077C\r
+ 49413B41511800101010100080BD202088808BBF83078818329D72160F1E5316\r
+ 1F695D4F4F554F47556E1C1E7E7E32130D131010537B3610101016191919202C\r
+ 32333D4457C07B5700103B5655565C5C565D6F3E00001613198DB25764A0A08B\r
+ 74A0807E9D7497886467C07258000D5C716069604819002C07C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C50777077C48473B5E1B0010131016160019AE582C\r
+ 07078D88078BA674078E331016103D2016425B50565549505060551516728B83\r
+ 7464362018131016191616192020323644576467C0C04413001B505F5D5B5B5D\r
+ 565D6D2E1819002C8CBDB58BC0ABB5077EA0887EAEBF7E0758C0C0C07458000E\r
+ 506E5D604F1B00208BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C58B7C8D71\r
+ 3E3B473B101613161618191600839D20729735678B677B7480BF2C13130F3320\r
+ 102E5555554F555B50485B421600101E323D5865573633322C2C202C32333644\r
+ 443D321E160B00001638505B5B5D5B565B685B1F66C000C0B5BF7BAE76880788\r
+ 078C8C8B8B078DA5746772C072723D00195B5C6D561900208CC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5837F0773483E51153558100D16191620C08EBDC0\r
+ 100013101013101310131816163344161638555656554F4F4F47424F47241910\r
+ 00000000001013131310101010100F00000000000010161C3B5055565D605B56\r
+ 515B6A2919806644B5A397A6443D6465C065C0C067727474727272727274C010\r
+ 00426060551B002007C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5887F0773\r
+ 46414F1F138344322C1E101888979DC01913161916191919202C2C2C33331600\r
+ 1F4247505555565556504F554F47413E38291F1B181310000000000000001013\r
+ 191C1F23314850505B5B565B56565B5C56515D5B161064587EB5A06536646565\r
+ 676767C0C0C0C0C072727274767B530F003B5C685B1B001983C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5807F077146423841100B57838EA3A08D80726565\r
+ 655864646458656553341E161000001931565650504F5555555B56505660605C\r
+ 6A706E68605B5B5A5049484848505A5B68685F5D6A6F605D605C5B5C5C5C5B56\r
+ 5B5655605516000010181B2C5867C07272747474747676767676767465320000\r
+ 1B505C5D5B1C001E8BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C57C7F896F\r
+ 473E383E2310000000194472BF8807078C8C8B887E6735180F0000000F191F38\r
+ 4950555C696A68717371717070716F695D5C55493E3B42473B2F3B3E3E414750\r
+ 5B5C5D5D5D606E6E6E6E70706E6A6A5D606A5C505D5E411B0000000B16192C3D\r
+ 576465656458574433201600000000133E56696A5B1C00198BC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C57C7F076F3B3B413F38291F191300000000000000\r
+ 0000000000000000001019233B485D707171706E5C55493E2E231C1813100000\r
+ 000000000000000000000000000000000000000000101316191C233842505C60\r
+ 6C6E6E6E6F6A686D5B3E1B0E0000000000000000000000000000001016233850\r
+ 5B5C606A5B1C0016BFC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5777F076E\r
+ 413E382E23232E2F2E383829291C1C1C1B1B1B1B1C1F2E3E46505D6E705C472E\r
+ 1C1913000000000000000010131616191B1C1C1B1B1B1C1F1C1F2323231F1C1C\r
+ 1C1C1C1C1B181616100B00000000001016181C2E474F5B6E6E6E6C604F3E2E1F\r
+ 1C1C1C1B1C1C23293B48565E5F5C5B50515B5B5D5D1F0016BFC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C57188076A3B4842413823231F1C1C1F1F1C292E38\r
+ 3831383E3E41382E231C1B160F000000001016181B1C1F2329232E38382F3B3E\r
+ 38383B3B424F504849505A5A5B5E5E50484F5050505050504F4F48423E382F29\r
+ 1F1B1613101010161B1F3842505660605E68605E5D5B565B4F423E383B3B4749\r
+ 555B565D5B1C001883C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C57088896E\r
+ 3B3B423B41383B2F2329231C191B18161010101000000B0B0F101616181B2329\r
+ 2E2F2F38383138382F383B3E3B3838383B424950412E1B130B0B0000101E233B\r
+ 4F565047474849484850504F5051515B5D5B565150483B231C19161613101316\r
+ 16161618181B1B1C1F2E3E42555B56565B565B60551F00137BC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C56F88896A494850413E3F383B3B3B3B382F383B2F\r
+ 2E292338292323232E3E3B3838383B3838383838383B3E3E3B42473E38312F48\r
+ 5B421B10000000000B10161616100B000F1B405C5B484241484948484F4F4949\r
+ 484F50554F505B5B5D5B5151554F48484241474950565B5B5D5D5C565B5B565B\r
+ 5B5B565B5B1F001074C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C57089896A\r
+ 3A3E483E38423E3B3E3E383E3838382F2E383E3B3E383B3E3E3B383B3E3E383B\r
+ 383841413B42424147473F3B3B425047190000000B101013161B2C3336445744\r
+ 32160013396A5B474747484F504F4F504F49484F4F4F4F4F4F4F565B5D5D6060\r
+ 60605D5D5C5D5B565B5B55555655555B5B5B5C5D5529000080C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C56F89885B3B4247413B38423B3B3B2F383B383B41\r
+ 424950505C555B5C6A5D473B383B3B3F3E383E4241424241413B3841504F2000\r
+ 000B1000000010131618202C32333D44586457200B195B6A5047485056504F49\r
+ 494F5050494F494F555B695D5B5550505B5D5C69695D565C5B5656555B5B5056\r
+ 55565B5D50230F007BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C56F078960\r
+ 3F3B48423B3B3B3E3E3E3B2F3E484F5B422F2C1810100B00165773693E383B3B\r
+ 3B3B3E414241423F3B3B48603B13000B100000327EC0161033321618202C3239\r
+ 444457655819002C6F5B4248504F49494F51555050504F506970421600000B10\r
+ 16181C3F555D68695C51565C5B555B5B565B555B5B230000C0C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C56F07895B313B3F3B3B383B38383B3B4F503F1C13\r
+ 00000000000000000000195D6A423B3B3E414242413E424241475B2300000F10\r
+ 10001E88BDBD7420807B322C646458443D444453646736001C6A5D4850555049\r
+ 50564F494F48566C501B000019333635321E160B0016385D6A605B5B5B565B5B\r
+ 5B55565B5B230E0072C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C56F078356\r
+ 3B473E383B3B3B2F424F493B180000000B10101010101010131E130053735D42\r
+ 4247474749554F41475B23000010101010001618007BA066747E8B97837B8B64\r
+ 2C5353575758C0530C1F6E514F55565B56505050505B6E491000163964646567\r
+ 67C0C065441900102E5D6E605B555B5B5B55505B5B23100074C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5700783483B4641422F382F42553E1800000C0010\r
+ 100000101010131610102C20104073503E4749483E4850425647180B10101010\r
+ 16101020C0AE883D76748CB5C044076420535357585865723400295D505B5050\r
+ 5C565050566E4800000E203D5357585858646567C07264200010386E6F5B515B\r
+ 5B5D5C5B5B2E100066C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C571898350\r
+ 3B3E3B3B382F48481C100010131000101016160D000F00000F10102C2C103870\r
+ 5548593F1B1B38425D2F2C33160F131316100F74BD071919C072070774768B57\r
+ 20445357585864C0530C1B5B5C56231B475B5050684700001366743D36535758\r
+ 58575758585864726519001B5D715B50505655565B2E0F0057C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C50773897F512F3B38382F484816000C1310000E7B20\r
+ 10C08B44332020331E13101032320C406A473B7071201C426E23206720001316\r
+ 16160058BD0732194466BF3616C08844204444575864657236001B50565C5C2C\r
+ 1B495F604710001680AEA68B575767646567676765C07465C0724400105D7150\r
+ 565B505B5B29100064C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58C71078350\r
+ 3B3B3831483E1300101310161867BD672083BD8B8C58C08E7216101310362C16\r
+ 425B4271713B3B4F60471866C016000F1618002007BD831E192C2018101B3332\r
+ 32363D445364C0C01E001F4F506071402356605518000033B58E76B5BF728876\r
+ BF07887E8888077657C074641000446D5C5B565B5D2F100058C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C571077F483E3E2F473E100B101316004497A0BD74\r
+ 74BF88888E7680AB7B180F16101953181C564F474755564F49601C187480642C\r
+ 19181610001618130D0E00161E16131E3233365364C0743600133E5C5B564F48\r
+ 565B602E00000032ABA58BA674BF978B07978C88970788075367677265130038\r
+ 5D5B505B5C2F100035C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58B73077C46\r
+ 2F3B3E48100B161616190036A6BFB544748C97888DAE8B8B67161016160D3D32\r
+ 18384741565C494842564F1618C07E74726553331B101018181818191E202C33\r
+ 3D57575864572C000E1C4F5655565D5D5555561F2C20001680BDA0654488A38E\r
+ 8E078E9788078E7E57C0676772641300385D5B565138100036C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C50771077C4838384F1B1E191316191E1E007407BD58\r
+ 1672835707072072C01910160F16531E132F4948495055554F47504216001019\r
+ 2C323533322C20201E191E1E1E20202020201E16100000101C3B4F4F50565550\r
+ 4F565A1C53720D0032A0AE532CC074747472747E6774BF6567C0C067C072570F\r
+ 1350515B5B3810004498C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58B73077C3E\r
+ 3B385A0D537E1600001319131097BD7618161616531B00323218161620533610\r
+ 1831474948555C504F4842483E1F19130000000000000B0B0B0B00000B000000\r
+ 0000000010161C2E42505050555550504F50602E10C07E201066A68834445357\r
+ 5864646467656467C0C0C0C0C074C010002F505D512F100032C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5837C07773B3B2F471B137276BF7667534416538B3D\r
+ 1613161613182019202C2C2C321E100D1F3E474848494F494F49424242474841\r
+ 38291F1C1B191916161616161616191B1C1F232E3B4248484748495551555650\r
+ 4F505B561B0C35362C2C4464586567676767C0C0C0C0C0727274767B7B743500\r
+ 0B38505B5B381300208CC5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58B7707773B\r
+ 2F382E3B1000326474838B070788838883808076726657352C1E18100000101C\r
+ 3B4748485050494F555B5B5B5D606060605E5E5E5B5B5050504F484F4F505B5B\r
+ 5D686E6E6E6F6E696A605C5D5C56504F50554F56551F00000B13161E39576772\r
+ 7474767676767B7674726653321800001B47565B5B31130032C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5807C8C7C313B382F38231000000B16192035535766\r
+ 676666573320181000000000131B2E424F505D6F6A6E6E6060605B5048414242\r
+ 3E382E2E29231F1F23231F23232323292E38383E414749505B5C606E6E6E6C6C\r
+ 6A5D56555B56421F16000000001018202C3233343332201E1610000000000F1C\r
+ 414F5B565B3E160032C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C57F7C07772F\r
+ 3B42382E382F231F1B130E00000000000000000000000010161B233E4F5B6060\r
+ 5B4F473F2E291F191613100C00000B00000000000000000000000000000B0B00\r
+ 0000000000000B0F0F1016191C232E3B47505E68686E6E685B47291B13000000\r
+ 0000000000000000000F161F2E3B47504F5056495B4216001E07C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5837F07732F3841382E1F23232329292F2929231F1F\r
+ 2329232E2E38383E3E484F483E2E1F1913100B000B0B0B0F10131316191B1B1C\r
+ 1C1F1F1C1C23232E382F2E2F2F241F1F232E291F1F1F1C1B1B19161310100F00\r
+ 000F13181B233E505D685E5E605B4F4242423B3B3E3E48505050565649414148\r
+ 484F50515C4116001E07C5C5C5C5C5C50000C5C5C5C5C5C5C5C5987C7F07713E\r
+ 4149382F2329231C1C1B1B161B1B1B1B1C1F1C1C1F1B1B19161613100B101010\r
+ 1316191C232323292F2E383B382F383B382E2F414F50473E3E3E382F495C5B51\r
+ 4F413B3B4748474847474747423E3B2F2F291C1B1613100F1013191F2E2E383B\r
+ 3F47413E3B382F2E2E291F232E3B474F565051565B3B130020C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5737F8C71313B383E472F2E382E2323231F1C1C1918\r
+ 161613101313131316181B1B1F292E2E382F2E2F38383B2F2F3838383B3B382F\r
+ 3B50503E1F1610100B0000000F10161F47565B48463E474747494F4847484949\r
+ 504F4F4F484241382E231F19181616161816161B1B1C2329383E414850504F50\r
+ 4F505556504118001E07C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5777F076F3E\r
+ 423B2F38382F3E3B2E312E38382E382E232E2E2323231F232F2E2E2E292F3B38\r
+ 2E2F382F383B383E3B382F2F382F425B4F1F1300000B0B0B1013161919191813\r
+ 0B0B1B5569473B414741424848494848494847484850555050504F484F504F48\r
+ 474851565550505050565055555050504F4F5050564216001883C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C57188897031383B3B382E2F383B3B382F29232F312E\r
+ 29232E3B474949492F2423232E2F38382E383B3B3B383B3B3E3B382F3E50471B\r
+ 0000000000000010181E202C333644445336190B1E5D5B3E4147484848484748\r
+ 494848484848494F4947485B686E6E685B5651554F4F55554F4F504F50504F4F\r
+ 4F4F56565B411300198BC5C5C5C5C5C50000C5C5C5C5C5C5C5C5C570838C713B\r
+ 41383B2F382F3B3E3E38312329293B3E495B5B4940404044717147292F383B38\r
+ 38383838383B3B41473E3842562310000B001320333635191010161E1E2C3644\r
+ 364458531910396A463E49494947484847474748484848424960705B42383B3B\r
+ 49606068605655554F4F504F4F504F4F504F48485B3E16001907C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5708807603E423E383B3838382E2E2E2E2E38424738\r
+ 1F1610000000000000206F6A3B2E2E383E3B383E383B3E41413B4F551C00000B\r
+ 10001074BDBDAB531366643D66C0333472C0535365360B20705A3A424949484F\r
+ 4F4F504F4847474F6E5D1C0000000B000000101B385D605B554955554F4F5050\r
+ 504F504F504116001683C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56983896942\r
+ 38424138292F382E2F2F3848381B0E00000B0B0F1010100F130F005769382E2F\r
+ 383E4147423E3B3E38505619000B10101010002CA08E1919838E978E978DBF83\r
+ 9783573D576557161E6F5B3E4847484F50504F4F4947506E3F00001636575757\r
+ 584433190B001949605B55554F4F494F4F504F50503E160013BFC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56F8989552F3E3E382F382E29233147381600000B10\r
+ 101010100F10100B101B20003260472F3B38383B4142412F46561B000B101010\r
+ 1016100044BDC02C80587E9474578B97571B3D585757656416165648474F4F4F\r
+ 4F4948494750682E000019445753575858646567654418001047685C56504F4F\r
+ 505050504F3B1900188BC5C5C5C5C5C50000C5C5C5C5C5C5C5C5986E88895031\r
+ 2F3838383B38294148190B000000001000000000000000000F0B1B33132C553B\r
+ 2F383E47423E413E5B381816100C1010130F191E0D76A54466AE9788A0A0747B\r
+ A607583D585758C036001F56484F555148494F4750602300001936333D535357\r
+ 575757585865675718001B6060504F5556555055564116001683C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56A89885F38292E38292929472F130010003D7E2000\r
+ 13363533353D351300100B1E3D161C56473B3E3E3B4148475B1F325716001013\r
+ 160033A68C83A657001619748835102065C05353585864C03D0B194F494F4F50\r
+ 494848506029001058A6AE80363657585757585758586465C03D000B4A68554F\r
+ 56514F4756421B00107BC5C5C5C5C5C50000C5C5C5C5C5C5C5C5986F89835631\r
+ 3E382F2E38502310001010007EBD2C137B8BA6BF8D8C8C7E1900100F2C3D132C\r
+ 554741413E474F3B561F20C032000F1016100065BDBD88190F16162C2C182032\r
+ 2C3244575858656720001B474F4F48495049505D3800001897AB8BB2BF578E8C\r
+ 83BF07747E8044646467641600396A5048494F4950411800107EC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56F8988483B3838292F501E0010100F100074B519C0\r
+ 660066207220007B53001010103632162E473B3E4241473E4F41135774190010\r
+ 131613002033101016181816161E202C333644535764C0571010234848474F49\r
+ 49495D49100016201E187EA680BF8B7BA68D8B7E8B8B36656464C0671E002C60\r
+ 50494F50504219001683C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56F8988483E\r
+ 382E29481B0010101013130074B520207EC08B20667B80BF2000101310164019\r
+ 162F41413E424942415E1F00588B743D2C1919180F00101616131316191E1E20\r
+ 2C333D5364676419001641514F4849494F50561F0013161E1357B5A0447E8E8B\r
+ 97079D8E8E97576465656567C02C002C5F4F5050554219000F76C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5986E897F48382F293B230E1010131616160076BD3500\r
+ 327B350B005372190010101310103D201329423E4148423E414F551B001E66C0\r
+ 7274643D3632201E191818191E202C32333D443632190F00102F47474F50504F\r
+ 484F481C5353001672747BAE7B2C83A08B6780728DA064646767656567C03200\r
+ 1C48505055471B000072C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56E897C462E\r
+ 382F480E3632100010160033A6BD3500000000100B0000001010100B00204416\r
+ 152F3B3E47474747423847481B0000000B1319202C2020201B19191819191818\r
+ 181000000000001629484948484F4F49484F501B35762C10BFBDB59D672C34C0\r
+ 7E3D4457748867666767676767C0C010003B4F5055491B000080C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C560887F412E2E234200587B321E191900448C801800\r
+ 00000B00000B0B1010101316205320001B3B474242474849423E3B4142381F1B\r
+ 1300000000000000000000000000000000001016191F2E3E474848554F474849\r
+ 484F5B2E003D7E3218C083583464585353676567585767C067C0C07274746510\r
+ 00234850483E180000BFC5C5C5C5C5C50000C5C5C5C5C5C5C5C5985F897C3E2F\r
+ 2E29381B005772747472C053201920201E1918181818161618181E2C20130016\r
+ 2338414141424742474F48424749484F48473E382E231F1C1C1C1C1C1B1C232E\r
+ 2F383E4948494F484847484847474747484850551C0010322000002044586567\r
+ 67C0C0C07272727272747272C0571600102F495050421B0F0072C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56A897C41382F2F23381300163264C0747E8083807B\r
+ 76746764533320191816100000001623414742494F4F565D5C696A606E6E6060\r
+ 605C5B5B5B51565B5950504F505B5B5B5B5B5D6060605C505B5C555050504F48\r
+ 474742485029100000101016192C3653646566656565645844362C1913000000\r
+ 1F48504F50411C0F0072C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56E077C4F38\r
+ 382F232E2E1B00000000000010182C333535322016100000000000161C38485B\r
+ 695D5D5D5C5B5C5D55473F3B3B3829231C1C1B1B1B1B1B19191B19181B1C1B1C\r
+ 1C1C1F232E2E2E3B4247474F5B5B5B5B5B5B51565C5B50381B16000000000000\r
+ 10131616131000000000000000131B2342494F504F411B0F007BC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C569897C412E292E2E23232E29231C1C1916100D0000\r
+ 0000000D1010161B1F29384850565555482F231F1C1B16161000000000000000\r
+ 000000000B0F0F10100B0B100F0F0B0B0B0000000000000B0F0F1016181B1C23\r
+ 2E3842505B565C605E503E231C1B160E0000000000101316191C232E3F484748\r
+ 4847484F50471C100072C5C5C5C5C5C50000C5C5C5C5C5C5C5C58C7089773E38\r
+ 382E2E231F1F1F1F1F292E23232E2E292E292E2F2F38383B3B38382E1F191610\r
+ 1000000B0B0F101316181B1B1C1C1F232323232E2E2E2F382F2E2F2F2F383838\r
+ 2E2E2E292323231C1C1B1916161010100F101616181B1C293E485051565B5047\r
+ 4747474242484747474742423E3E38384747484849471B0F0066C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5077089773E38382F382F29231C1C1C1C1C1B191B1C1C\r
+ 1B1B1918191B19181616100F0F101316191C1F1F23292F2F2E2F383B382F2F3B\r
+ 382F313E3E3B38383E3E3B3E3E3B3E3E3E3E42423E3E4242414147413E413E38\r
+ 2E291F1C1B181616161618191B1C1F232323232323231F23231F23292E38423E\r
+ 4248484848471B0B0066C5C5C5C5C5C50000C5C5C5C5C5C5C5C58C7189773B2E\r
+ 382E2F382E232E292E231F1F1C1B1B1816161618161616161919161B1C23231F\r
+ 292E2E383B2E2F3838382F2E2E2E2F2F2F382F383B382F38383B3B383B3B3838\r
+ 3B3E413E3B3B3B41413E424742424848474742474847413B2923231F1C1B1B1C\r
+ 1B1B1C1C1F1F232E383E4242494F48474849474249471B100067C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5077107732F2E2F2E29382E2E2E292F38232E2E232329\r
+ 1F1F23231C1C1F232E383B38383B3B38383B2F2323292E2F2F38382F2E38382F\r
+ 383E3B382F2F383E3E3B3B383B3E3E3F3E3B3E3E3E3E3F3E3E3E413E41413E3B\r
+ 41484F505B5B5B5D5D5D5D5B5656504742474847484F4F484949484749484747\r
+ 4847474850421C100064C5C5C5C5C5C50000C5C5C5C5C5C5C5C58B7107732A2E\r
+ 2F382E292E38382E38382E2E2F2F23231F23293B474947493F3F493F3B3F4449\r
+ 4A4A697047292E2E2E382E2F2F292F3B3E3838383838383B3B3B3E3B3B3B3E3E\r
+ 3E3E3E3E413E3E3E3B3B3E3E3E3B425B5D5149473E3B3F3E3E3F424F5B60605D\r
+ 5D514F4F4848494746414247474748494747474750471C100057C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5887389732F2338382F2E2E2E382F2923232E2323232F\r
+ 3E3B312E231E19181613131310131313131016326F5629292E2E2F38383B3B38\r
+ 383B3B383838382F313B3B3B3F3B3B3E3E3B3E3E3E3E3B3B413E3E3B3B425B47\r
+ 1B13100F00000F0F0F0F10101616191C2E3F566A5B4647484747424747484748\r
+ 484747484F481C0F0036C5C5C5C5C5C50000C5C5C5C5C5C5C5C58B7789702E1F\r
+ 2E2E2E292F292E2E2F29232323383B2F1C1610100B0000000000000000000000\r
+ 000B1616193F482F2E2E38383838382F2F382F2E3838383B383838383E3E3B3B\r
+ 3E3E3E3B3B3E3E3E3E3E38383E503800001019202C2C2C32323232322C2C2019\r
+ 1613131C485D5D48414648474748484747484847484F1F100044C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5887789702E23232E3838292E2E2923231F3848231610\r
+ 000B0B0B0B0B0F1010100B000010101316162044201938382E2F383B38383838\r
+ 38383838383B3B2F2F38383B3E3E3B3B3B3E3E3E3B3E423E3B3B3B3848421600\r
+ 1018203236443D444444534453535344443D32180F162F60603E3E4948484242\r
+ 424846414F481C10005398C5C5C5C5C50000C5C5C5C5C5C5C5C5837789713B2E\r
+ 232E29382E2929231F3E421F160B0B0B0F10101010101010100B002606171013\r
+ 161919443D181F2F292E38383B3E38383B3B3838383838383B3E3B3B3B3E3E3E\r
+ 3B3B3E3E3B3B3E3E3B3B383E4F2E201E001018203238363D4444445353535357\r
+ 53575757442C10104770503E424142424747474747481C13003DC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5BF77896E2923232E232E2E2E1F1F483B16000B0B1010\r
+ 10101010101010100B0006AAAA61151018191E58361319292F2E2E2E383B3B38\r
+ 3838382F2F2F2F2F383E3B3838383B3B383B3B3E3E3E3E3B4241383B481F2C66\r
+ 1E001618203233363D445757534E4E4E44535353535857200019696A41494842\r
+ 4247484848471C100033C5C5C5C5C5C50000C5C5C5C5C5C5C5C5837C89692A23\r
+ 2E232E2E241F1F422310000C1010101010101010101010100B0052AAB9611713\r
+ 191936651E001B292E383838382F2E38382F383838382F38383838383E423E3E\r
+ 3E3B3B3E3E3E3E3B3E413B3B4923106458000F16192C32302B4C4E5358668766\r
+ 57474E4C4E4E5864571600566847483E4148484147471F1000208CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5807C885D29232E2E232329233E2F10000F1010101010\r
+ 0C10100B101010100B0052B9AA271019192C64330013232E2E2E2F2F38383838\r
+ 3B382E38383838383E3B38383B3E3B3B3E413E3B3E3B3E3E38383E3E41471B13\r
+ 6432001016191C879087874E66909090874E878787874E586565200038464147\r
+ 46413E4748422310003598C5C5C5C5C50000C5C5C5C5C5C5C5C5BF77895D2323\r
+ 38232E2E231C41101916100F10101010100B0000000B0B002761B9AA2B001619\r
+ 1E574413101C2E2F2F2E292E2F38383838383838383B38383B38383E3B38383B\r
+ 3E3E3B3B3B3E3B3E3E3B3B3B3E483E1016723200101519879090904E4C878787\r
+ 4E4E90909090585758675800103B47414242414947471F10003398C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C598777C895D2E2E29232E232E233F00C035100B10101010\r
+ 002761AA61102761B9B961170B1619163D5818001B2E2E232E2E2E38382E2E38\r
+ 3838382F2E2F2F292E3838383E3E3B3E3E3B3E3E3E3B3E3E3E3E413E3E3B482F\r
+ 00207B33000E1890909090878766666687879090909058576467640C002E4241\r
+ 4248484847471F130032C5C5C5C5C5C50000C5C5C5C5C5C5C5C57C7F88692F29\r
+ 231F2E29231C3B0E32BF1900101010100052B9B9AAAAB9B9AA4C0E0B16181636\r
+ 58190019232E29292E2E382F2E2E3838382E292E38382E2E2F383838383E3838\r
+ 3B3B3B3E3E3E3B3E3E3B3B3E3B3E3E4F290033883D0000208790909090909090\r
+ 909090908766575865C03600133841414742474147482313002CC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C57C7C885C2E292E2E232E291F291C0072761600101010\r
+ 00177DB9B9AA614D100B131616163658180018232E2E383829232E2E2E2E3838\r
+ 2F2E2F2F2F2E2E2E313838383B3B3838383B383B3B3B383B3E3E3E3E3E3E413E\r
+ 4723002C076700001720668787879087878787644E4F5865C0580000183E4742\r
+ 3E42413B46482313002007C5C5C5C5C50000C5C5C5C5C5C5C5C5737F885D2F23\r
+ 2329232E2E23232F150067C0160010131000274C170E000B1016161016444416\r
+ 00192E2E2929232E2E2E2E2E2E2E2E2E292E2E2E2F29232E2E2E2E38382E383B\r
+ 382F3B3B3B3B3B3B3B3B383B3E3E3F3E414F23001888801600191D272B4E4E4E\r
+ 4E4D4E57585864C0580C00132E473B4141423B3E48421F10002C98C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5707F89562E232E2E29232323231F29130035581E0B00\r
+ 131610000B10131616101332582C0B101B1F23382E23292F2E2E2E2323292E2E\r
+ 2E2E2E2F383B3E3B3F413B3E3E4142413B3B3B3B3E383E3E2F383B3B3E3B3E42\r
+ 3E3E482F001067074410182C35445357575858585865C05300001023463E3E3E\r
+ 3E3E3B42493E1F160020C5C5C5C5C5C50000C5C5C5C5C5C5C5C5717C8355382E\r
+ 23232F2E2329231F232313001867C01E0F1010131616161616203D361600131C\r
+ 2E29232323292E2E2929292E3E3E3B3B3E3B382929231C1C1F1F1F1F1F232E23\r
+ 2E3E4241474F423E3E3E3E3E3E3E3B3B3E3E414841190016747432182C364457\r
+ 57585864676734000010234847423E423E3E4241474723160020C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C56F7F7F5C29232E382E382F2329232323231800004483\r
+ 74533220191E20202C201300001B2323232329292E2E2F3B42423E291C1C1B19\r
+ 16181E203235363D44444436333232321E161316191B1C233842424248484141\r
+ 3E3E3E3E414F381000103334202C3657646567675316000013294842423E3E3E\r
+ 47413E3E41412316001E07C5C5C5C5C50000C5C5C5C5C5C5C5C56F8883552323\r
+ 2E2E292F2E2E3829292323291C100000538880582C19160F00001019232E2923\r
+ 292E3B3B383F291816130019576774BF88078D8E8E8D07078C8D8D07078C8C8C\r
+ 8C07888074654432160013191B294248555549423E414847291300001013161E\r
+ 3244361600000B1B3B483E3E3E3B3E3B3E41414747421F1600188BC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5986E7F834F23231F292F2F2E312F232929292923231B10\r
+ 0000000000000010161B2329292F3E3E3B3B231B16162C36190044A0A097938D\r
+ 8D8D8C07078B8B88838883888B8B8B8B07078B078C8D8D8E8B3D00102C181016\r
+ 1C38474F565048474F4F381C16000000000000000F1B2947463E3B41413B4241\r
+ 3B3B424241472316001883C5C5C5C5C50000C5C5C5C5C5C5C5C56A887F47292E\r
+ 2F2E38312E232E292E2E29232923231F1B16161616191C23232E2E313B3B3B2E\r
+ 1B192C577280889D64198BBD8E078C8C0707078B8B8888888388888383838388\r
+ 8B88888B0707078EA38018388E8C83C032161016294755504948464841382E1F\r
+ 1B19181B2E41423E3B3B3E3E3F413E413E41424747422316001E8CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C569887F412323292E2E2E2F2E2E2E29232E292E292323\r
+ 2929292E23292E232E3B3B2A1F1B2C4472838B078B8B838E76368BB5978C8D8C\r
+ 8C8C078B078B8B8B07078B078B888888888B8B8B07078C8EA083205397979DA0\r
+ 9D8D80642016161F47564841414748474747423E413F3E3B3E3E3E3B3E423E38\r
+ 3B3E414241462916001EC5C5C5C5C5C50000C5C5C5C5C5C5C5C55D887F412923\r
+ 23232F382E292E2E2E232E2F2E2E292E23292E2923232E3B2F231C20577B8B07\r
+ 078B8B888388838C83357EB5A08E8E8E8C8C8C8C8C07078E076744768D8C8B8B\r
+ 07070707078C8D97A07616679D8D8D8D8E97A0A097886720161C3F504F3E3B3E\r
+ 42473F3B3E3B3E3E383E42413E3E3E3E3E3E413E42472316001907C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C55D887F3E232E2323383B382E2E2E292E2F382E2E2329\r
+ 2E292E231F3846231B35748B8C8C8B8888888888888B888C073267BDA5979797\r
+ 978E8E8E8E8EA38C32000013C0A3978D8D8E8E8E8E8E8E97A0C0137BA08E8E8E\r
+ 8E8E8E8E97A0A097805719193B55483F424242413E3B3B413E3E3E3E3E413E3E\r
+ 3E423E3E413B2E1600198BC5C5C5C5C50000C5C5C5C5C5C5C5C569887F3F2323\r
+ 232929382E3831292F292E2E2E2323292F2E23233E2F172C748C8E8C8B88888B\r
+ 8B8B88888B8B88079D3344B5AD9D9D9D9D97979D97A6A053002044131E8BAEA0\r
+ 97979797979797A0A0581688A08E8E8E8E8E8E8E8E8E8E97A5A08853161F5648\r
+ 3B3E3E3F413F3E3E3E413E3E3E47413E3B3B3E3E3E3E2918001683C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5A069837F4223232323292E2E2E292E2E292E2E2E2E2E23\r
+ 23292347232C748E8E078B8B8B8B8B8B8B8B8B8B8B8B8B8BA05336A6B5A0A0A0\r
+ A0A0A0A0A0B5BF19C0AEB5882C65ADA8A0A0A0A0A0A09DA69739198EA08E8E97\r
+ 979797979797978E9797A0A0BF2C1C505046413B3B3E41413B3B383E4747413E\r
+ 3B3E413E414723160013BFC5C5C5C5C50000C5C5C5C5C5C5C5985D887F42232E\r
+ 2E232E2E2923292E2E2E2F2F232929291F1F481F0058A9BDA68D8B8B07078B8B\r
+ 8B078B8B8B8B8B8BA3663397BDA6A0A0A5A6A6A5A6A68B8BB4B5B4B58E839DAE\r
+ A5A6A2A0A0A0A0AE072033A09D9797979797979797979797978E97A9BD07100E\r
+ 474F41413B3E42413B3B3B413E3E3F3B3B3B3E3B3B462F1600137EC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C560887C3E1F29292929232F29312F2E2E2E2E29232E23\r
+ 1F501D1966767BBF8CA8A68E8B8B07070707078B0707078BA07B3288BDA6A0A6\r
+ A6A6A6A6A8A6AEB5AEABA6ADB0A8A5A6A6A6A6A5A6A5A6B5831B66A697979797\r
+ 97979797979D9D979DA6AE9788723D19131F50413B3E413E3B3B3E3B3B3B3B3E\r
+ 3E3B3B3B3B463816001688C5C5C5C5C50000C5C5C5C5C5C5C5C56E837F472323\r
+ 29292323292E2929292923292929231C501D1080B5A60776657207A9A08C0707\r
+ 070707070707078B97073272BDADA0A6A6A6A6A8ADAEAEAEAEAEAEAEAEAEAEA6\r
+ A6A6A6A6A6A6ADB5741B80A5979797979D9D9D9D9D9D9DA6AE9DBF6558748C8C\r
+ 64001F4F413E3E3B3B3E3E3B3B3B3B3E3B3E383B3E462F1600188BC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C59860887C41292323292323292F29292323292E23231F4F\r
+ 2F00BFB5A8A6A6A68D7B647297AE9707078C070707078C078DA03357BDAEA0A2\r
+ A6A6A6A6A8AEAEADADADAEAEAEADADA8A6A6A6A6A6A6AEA6642C8DA097979D9D\r
+ 9D9D9D9D9DA0B2A0806767808E9D9D9D8D5700294F413E3E3B3E3B3E3B3B3B3B\r
+ 3E3B383B41412F18001683C5C5C5C5C50000C5C5C5C5C5C5C5C55B887C2F232E\r
+ 232929232929292E23232929291C3B4B007BBDAEA6A09DA0A0A08C7257BFA9A6\r
+ 8C078C8C8C8C8C8C8CAD663DA0B5A0A0A5A5A6A6A6A6A6A6A6A6A6A6A8ADADA6\r
+ A6A6A6A5A2A6B1973657A09D979D9DA0A0A0A0A0ADAE07C0C08397A0978E8D8D\r
+ 978B320038413E3B3B3B3B3B3B3E3E3B3B3E3E3B3E472F16001680C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5076D887C3B232E232323232E232323292F292323235E13\r
+ 53A6B5A6A0A0A09D978E979783586797AB8E078C8C8C8C8C07A6803280BDA29D\r
+ A0A0A3A2A3A0A2A5A5A5A6A2A0A5A6A6A3A0A0A0A0A5B4882C7BA6979DA0A0A0\r
+ A09DA0B0A27E67BF8C978E8E8D8C8D8E8E8E8019103E3E3E3B3B3B3B3B3B3E3E\r
+ 3B3B3E3B3E41291800107EC5C5C5C5C50000C5C5C5C5C5C5C58B6E887C3B232E\r
+ 2923232E2E2E2929232E2F291C501F008CBDADA6A0A0A3A0978E8D8C8E076744\r
+ 8BAE978C8C8D8D8D8C9D972C58BDA697A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A09DA0A0A6AE722C07A59DA0A0A0A0A0A2B48EC0748B8C8C8C8C8C8D8C8D8D\r
+ 8D8E8DC0001C3E3B3B3B3B3B3B3B383B38383B3E3E3B2F18001074C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C58C59887C3B232E292929232929292E2E29291F235B0D74\r
+ B5AEA6A6A6A5A2A09D978E8E8C0707763DBFA6978C8D8D8D8C8EAB3D32AEB09D\r
+ 9D9D9D9D9D9D9797979797979D9D97979D9D97979DAEA04444A0A09DA0A0A0A0\r
+ A5B58C67BF8D8C07078C8E8E8E8D8D8D8D8D8E883800383B3E3B3B3E383B3831\r
+ 3B3B3B3B3B412F16000072C5C5C5C5C50000C5C5C5C5C5C5C5075F89773E2923\r
+ 2323292323232E29292E291D5D151897BDA8A6A6A6A6A2A0A0A1978E8C8C8C8E\r
+ BF3DBFA6978D8D8D8D8CA6741E83BDA0979D9797978E8E8E8E8E8E8E8E8E8E8E\r
+ 97979797A0B5881E74AB9DA0A0A0A0A6B5076688978C078D8E8E9797978E8E8E\r
+ 8E8E8E8C761317413B3B3B3B383E3E383B3B3B3B3B412E180B00C0C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C58B6A83733B292E232923232323232E29231F2E5B00BFBD\r
+ AEA8A6A6A6A6A2A7A7A09F97978E8D8DA08344BFA6978D8D8D8CA0972C44BDA6\r
+ 979797978E8D8E8E8D078C8C8E978D8D8E8E9797A6AE67208EA59DA0A0A0A0AE\r
+ 8BC007A08E8D8E8E9797A0A09FA097978E8E8E8E8B4400313E3B3B383B3B3B3B\r
+ 3B3E383E41412F160000C0C5C5C5C5C50000C5C5C5C5C5C5C5806A88732E1F29\r
+ 23232923232329292E231B5B1520A0B5ABADA6A6A6A6BEA47F636197A097978E\r
+ 97AB805788A08E8D8D8D8EB457198EB59D8E8E8E8E8C88078E8C8C978D888B8E\r
+ 8D8E97A0B08C2C53A6A09DA0A0A0AE8C7207A88E8E97979D9DA09D897F94A197\r
+ 8E978E8E8D7416173E3B383B2F3B3B2F3B3B3B383B472F16000E74C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C58B6088732F23232929232E2E292929231F2E5B0083BDB4\r
+ A9ADA6A6AEBEA1616363628EA6A09D9D9DA0AE76728C978E8E8D8CA6881866BD\r
+ A697978D8E97661974A0A08832448D978D9797A5B4721888A69DA0A0A0A69D74\r
+ 88B59D9D9DA0A0A0A0A6896363618B9FA097978E8E8B53002F3E3B3B3B38382F\r
+ 3B2F3B3B3B3B2F19000E74C5C5C5C5C50000C5C5C5C5C5C5C58B6F8877232323\r
+ 2E382E2E2323292E231C5B151EA0BDAEA8ADA8AEBE976263636389A7A6A0A0A0\r
+ A0A0B58EC0BF978E8D8E8C97A8442CA6B59D97978EA0881E00323D13187EA08E\r
+ 9797A0B58E2C36A5A09DA0A0A5AE88C0A6B59DA0A0A0A0A0A0A68D626362627F\r
+ 9FA08E97978C7416173B3B3B31383B3E3B3B3B383E462F18000E74C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5886F88772F23232329292A292929231F235E0DBFB5B5AE\r
+ A6A6AEBE8D62636361A0AFABA6A2A0A0A5A2B5A067748E8E8D8D8D8DA68316C0\r
+ BDA6979D979DA5720000000057A09D979797A6B5721380A69D9DA0A0A5A67E67\r
+ B5B5A0A2A2A5A2A5A2A6A797616362627F9FA08E97978832002E3E3B2F3B3838\r
+ 3B3B3E3B3B3E3816000D72C5C5C5C5C50000C5C5C5C5C5C5C5BF6E88772A2E23\r
+ 292929231F2929231C501F0F97BDAEADA8AFBE896363628DBEB5A9A6A6A6A6A6\r
+ A6A6BD8C5876978E8E8E8D8C97AE441E97BDA3A0A097A0A574161066A2A09797\r
+ 9DA2B58D2036A2A09DA0A0A0A5AE7E32AEBDA2A6A6A6A6A6A6A5A6AC9F7F6263\r
+ 627C9FA097978EC0001B3E3B2F3B3B313B383B38383E2F180B0072C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5837088732923292323232E29292923235E0D74B5B5ADA8\r
+ B5B57F63637FAEBEAEAEAEADADA6A6A6A6B5BD393207978E8E8E8E8D8CA38C19\r
+ 44BDB5A5A0A0A0A3A6A0A0ABA3A0A0A0A0AEB0641607A6A0A0A0A0A0A0AE8C19\r
+ 58BDB5A5A5A6A6A6A6A6A6A6A6A48E7763637C98A69797832C0D3B31313B2F3B\r
+ 382F3B3B3B413119000072C5C5C5C5C50000C5C5C5C5C5C5C5886A8973292323\r
+ 232E2E292323291C422A008EBDAEA8BEAF626361A6BEB5AEAEAEAEAEAEADA8B5\r
+ BDB535107BA08E8E8E8E8E8E8E8EAEC0107EBDB5A6A5A5A3A2A6A6A0A2A0A0A2\r
+ AEBD7B00C0A69D9DA0A0A0A0A0A6AE7B0044BDBDB5A6A6A6A8A8A6A6A6A6ACA4\r
+ 8C61636198A69D8EC000293B3B3B3B3B3B3B3B3B3B3E2F18000072C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5807183702E1F2929232F2E2329231F5D1057AEB5A8B5A1\r
+ 62628DBEB5AEAEAEAEAEAEAEAEB5BDBDBF161680A08E8D8E8E8E8E8E8E8D9DAB\r
+ 53198DBDB4A6A8A6A6A5A6A6A6A6A6AEBD881020A0A29DA0A0A0A0A0A0A0A6AE\r
+ 74001688BDBDB4A6A6ADADA6A6A6A6A6AFA488626207A19D831615383E2F383E\r
+ 3B2F38383B3E38180B00C0C5C5C5C5C50000C5C5C5C5C5C5987C7388732E1F23\r
+ 2323292E2F2E2338590088BDB0ADBE7F7FA4BEAEA8AEAEAEAEAEAEB5BDBD8B1E\r
+ 00448EA0978E8E8E8E8E8E8E8E8E8EA69D322CA0BDB5A8A6A6A6A6A6A6A6AEBD\r
+ 8E1B198CA69DA0A0A0A0A0A0A0A0A0A6B58C2000188CBDBDAEA8A6A6A6A6A6A5\r
+ A2A6A7987C6E8CA18C36002F3B38382F2F2F3B3B3E413B190000C0C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5767188712E1F23292E232929291F471F1697BDAEA8AEAF\r
+ B5AEADA9ADADAEAEB5BDBDBD8B1E003D8CA59D8E8E8E8E8E8E8E8E8E8E8E8E8E\r
+ A6071E2097BDB5ADA6A6A6A6A6B4BD8E1E198BA69D9DA0A0A0A0A0A0A0A0A0A0\r
+ A3B5AEBF1600168CBDBDB5AEA6A6A6A6A2A0A3A6A6948EA09772001F3B3B2F2F\r
+ 38313B3B3B3B3818000067C5C5C5C5C50000C5C5C5C5C5C5C57F7188712E2323\r
+ 292329292923295B0072B5B5ACA6A6AEAEA9ADADAEB5BDBDBDA6C01600448CA6\r
+ A08E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8EA68D3210BFBDBDBDB5B0B5BDBD7E00\r
+ 1E07AD9D97A0A0A0A0A0A0A0A0A0A0A0A0A0A6B5AE8019001067A2BDB5AEADA6\r
+ A6A5A5A3A2A6A2A0A088191538383B383B3B383B41413119000067C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5987E7788712E232323292923291F2F480080BDB4A8A9ADAE\r
+ B0B4B5BDBDBDA67E190016678EA6A08E8E8E8E8E8E97978E8E8E8E8E8E979797\r
+ 8E8EA5A057002088B1BDB5A98320002C9DA69D9DA0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A6B5ADBF1900001983A6B5B5B5AEAEADA6A5A0A0A28D33003B3B4138\r
+ 313B383B3B423B19000066C5C5C5C5C50000C5C5C5C5C5C5C577738970232929\r
+ 29232323291F472F0058AEBDBDBDBDBDBDB5AE8D671800003383A0A5A0978E8E\r
+ 9797978E8E97978E978E8E97978E8E97978E8EA0AD832000000000000019BFA6\r
+ A597979DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A6B5AE8C581000001974\r
+ 8CA6B5B5BDB5AEAEAE8C160038383B2F2F31383E3E41311B000066C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C57177886F29292329232E292F23501B0000C0A8B5A68EBF\r
+ 581600000044839DA6A39D8E8E8E979797979797979797978E97979797979797\r
+ 9797979797A5A28B725757728BA5ADA0979D9DA0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A6B5B5A383440000000020657E07A5B4A05700102338383A\r
+ 3B3B2F383B3E38190B0066C5C5C5C5C50000C5C5C5C5C5C5C5737C07702F2323\r
+ 29233838232E4713000000000000000019577E07A0A6A3A09797979797979797\r
+ 979797979797979797979797979797979797979797979DA5A8ADAEADA6A09D97\r
+ 9DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A2A5A5A2A2A2A3A0A0A6AEB5B5A58B\r
+ 7432100000000000000000001F41383B3B3B383B3B3E3B1B0B0064C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5777789712323232E29232E1F461766806766C074808C9D\r
+ A6A6A6A3A09D979797979797979797979797979797979797979797979797979D\r
+ 979797979797979D9D9D9D9D979DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A3A3A0\r
+ A5A5A5A5A6A6A5A5A6A6A2A0A2A6AEB5B5AEA08C8374572C1919160C163B3B3B\r
+ 313838383E463B1B0B0064C5C5C5C5C50000C5C5C5C5C5C5C5737C896F232923\r
+ 2F2E232323480D97BDB5AEAEAEAEA6A0A09D9D97979D9D97979D979797979797\r
+ 97979797979797979797979797979797979D9D9D9D9D9D9DA09D9D9D9DA0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A2A2A5A5A5A5A5A5A6A5A5A6A5A6A6A6A6A6A5A2A2A0\r
+ A6A8AEB5B5B5B5AEA08E076616293E3B3B3B3E383E41381B0B0064C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5707C896F23292E2E2F2F23382A2CA0BDA6A09D9D9D9D9D\r
+ 9D9D9D9D9D9D979D9D97979D979D9D979D979797979797979797979797979DA0\r
+ A0A0A0A5A6A6A6A6A6A6A6A6A6A6A6A5A2A0A0A0A0A0A0A0A0A0A0A2A3A3A5A2\r
+ A2A5A6A5A5A5A6A6A6A6A6A6A5A6A6A6A5A2A2A0A6A6A6A9AEB5B288201F423E\r
+ 3B3B3B3E3B3B2F1B0B0058C5C5C5C5C50000C5C5C5C5C5C5C55D7C076F1F232F\r
+ 2E292923471566AEB5A2A0A09D9D9D9D9DA09D9D9D9D9D9D9D979D97979D9D97\r
+ 979797979797979D9DA0A0A0A5A5A6AEAEAEB0B4B5B5B5B5B5B5B5B5B5B5B5B5\r
+ B1AEAEADA6A6A6A0A0A0A0A0A0A3A5A3A3A5A6A6A5A6A6A6A6A6A6A6A6A6A6A6\r
+ A6A6A6A6A6A6A2A3A0A2A60733153B383B3B383B3E3B311B0B0057C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5697F896929232929232E23471083B5AEA0A0A0A0A09DA0\r
+ A09D9D9D9D9D9D9D9797979797979D9D9D9DA0A0A0A2A6A6AEAEAEB4B5B5B5B5\r
+ B4B2AEAEAEAEAEAEAEAEB0B1B4B5B5B5B5B5B5B5B5B5B5B1AEAEA9A6A6A6A6A6\r
+ A6A5A5A2A2A5A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A68E58133E3B\r
+ 3B383B3B3B3E38190B0057C5C5C5C5C50000C5C5C5C5C5C5C56A7F88682A2923\r
+ 2E23291F4615A0BDAEA0A0A0A0A0A0A09D9D9D9D9DA0A0A0A0A0A0A2A5A6A6AD\r
+ AEAEAEB5B5B5B5B5B5B0AEAEA8A6A6A6A6A5A6A6A6A6A6A6A6A6ABA8A8ADADAE\r
+ AEAEAEAEAEB4B5B5B5B5B5B5B5B0AEAEAEAEADA8A6A6A6A6A6A6A6A6A6A6A6A6\r
+ A6A6A6A6A6A6A6A6A6A6A6A074182F3E38383E3E3B3B2F1B100053C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56A7F89692323232E2923293C1BA2BDA6A0A0A0A0A0A0A2\r
+ A5A6A8AEAEAEAEB0B4B5B5B5B5B5B5B5B5B5B4B2AEAEA6A6A6A3A0A0A0A0A5A2\r
+ A0A2A6A6A6A6A6A8A8A8ADADAEAEAEAEAEAEAEADADADABADAEAEAEAEAEAEAEB0\r
+ B0B4B5B5B4B0AEAEAEAEAEAEAEA8A8A6A6A6A6A6A6A6A6A6A6A6A6A080201F3B\r
+ 3E3B383B3E412F19100044C5C5C5C5C50000C5C5C5C5C5C5C56A7F896A232323\r
+ 2E2A233B1F39A6BDA6A0A0A0A0A6AEB5B5BDBDBDBDB5B5B5B5B5B5B4AEAEA9A6\r
+ A6A2A2A0A0A0A0A0A0A0A0A2A6A6A6A6ADAEADAEAEAEAEB0B0B0B0B1B1B4B4B1\r
+ B0B0B0AEAEAEAEADADA6A6A6A6A6A6A6A6A6ABADADADAEAEAEAEAEAEAEAEB0B0\r
+ AEAEAEAEAEA6A6A6A6A6A6A68B2C1C413B3B3B3B3E412F1B100044C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5985D7F885D2929292E2F233E1767B1B5A5A0A0A0A8B4B0B0\r
+ B4B5B1AEAEAEADA8ABA6A6A6A2A0A0A0A0A0A0A0A0A5A6A6A6A6A6ACAEAEAEB5\r
+ B5B5B5B5B5BDBDBDBDBDBDBDBDBDBDBDBDB5B5B5B5B5B4AEAEAEAEADA8A6A6A6\r
+ A6A5A5A3A0A0A0A0A0A6A6A5A0A6A6A6A6A8AEAEB1B1AEA6A6A6A6A68C3D1B3B\r
+ 38383E3B3B413B1B0F003DC5C5C5C5C50000C5C5C5C5C5C5C56083895C232923\r
+ 292E233E1580B5B5A0A0A5AEAEA6A5A6A6A9AEAEAEADA9ACA9A8ABA6A8ADA9A9\r
+ ADAEAEAEB2B4B5B5B5BDBDBDBDBDBDBDBDB5B5B5B5B1B1AEAEAEAEB1B1B1B1B5\r
+ B5B5BDBDBDBDBDBDBDBDB5B5B5B5AEAEAEAEA8A6A6A6A5A3A0A0A2A0A0A0A0A0\r
+ A0A0A6A8AEB5BDB5A6A2A6A69766132F3B3B38383B3B3B190C0036C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56988896F232F2E2E2F2E47158EBDAEA0A0AEAEA5A0A2A6\r
+ AEB1B5B5B5B5B5B5B5B5B5B5B5BDBDBDBDBDBDBDBDBDBDBDB5AEA6A09D978E07\r
+ 8B88838383807A7A7A7A7A7A80808083888B8A8C8E97A0A2A6AEB5B5BDBDBDBD\r
+ BDBDB5B5B5B5B4AEAEAEABA6A6A6A6A6A6A6A6ADB2B5BDBDB5A6A5A6A0721B3B\r
+ 3E3E383B3E3B3B1B100035C5C5C5C5C50000C5C5C5C5C5C5C56983896E29292E\r
+ 2E2E234117A0BDAE9DADA59797A6B5BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB5AE\r
+ A6A6A09D8E8C8A837D7D7D7D7A7A7A7A7A7A7D7D7D7D7D7D7D7D7D7D7D7D7D82\r
+ 82828282828282848484848A8A8D979DA0A0A6A9AEB5B5B5B5BDB5BDB5B5B5B5\r
+ B5B5B5B5B5B5BDBDBDB5A0A6A07B202A3B3B3B3B3B3E311B100033C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5A05D88895B292E2E3829292A23A6BDA6A0A68883A0BDAEA0\r
+ A0A3A0A09D938E8C918A84827D7D7D7A7A7A7A7A7A7A7A7A7A7D7D7D7D7D7D7D\r
+ 7D7D7D7D7D828282828282828282828484848484848484868486868484848484\r
+ 84848484848491918D9393939797979DA0A0A5A6AEBDBDBDBDB5A6A6A583201F\r
+ 3E382F3A3B3B2F19100032C5C5C5C5C50000C5C5C5C5C5C5985588895C232E29\r
+ 292F3E1F57AEBDA0A98E6783B107797A7D828282828282828484848484848484\r
+ 8484848686868686868686868686868686868686868686848486848484848484\r
+ 8484848484848484848486868686848686868686868484868686868686848484\r
+ 84848686848DBDBDBDBDAEA3A68B2C1C3B3B382F3B3B2E18100032C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5985B8889562F292E2E293E1772B5B5A0AE80588E8B787A84\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848291B5BDBDB1A0A68C3D1B\r
+ 413838383B3B3B1B0B0032C5C5C5C5C50000C5C5C5C5C5C5C55B88895D292E2F\r
+ 2F293F15BFB5B1A0AE74678F7479848684848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848497BDBDB5A0A68E58153B3B3B3B383B2F1B100032C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C555888855292E2E232347158BBDAEA2A9657407797D8684\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848DBDBDB5A0A69DC010\r
+ 383B3838383E38190F0032C5C5C5C5C50000C5C5C5C5C5C5A05C89895B2F2329\r
+ 2F2947158FBDA8A6A358BF8B7982868484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848491BDBDBDA6A6A07410243B3B3B3B3B3B1B100032C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5985C8989552F2F2E2F294115A0BDA6A69753888379828684\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848491B5BDBDA6A6A2BF20\r
+ 243B3E38383B3B1B10002CC5C5C5C5C50000C5C5C5C5C5C5C56989895C23232E\r
+ 2E382A32A6BDA5AE075307807984848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848491B1BDBDAEA2A6882C1F3B3B383B413B1B10002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56E89895529382F23381F58AEBDA0AE88588D7E7A848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484AEBDBDAEA0A68B2C\r
+ 1B413B3B3B3E3B1B0B002CC5C5C5C5C50000C5C5C5C5C5C5C55C8989692F2F38\r
+ 2E3B1774B5B5A0AE806497767A84848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484A5BDBDAEA0AB8D3D1B3C3B38383C381B0F002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5A05C89886F2938382E421783B5B4A0AE74C09A747A848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484849DBDBDB5A0A89758\r
+ 153E3B3B383B2F1B0B002CC5C5C5C5C50000C5C5C5C5C5C5985C89885C2F383E\r
+ 293E1B07BDB0A0AE72769A747D84848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848497BDBDB5A0A89D67153B3B2F383B381910002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C598600789562E2F2E293E1B9DBDAEA5AE65808C787D868484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848493BDBDB5A2A6A074\r
+ 162F3B3B383B3B1B0B002CC5C5C5C5C50000C5C5C5C5C5C5C5690789552F3838\r
+ 383C1BA0BDA8A6A5588B07787D86848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848DBDBDBDA6A6A27B193B3B3B3B3E38190B002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56A898856383B3E2E3723A6BDA6A8A0578C8B7882868484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848CBDBDBDA6A6A680\r
+ 1B2F3E3B383B3B1B0B0020C5C5C5C5C50000C5C5C5C5C5C5C5708C894F2F3B38\r
+ 382A57AEBDA6AE8E588E88798284848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691B5BDBDA6A6A68B1C23383B3B413E190B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58C6F07885C2F38383B1D72AEBDA6AE076497807984848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848491B5BDBDAEA6AD07\r
+ 1F1F3E3B3B3E3B1B100020C5C5C5C5C50000C5C5C5C5C5C58B6A0789502F3B3B\r
+ 3E177EB5BDA5B48865A0BF798484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691B5BDBDAEA5AE8C2C1B473B3B3B3B1B100020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58B6A0789552F3E383E1788B5B5A2B58067A6767A84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848691B1BDBDAEA2AE8E\r
+ 39153F382F3B2F1B100020C5C5C5C5C50000C5C5C5C5C5C5C55D07835B3B382E\r
+ 3E1507BDB5A5B57B72A6767A8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691A9BDBDB4A2AD975315412F383E381B100020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C55F0788563E2F2E41158EBDB5A5B5747BA6797D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848491A6BDBDB5A0AEA0\r
+ 6415413B3B3B3B1B0C0020C5C5C5C5C50000C5C5C5C5C5C5C5698D8955383B2F\r
+ 3B15A0BDAEA6B272809A797D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484A0BDBDB5A2AEA06713423B3B3B2F190F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58D6E8C89552F3B2F4117A6BDAEA6AEC08B8F797D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848497BDBDB5A5ADA5\r
+ 74153C3B383B311B100020C5C5C5C5C50000C5C5C5C5C5C58C718D89552F3B2F\r
+ 2F1CA6BDAEA6A6678C8E787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848497BDBDB5A6ADA67B153B3B3B3B3B1B100020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5076F8D89562F3B382A39AEBDAEAEA5658D8C787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848EBDBDBDA6ADA8\r
+ BF18383B3B3B38190B0020C5C5C5C5C50000C5C5C5C5C5C5076A8D894F382F2F\r
+ 2458AEBDA8AEA0659707787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848DBDBDBDA6A6AD83192A3E3B3B2F1B0F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5075D8C07563B3B381DC0B5BDA6AE9767A007787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848DBDBDBDA6A6AE\r
+ 881B293B383B3B1B0B0020C5C5C5C5C50000C5C5C5C5C5C58B698D88503B383E\r
+ 1776B5BDA6AE8DC0A088787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B5BDBDA8A6AE07201F3B38423B180B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58B698D885B2F2F3F17BFB5BDA6B207C0A688788286848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B5BDBDADA6AE\r
+ 07201F3B3B3E2F1B100020C5C5C5C5C50000C5C5C5C5C5C58B708D89493B3E3E\r
+ 1788B5B5A6B58B72A98379828484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B5BDBDAEA6AE8C321C413B3E2F1B0F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58B6F8E895041423E178BBDB5A6B58876AE80788284848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B5BDBDAEA6AE\r
+ 8E3D1B413B4238180B0020C5C5C5C5C50000C5C5C5C5C5C588708E895C47413B\r
+ 178CBDB5A6B5837BB1BF78828684848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AB1BDBDAEA6AE97441741383E311B0B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5886F8D895B3E3B3B1597BDB5A6B5807EB17B787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AB1BDBDB0A6AE\r
+ 9D57163B3B3B38190B0020C5C5C5C5C50000C5C5C5C5C5C588708E895D2F3841\r
+ 17A0BDB5A6B5BF80B576787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AB0BDBDB0A6AE9D64163B3B4131180B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C588718D895D423B3B1BA6BDB5A6B57B83B576787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AB1BDBDB4A6AE\r
+ A0661538383B3B180F0020C5C5C5C5C50000C5C5C5C5C59888708D076A483B3B\r
+ 1BA6BDB5A8B17E88BD74787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AB0BDBDB4A6AEA0C0153B3B3E3B160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C520738E894F4141311BA6BDB5A6B07E88BD72787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484AEBDBDB5A6AE\r
+ A072163B3B3B3819100020C5C5C5C5C50000C5C5C5C5987620778E895D3B3B24\r
+ 1FA8BDB5ADB27B8BB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AAEBDBDB5A6AEA674162F3B4138160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5987233778C895C473E2439AEBDB5AEAE7B8BBD72787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AAEBDBDB5A6AE\r
+ A57B183B3E482F180F0020C5C5C5C5C50000C5C5C5C5986739778E076A473E1F\r
+ 40AEBDB5ADAE7B07B5C0787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AAEBDBDB5A6AEA67E192F3B413B190F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C56644738D896A4F3E1F58AEBDB5AEAE7B07B5C0787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484AEBDBDB5A6AE\r
+ A6BF19383B3E2F19100020C5C5C5C5C50000C5C5C5C5C56653718D896950481F\r
+ 65AEBDB5AEAB7B8CB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484A9BDBDB5A6AEA6801B2F3B3E2F190F0020C5C5C5C5C5\r
+ 0000C5C5C5C5076653738E896041421D67B1BDB5AEAD7B8CB572787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491AEBDBDB5A6AE\r
+ A6831B2A3B3B2E180B0020C5C5C5C5C50000C5C5C5C58B6453738D896F493B1D\r
+ 72B5BDB0AEAB7E8DB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491AEBDBDB5A6AEA6831B2A3B3B2E160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5886453718D896F4F421774B5BDB1AEA67E8EB572787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AAEBDBDB5A6AE\r
+ A8831B2F413E29160B0020C5C5C5C5C50000C5C5C5C5836453718D89694F4717\r
+ 7BB5BDB0AEA6BF8EB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491AEBDBDB5A6AEAD881C2F3E3B23180F0020C5C5C5C5C5\r
+ 0000C5C5C5C5836657738D896F4742177EB5BDB0AEA67E8DBD72788284848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B0BDBDB5A6AD\r
+ AE881C293B382E160B0020C5C5C5C5C50000C5C5C5C5726657778D8971413F17\r
+ 7EB5BDB4AEA67E8EBD7278828484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B1BDBDB5A6AEAD8820233B3C29160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5446653718C8B71503817BFB5BDB5AEA6BF8EBD72788286848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B1BDBDB5ABAE\r
+ AD8820233E422E160C0020C5C5C5C5C50000C5C5C5A0646657708E075D494717\r
+ 80B5BDB5AEA6808EBD74787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B5BDBDB5A8AEAD8820233B422E160F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C06657718D076F42421D83B5BDB1AEA8808EBD74787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484868DB5BDBDB5A6AE\r
+ AE8B20233E3E29130F0020C5C5C5C5C50000C5C5C5C5836453708C896A49421D\r
+ 83B5BDB5AEA6808EBD76787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484868DB5BDBDB5A6AEAE8B20233B3E2916100020C5C5C5C5C5\r
+ 0000C5C5C5C5836653718E076E47421783B5B5B5AEA6838EBD76787A84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848693B5BDBDB5A6AE\r
+ AE8B1F243B3B23160B0020C5C5C5C5C50000C5C5C5987E6653718E8971504215\r
+ 83B5BDB5AEA8838EBD7E787A8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848693B5BDBDB5A8AEAD8B1F2F3E3B23130B0020C5C5C5C5C5\r
+ 0000C5C5C598766653708E896E49421783B5BDB5AEAD888EBDBF787A84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848693BDBDBDB5ADAE\r
+ A98B1F2E3E3E29160B0020C5C5C5C5C50000C5C5C5C57666446E070771554917\r
+ 80B5BDB5AEAE888EBD8078798484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848697BDBDBDB5ADAEA6881F2F3E3B23160B0020C5C5C5C5C5\r
+ 0000C5C5C5C57466446F07077755491780B5BDB5AEAE8B8EBD83787984848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484919DBDBDBDB5ADAE\r
+ A6881C2A413823130B002CC5C5C5C5C50000C5C5C5C5766444708C07734F4917\r
+ 80B5BDB5AEAE8B8DBD8878798484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484919DBDBDBDB5ADAEA6881C29413B23100B002CC5C5C5C5C5\r
+ 0000C5C5C5987B643D6F8D077155471780B5BDB5AEAE078EBD8B527984848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848486919DBDBDBDB5ADAE\r
+ A888202E413B23130B002CC5C5C5C5C50000C5C5C5987E583D6A8D07735C4A17\r
+ BFB5BDB5AEAE078DBD0752798284848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691A0BDBDBDB5ADAEA6831C2F3E3B1F160B002CC5C5C5C5C5\r
+ 0000C5C5C598BF64446F8C0773694F17BFB5BDB5AEAE8C8DBD0752787D848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848691A6BDBDBDB5ADAE\r
+ A6831B313E3B1F160B002CC5C5C5C5C50000C5C5C59874644460070773565B17\r
+ 7EB5BDB5AEAE8D8EBD8E52787D84848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691A9BDBDBDB1ADAEA6801B313E3B1F100B0032C5C5C5C5C5\r
+ 0000C5C5C5987B583D6E8C077769561D7BB5BDBDAEAE8E8EBD9A65787A848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848691B1BDBDBDB5AEAE\r
+ A5BF192F41381F100B0032C5C5C5C5C50000C5C5C598BF5853698C07775B471D\r
+ 76B5BDB5AEAE9797B5A665787A82848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691B1B5BDBDB4ADAEA2BF1B3B413B1F100B0039C5C5C5C5C5\r
+ 0000C5C5C5C58857445D8D89776F5D1D74B5BDB5AEAE9D97B5A6657879828484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484849191B1B5BDBDB1ADAE\r
+ A37B1B423E3E1F13000053C5C5C5C5C50000C5C5C5C58B58575D0707775D501D\r
+ C0B5BDBDAEAEA097B2B16778797D848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848491918DB5B5BDBDB1ADAEA0761C483B3B1F130B0058C5C5C5C5C5\r
+ 0000C5C5C5C5885864550707776A552467B1BDBDB0AEA09DAEBDC05279797A82\r
+ 8284848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848486868484869191848CB5B5BDB5AEADAE\r
+ A07416383B3B1F13000067C5C5C5C5C50000C5C5C5C50757645C07077C694F1F\r
+ 65B0BDBDB5AEA5A0ADBD724E78797979797A7A7A7A7A7A7A7A7A7D7D7D7D7D7D\r
+ 7D7D7D7D7D7D7D7D828282828282828282828282828282828282828282828282\r
+ 8282848282828282848484848484848484848484848486848484848686869191\r
+ 919191919191917D8CBDB5BDB5B0AEAEA072163B3B381C10000072C5C5C5C5C5\r
+ 0000C5C5C5C507585850078C7C705B1F65B0BDBDB5AEA6A0A6BD8F362B527878\r
+ 7979797979797979797979797979797979797979797979797A7A7A7A7A7A7A7A\r
+ 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7D7A7A7A7A7A7A7A7A7A7A7D7D7D7D7D7D82\r
+ 7D8284848484848484848484848484848484849184847A76A0BDB5BDB5AEAEAE\r
+ A0C0153B3B3B1C100000C0C5C5C5C5C50000C5C5C5C5C558664F898C7C6F5B24\r
+ 64AEBDBDB5AEA6A5A6AEB58E674E4E4E4E4E4E4E525252525252527878787878\r
+ 7878797979797979797979797979797979797979797979797A797979797A7A7A\r
+ 7A79797979797979797A7A797A7A7A7A7D7D7D7D7D7D7D7A7A7A7A7A7A7A7A7A\r
+ 797979797478C08BB5B5B5BDB5AEAEAE9D67163B3B381B10001074C5C5C5C5C5\r
+ 0000C5C5C5C5C564665589077C705C2A57AEBDBDB5AEABA6A6AEAEBDB1A0978D\r
+ 078B83BF7E7674C0676565644E4E4E4E2B4E2B2B2B2B2B2B2B4E4E4E4E4E4E4E\r
+ 4E524E4E5252525252525252525252525252525252524E525252525252525252\r
+ 52655252787878787878747474767E8080808388888B97B1B5B5B5B5B5AEAEAE\r
+ 9D6417473B311B10001680C5C5C5C5C50000C5C5C5C5C564644A89077C6F5D3B\r
+ 38AEBDBDB5AEADA6A6AEA6AEB5BDBDBDBDBDBDBDB5B5B5B1AEAEA9A6A09D9A97\r
+ 8F8C07078B888380BF7B767472C0676767656464646464585858646464645858\r
+ 64656565676767C07274747B7E8083888B07078C8D8E8E979DA0A0A6A6A8A9A9\r
+ AEAEB1B5B5B5B5AEADB5B5BDB5AEAEAE975719423B381B1000167EC5C5C5C5C5\r
+ 0000C5C5C5C5C5646647898C7F705D372EADBDBDB5AEADA6A8AEA6AEAEAEB0B1\r
+ B5B5B5B5B5B5B5BDBDBDBDBDBDBDBDBDBDBDBDB5B5B5B5B5B5B5B1B1B1AEAEAE\r
+ AEA9A9A9A9A8A8A9A8A6A6A8A8A8A8A9A8A6A9A9A9A9A9AEAEAEAEAEAEB1B4B5\r
+ B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B4B1AEAEAEAEA6AEB5BDBDB5AEAEAE\r
+ 8E441B473B381B10001680C5C5C5C5C50000C5C5C5C50757663E880783716F3B\r
+ 2EADBDBDB5AEAEA6A8AEA8AEAEB0B5B5B5B4B5B4B0AEB0B0AEAEAEAEAEAEAEAE\r
+ B0AEAEAEAEAEAEAEB0B4B2B0B0B4B4B0B4B4B4B4B4B4B4B4B4B4B0B0B4B0B0B4\r
+ B5B4B0B0B0B0B4B4AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEADAEB5BDBDB5AEAEAE8E3D1D483B2E1B10001688C5C5C5C5C5\r
+ 0000C5C5C5C58B3D664788077F716A471FA6BDBDB5AEAEABA8AEADAEAEB5B5B1\r
+ B1B4B5B5B5B5B1B1B1B0B0B0B0AEAEAEAEAEAEAEAEAEAEAEAEAEAEADADADADA9\r
+ A8ADA9A6ABA8A8A8ADA8A8A8A8A8A8A6A6A8A8A6A8A6A6A6A9ABA6A6A8ADA9AD\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEB5BDBDB5AEAEAD\r
+ 8C381F3E412E1910001680C5C5C5C5C50000C5C5C5C507446649898C7C715D47\r
+ 17A0BDBDBDAEAEADA6AEADAEAEB5B5B5B5B5B5B5B5B5B4B1B1B1B0B0B0B1B1AE\r
+ AEAEAEAEAEAEB0AEAEAEAEAEB4B0AEAEAEB2B4B4B0AEADA8AEAEAEADA8AEAEAE\r
+ AEAEAEAEAEADABADA8ADAEAEADADADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEADAEB5BDB5B5AEAEA88C321F423B2F1910001888C5C5C5C5C5\r
+ 0000C5C5C5C5C5C0663F838C83716A491797BDBDBDB1AEAEADAEAEAEAEB5B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B1B0AEB0AEAEAEAEAEAEAEB5BDB5AEAEB5BDBDBDB5B5\r
+ BDBDB5B5BDBDB5B4B5BDAEADB4BDB5AEAEB5B5B5BDB5AEAEAEB5BDB5ADADADAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEB5BDB5B1AEAEAD\r
+ 072C233E3B2E181000198BC5C5C5C5C50000C5C5C5C5C572663F7F8C7F73694F\r
+ 1D8DBDBDBDB5AEAEAEAEADADAEB1B5B5B5B5B5B5B5B5B5B5B5B5B1B1B1B0AEB0\r
+ B0AEAEAEBDAB2C44AEBDA23D001680A63D000000000067B558188EBDA03600C0\r
+ 803364571907BDBDBD831653AEB5ABAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEADB0B5B5B5B0AEAEA68B2C2A3B3B29180C00188BC5C5C5C5C5\r
+ 0000C5C5C5C5987B57497F077F73705B178BB5BDBDB5AEAEAEAEAEADAEB1B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B4B1B0B1AEAEAEAEAEAEBDA62044B5BD58000018BF72\r
+ 1044838080321983571EA6A02C00C0BD8313748E20000B0B10001807BDAEADAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADB1B5BDB5B1AEAEA6\r
+ 831C3B423829161000208CC5C5C5C5C50000C5C5C5C598BF53407F8C83736F5D\r
+ 1788B5BDBDB5AEAEADAEAEAEB1B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B1B1B0B0\r
+ B0B0B0AEBDAE2066BD7200677E197B6420A0BDBDBDBF207B671E6419198CBDBD\r
+ 801067BD74003588360F72BDB5A6AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEB5B5BDB5AEAEAEA6831C423B3B291610001E07C5C5C5C5C5\r
+ 0000C5C5C5C5C5883D407C8C7F776E5D1780B5BDBDB5AEAEADAEAEA9B2B5B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B5B4B1B1B4B4B0B0B0AEBDA620647B1033AE88197466\r
+ 1E8DBDBDBD7B1E7EC0162C1033BDBDBD801064BD971933B55719A6BDA6ADAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB5B5B5B5AEAEADA6\r
+ BF193E3B3829160B002CC5C5C5C5C5C50000C5C5C5C5C5073D407C07837C7069\r
+ 2464AEBDBDBDB4AEA8ADAEAEB1B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B4B4B4\r
+ B0B0B0AEBDA03200001E07BD760E727B0020C0727220208B5720B58E181683BD\r
+ 800057BDBD7600001888BDB2A6ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEB5B5B5B5AEB0B5AE7E153B3B3823160B0032C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5443977078377716F47155883A6BDBDBDB5B5AEAEAEB5B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B5B5B5B4B1B1B1B0B0AEBDA6722C3288BDBD883683A6\r
+ 661610100F1672AEC033A0BD8E201E8E073674B5BDA66413C0B5BDA6AEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEB5B5BDBDBDB5AE07\r
+ 441D483B382316100032C5C5C5C5C5C50000C5C5C5C5C5C5362E778C83777C6F\r
+ 4123381F1B577E8EA6BDBDBDBDB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B4\r
+ B1B1B1B1B5B5B5B5BDBDB5AEAEAEB0BDB5AEAEAEAEAEB5B5AEADADB0BDB5A2A0\r
+ A6A8AEAEAEB5B0ADAEAEAEADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEBDBDBDBDAE8D7E57101038473B3B23160B003DC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5A05320738D887773704A1B73075B17101532668098B5BDBDBD\r
+ BDB5B5B5B5B5B5B5B5B5B5B5B5B5B5B1B1B4B1B1AEB5B5BDB5B5AEAEB4B5B5AE\r
+ B5BDBDB5BDBDB1AEB5B5AEADAEB5B5B5B4B5B4ADA8ADB4B5B4A9A8AEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB5B5BDBDBDB5A08B74401B171710\r
+ 16383B2F3B23130B0057C5C5C5C5C5C50000C5C5C5C5C598832071078877716F\r
+ 501B5D897F7349231F17171F577B8CA6BDBDBDBDBDB5B5B5B1B5B5B5B5B5B5B5\r
+ B5B5B1B1B1B2AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEAEAEADADAD\r
+ ADAEAEAEAEAEA8A8AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB5BD\r
+ BDBDBDB5A0887444231F1F1F2F3B2E1616383B38381F16000066C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5072C6E07887C77705B1D497F7C775C483B3E3B2A1F1D171B\r
+ 39C088A0B5BDBDBDBDBDB5B5B1B0AEAEB5B5B5B4B1B1B1B0B0AEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEB4BDBDBDBDBDAE8E83C0441F1B1F2F474F4941382F2313\r
+ 18383B38311F130000C0C5C5C5C5C5C50000C5C5C5C5C5C5C5325C89897F776F\r
+ 5C1C387F7F735C483B3B3B3E2F42483B2A1F17192C647B07A6BDBDBDBDBDBDBD\r
+ B5B5B1AEAEAEAEAEAEB0AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEADADAEAEAEAEADAEAEAEAEAEAEAEB5B5BDBDBDBDBDB3978372532C\r
+ 1B1D1F23292E425C5650473E2F2F1F131B423E382E1F13000072C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5335C88897F77715D23297F7F7C70473838383B2F3E565D\r
+ 5C55473E2F1F1B15192C44748B98AEB5BDBDBDBDBDBDBDB5B5B0AEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEADAEAEADADADADABADA8A6A8ADADAEB0B5BDBDBD\r
+ BDBDBDBDAE9D077E663D1F19191C1F232F2F38382F38474F4F55483B2F2E1C13\r
+ 1F423B382F1C10000F72C5C5C5C5C5C50000C5C5C5C5C5C5C5584F89897C7773\r
+ 5D2F1F777F7C73553E38383B2F3B5656555D5655505556483B291F1D150D1516\r
+ 1E3D72888EA0AFBDBDBDBDBDBDBDBDBDBDBDBDB5B5B5B5B5B5B5B4B4B5B5B5B5\r
+ B5B5BDBDBDBDBDBDBDBDBDBDB5A69707BF66331B161015171F232F2F383B382F\r
+ 2E38382F2F3E4147494847382F291B101F4938382F1C1000107BC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5674983897F77776F2F1C777F737155473B3838383B4250\r
+ 5D5C55505C5556564F4F4A4F483E3B3B291D15100D0D1013193258727E838B8C\r
+ 97A0A3A6AEAEB5B5B5B5B5B5B5B2AEA6A09D978C8B88BF74663D201610101010\r
+ 15171F2A31383B3B382F3838382F38382F2F2F38383B424948493B3B38291B10\r
+ 2347382E2E1C1000137EC5C5C5C5C5C50000C5C5C5C5C5C5C5763E7F077C7773\r
+ 70411F73837C7C5B4738382F382E47565C6969555550505B5B5650494948484F\r
+ 473E3E494F412F2E231F17151000000000000000000000000000000000000000\r
+ 000000000D000D10151D1F292F3B3B41413B38382E383B3B382F382F382F2E38\r
+ 2E2E2F2E2E3B47494F413E382F2316102F47382F2E1B10001680C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5BF387F077F777169471C6F7F7C7769423B383B3B293E5C\r
+ 5556695C56565650504F494749504A474848473F3B414742413E3E4249484848\r
+ 3E3B3E3B312F38312F2F382F29382F2F3B3B3B3B3B3E423E3B3B3838382F2F38\r
+ 382F2F2F2F38383838382F382F38382F2E2E2E2E2F3E423E48473F3B2E291616\r
+ 2F3E2F3838190C001888C5C5C5C5C5C50000C5C5C5C5C5C5C58B2E7C897F7773\r
+ 70471B5C837C776F493F3B382F233B505B5C5B5C5C5B56554F4F50565C4F4748\r
+ 49484947424749473E3F47423E3B3B3B3B3B3B38383B383841423B3838382E38\r
+ 383838382E2E38413E38383B3B38382F2F38382F2E2E2F382F2F2F2E292F2F2E\r
+ 2F383838383B4748493E3E382E23161638472F2F291810001E07C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C53977897F7F77715B17497F7C7C735647382F38382E47\r
+ 69695D69695B5C56554F4A554F49494F49424F55494747474847424747424742\r
+ 3F413B38383B3E3B383838383B3838383838382F2F2F38383E3B2F2F382F2F2F\r
+ 2F382F2E2F38382F2E2E2F382F2F2F2E2F2E38382F3E493B3B3F3B2F2F1F1619\r
+ 3B472F312318100020C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5447389837F77\r
+ 6F5D1F2E7C7C7C715D493F382F2F2E3F5C5D5D5B5D6A5D555D5C4947474F5049\r
+ 4F4949494847474748423E3E4147413E3B3E3E3E38383B3E382F2F3838382F3B\r
+ 3B2F2E383838383B38382F2E2E38383838382F2F382F2F2F382F2F2F2F2E2E2E\r
+ 2E2E2E3138384142423F38382F1F131B3E3E2E3823160B0032C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5646E89887F737160231F7C7F7C776A50473838382E3B\r
+ 555C5D5C696A5D5D555556554A504F505649484F424749494947423E3B3E413F\r
+ 3B383B3E3E3E413B38383838382F2E2F3B2E2E2F2F38382F3838382E2E2F2F2E\r
+ 2F2F2F382F2F382F3838382E2E2E2F2E2E2F2F2F2E383E3F423B382F291B101C\r
+ 42382F2F2316000036C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5745588887C77\r
+ 736A381F737C7C7C5D5549383B3B2E3850565C6969695C5C555556555D56494F\r
+ 50494948484F4947474248423B3B3B3B3B3B3E3E3B3B3B3B3838383B3B38382F\r
+ 2F38382E2E3838383838382F2F38382F383838382F382E2F2E2F382F2F2F2E2E\r
+ 3838382E2E3B3F3E423E2F2E291B101F47382F2E1F160B0058C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5BF5583887C7C7170421C717F7F7F705D4F423838382F\r
+ 475D6A5D5D5C5B5D5C504950564F50554F4F42425055483E3F494F48413E473E\r
+ 383B3B3B3E3E3B383838383B3B38382E2E31382F2F383838382F2F383B382F38\r
+ 3B3B382F38382E2F2E2E2F2E382F2E2E2F2F2F2F3B3F423F423B2F2E291B1023\r
+ 423838311C130000C0C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C58B4A88887C7C\r
+ 7773421D6A7C7F7F73695C49383E382F495B5D5C56696F695B554A5549495656\r
+ 494748484849474248473E424741413F3E3B383B413E3F423E383B3B382F382F\r
+ 38382F2F382F2F3838382F2E38382F2F2F2F3838382F2E2E2E2E2E3838382F2F\r
+ 2E2E2E383838423E3838382F23161638423838381C1000167EC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5073F7F837C7C77734F175D7C7C7F776F5B47383E3B3B\r
+ 49555C5D5C5D5D555C695C555B504950484F554949474749473E3B3B3E3E3B3E\r
+ 4748423E3E3E3E3E3B3838383B3E3838382F38382F382F2F383838382E2E2E38\r
+ 2E2E382F2E2E3831382E2E2E2F2F2F2E2F2F38383838383B3838382E1F13183E\r
+ 3B2E382F1B10001B83C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C598387C837F7C\r
+ 77705A1B567F7C7C77705C56483B3842495C5D5C5D696A5B49555B4F5655504F\r
+ 484948474F4F4847413B3E3E42473E3B3E4247413B3B3E3E3E3B2F2F38383838\r
+ 2E2E3838383838382F312F2F382E232F382F2E2E2F2E2E2F382F2E2E2E2E2E2E\r
+ 2F3B2F2F3E3B3B3E3E3838291C13193B3B38382F1B10001983C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C53F77887C7F7373691F42777F7C77705C504A3F3E3E\r
+ 38555D69695B555C6A6A565556555655494950494749504F4742484F47413F3F\r
+ 3E383B3F3E2F3B473E3B3B38382F382F38382E2E2E292F382F2E292E2F382F29\r
+ 2E292E38292E2F2E2E2F2E2E382E2E292E2E383B3838382F3B382E231B101C3F\r
+ 3E2E382F191000208BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5656E887F7F\r
+ 7C716F29237C7C7C7C776F5D4942473F3E485B5D695D5C69695D5D5B55505556\r
+ 4F47474955554F41424742413F3F3B3B3B3B383E49423B3B3B3B3E3E3B38382E\r
+ 2F383838382F2F2F2E38382F38382E2E382F2F382F2F2F2F2F2E2F2F2E2F2F2E\r
+ 2F3B383B38383B3B2F2E2E231B101C3E3E2E2F23160F00398CC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5805D7F7F7F7C736A411C717F7F7C71695D554F473E\r
+ 3B415D6F5C5C6A696A695D5C555656505556555050504847473E3B4242424742\r
+ 3B413E3B3E3E3F3E3B3838383B382E2F38383838382F383838382F2F2E38382F\r
+ 2F38382F2F383838382E292E38382E2F2F383B383B3838382E2F2F2319132347\r
+ 2F2E2F23160F1558C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C541837F7F\r
+ 7C7C71491C697C7F7C73716F5655493B4241505C695C5D6A56565D5C5C554F55\r
+ 5647495B554749504747423B42474742423F3B3B3E413E3B3B38383E3B3B3838\r
+ 382F2E2E382F38382F2F383838382E2E2E2E2E2E38382E2E2E2E2F2E2E382E29\r
+ 2E2E38383B382F382F2E2E1F161638492E2F2F1F16000057C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C53E7F7F777C7773481C567F7C7773776F5B565049\r
+ 473E4955696F6969696A5D555B5D565B5B554F4F4F494F49424749423E47423F\r
+ 42423E3F3E3B3B3E3B3B38424738383B3B383B2F292E382F2F2E29292F382F2F\r
+ 2F2F2E2E2F38382F2E2E2F2F2F2E2F2F2E31382F2F382F2F3838231F13164249\r
+ 38382F1F130000C0C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C53B737F7C\r
+ 7F7777601F427C7F777773716A56494F48474F69695D5C5D695C565D695C5556\r
+ 5B554F4F484F504847484F4F484842474F483B3B3E3E3F3E3B3B38383E413E3B\r
+ 38383E382E38382F2F38382F382E2E382F3838382F2E2E292F382E2F2F2E2E38\r
+ 2F38382F2E38382F382E231B101B473F2A382E1C1000107EC5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C53E717C7C7F7C7769232F7C7F7C7C7C736E5C5555\r
+ 565550566969696A695B5D5D5D5D5D5B5549564F474F55484742414747413E41\r
+ 4242413E383B3E3B383B38383838383B38383838383E382F382F2E382F292E38\r
+ 38382F2E2F2F2F2E2E2F382F2E2F2E2F383838382E383B2F2F2E2419101F3E3B\r
+ 2E2F231910002388C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5586A7F7C\r
+ 7F7777692F29777C7C7F777170705C555B5B4F505D696A695C6F706969695C56\r
+ 5B5550554A5B5C49474747423F42494942414742383B3E3B3B3E382F382E383B\r
+ 38383838382F2F2F383838312E2E2E382F2E2E382E2E3838382E292E292E382E\r
+ 2F382F2E382F38382F2E1F16102E50382F38231610002C07C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C574557F7F7F7C7371421C5D7C7F7C7777716F6A69\r
+ 5550564F5C6A6A695C5D695C695C565B5D5D554F4F56554748504F4942414847\r
+ 3E4242423F3E3B3B423B38383B3B3B383B383838382F3838382F2F382F382E38\r
+ 38292E31382E3838383838292E3838292E2E382F382F2E382E291F131338492E\r
+ 38381F160B0033C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C580417777\r
+ 7F7F7C73561B48777F777773736F6F6A5D495555555C69696A696F5B5B696F5C\r
+ 565D5C4F505B50484F48424747474142473F3E42423B3B3B3F3F3B3838413E3B\r
+ 3B3E382E38382F2F382E2E3838382F2F38382F2F2E2E382E2E2F2F2E2E2E2F2F\r
+ 2E2F383838382F2E2E291C13183B422E38381F130B0057C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5073E737C7C7C7F77691F38737F7F7C737371716F\r
+ 5D5C5C555B566A6F6969706A5C696F5D5C5B5556565556564F48494949494948\r
+ 41413E3B3E413B3B3B3E3B383B3E38383B3E3B383B38382F2F38383B2F2E382E\r
+ 2F38383B2F38382E2E2E2E2F2F292E2E2E2E2F382F292F2E29231B101F473E2E\r
+ 38291B13000074C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C52F707C\r
+ 777F7C7C7029236F7C7F7F777173736F5D705D564F696F696A706F695D5D5D69\r
+ 5B5C5C5555484F5B4F47424147424249484847413E3B3B3E3B424138383B3B38\r
+ 3838383838383B38383838382E383B382F2F2F3838382F2F382E2E382E2E2F2F\r
+ 2F2E2E2E292E2E2E2E23181023483B2F2F291610001688C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C54A5B7C777F7F7C71491F55777F7C737071716F\r
+ 69695B5D55566F70706F695D6A6F5D565B5B5D5B5B5B504F4947505549484848\r
+ 47424749473E3B3F423E3838383838383B383E3B383838382F2F382F2F2F2F2F\r
+ 38382F292F2F2E2F2E232E2E2E2E382E38382F382E2F2923231F16132942383B\r
+ 38231610002007C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5BF3F73\r
+ 777F7F7373691F47737F7F7F7773776A695B5B696F565D706F695D6F6F69695D\r
+ 5B5C5C5D5D5B50565C5655504F4742423F3F41424249483B3B3F3B3B38383B41\r
+ 3B413B383B3B3B383838382F3838382F383838382F2E2E2E292E2F2E2E2F2F2F\r
+ 2E382E2E38382E29231C101942422E382F1F130B0033C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5073B707C7C7C7C7C69233871777C7F7C777171\r
+ 736F5C69696A6F5D696F6F69555B706A5D695D5C5D55565C5049485556474755\r
+ 4F47423E3B474F473B3B3E3B383E423E38383B3B38382F383838383B3B382F38\r
+ 382F2E382F2E2E2E2F2F2E2F2F2E2E2E2E2F2F2E382F2F291F1B101F473B292F\r
+ 311C100B0058C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5983E6F\r
+ 7C7C7F7F7F702F1F5D7C7F7C7C7371717173706A696A6F70716A706F5D6F695C\r
+ 695D5B5C5C5C5C55504F4F5B5649494942474748483B3B414242423B3B3B3B38\r
+ 383B3E3B383B3B3838382F38383838382E2E2F2F383838382E292E2F382F2E38\r
+ 2F2F2F292E2E23291F16102F472F2F2F2E190F00007BC5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5585B77737F837C73501C3F717C777C737173\r
+ 705D7071716A6A6F7070716F6A695D696A695C5B5C696A5C56554F50554F4247\r
+ 494F49414142423F47504F473B3B3B383E3F413B2F383B38383B382F3838382F\r
+ 3838382F2E2F38382F382F2E383E2F2E382E2E2E382F29231C1318474F383838\r
+ 231610001883C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5833B\r
+ 73777F7F7C776F2338717C77777C73737371706F70716A69706F696F6F6A6F6A\r
+ 6F6A695D565D5D5B5D5C4F494F5055564F4949423E49492316193F5C4738383E\r
+ 3E3B3B3E3E3B38383B38382F3838382F383B382E2F382F38382F2F382E2A3838\r
+ 2E2F2F2E2E2E231F1B101C4747382F381F130F0032C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C53869717C837F7C71311F55737C7F7C7777\r
+ 73736F6A6F707170706A6A706F696F70706A6969695D5C5B565B5D5B4F565C55\r
+ 49423E484F492E1610103871562F3B3E38383E3B383B3B38383B382F3838382F\r
+ 38382F2F2F2F38382F2E2E383838382E2F38382E2E23231F16133849382F382A\r
+ 1C13000066C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C549\r
+ 5070777C7C7773551F3E717C7C7C777171707171716A6F707070716F706F6A71\r
+ 6F696A695D5D5D5C555669471B1623565C4747504F4823161000327F6E383B42\r
+ 3E3B381B131B3F42383B3838383B3B38382F383838382E2E382E2E38382E2E2E\r
+ 2F292E2F2E29231C131942482E38382E19100010BFC5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5744871707C77777C6D232F6A7C77777771\r
+ 7177717173716F7173736E6F706A6F706F695C5D6A5D5C5D5C6E5C1F10001355\r
+ 7356484849492F191013557F5C383E3B42411C0F00164F703E23383B38383838\r
+ 3B383838382E2938382E292E2E292F382E2E2E2E2E23231B101F4F3E29383829\r
+ 160B00208CC5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C507\r
+ 2E6E70777F7F7C712F2355737C777C7777736F71737171717771706F706F6A69\r
+ 6A6F6A696F695D6A6969491C1000186F775548485050381B1F4F7C7C4F3B413B\r
+ 3E38191000134A7C42243838382F2E2F383838382F2E2F38382E2E2E2F2E2E29\r
+ 2E2E2F2E29231F16132F49382E2F381C100B005898C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C538566F717F7F7F7C5B1F38707C7C7C71\r
+ 777370717173716F7071706F706F6A5D606F6F69696969605C5D4F1F16103F7F\r
+ 774F484F4F4F381B1F507773483B3B3B47381913161F6F6F382E3B383B3B3838\r
+ 3B382F382F2F2E382F2E2E382E2E2F2E2E2E2F2923231C131B42422E2E2F381B\r
+ 1000107EC5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C03E69717F7F7C7F772F1F50777C777773777C77737773707171707171707070\r
+ 6F6F695D69695D5D5C5D56231B31707C775D494955563B1B1C477370423B4142\r
+ 493E19163871774A29383E3B383838383B382E38382E2E382F2E2E2E2E2F382F\r
+ 2E2E2E231F1F19162E503B2E383823161000208BC5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C58B235C697788777C7C4F1C3B707C7C7C\r
+ 73707373717171717173717071716F70707071706A69696A6A706E2F1B2E6F7C\r
+ 77695648474F42231C487370423B4742423B1616477071492F3B3B3B38383E3B\r
+ 383838382F382E38383838292E2E2E2F2E2329241F1C161B3B4F3B38382E1C13\r
+ 0B006498C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 982E4F5D6A7F837C7C6F23295D777C7773737373737170707371707173717073\r
+ 6F69706F6E696A6F6A6A6F471C1F5D7C735B5555474847231C5B7769423F413E\r
+ 3E38161847716F3E2E383B41383E3E383E3B383838382E2F38382E2F2E2E2E2E\r
+ 2E2E2E231C1B101F423F2F3838291910001380C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C572385D6E7C837C7C77421C49717773\r
+ 777771717073737773737371706A707370696A6F706A5D695C5D69501F1F5D7F\r
+ 775C5055554A4723235D715B484242414138191B4F706947383B3F3E383B3838\r
+ 3E3E382F38382F2E2E2F2E2E29292E2E2E29231F1C161641502E2E2F3823160F\r
+ 0033C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C58B234F6A777F7F7C7F6023295D777C73737C73717773717171717073717071\r
+ 71707071695D695C5B5B5D5D291B557C735D5C565655482E1F50735B3C3E4142\r
+ 503E161B5C7355293B42413B3B3B3B382F38383838292F2F2E2E2E2E2E382E2E\r
+ 2E29231F1B161F3E4138382F291C13000074C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C544415D6F88837C7C77471F427377\r
+ 7777736F77777071777773716F717171717171706F70716A5D5D5D5D3B1B3F73\r
+ 71695C5047475642295C70483E3F4848472F161B5D73492E38383B3B3838383B\r
+ 383B3B3838382E382E232F2E2E2E2E2E2E29231C19192E483E38383129181000\r
+ 1E07C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C58023415D7C7F7C7C7F5C1F235D7777777C777371777C716F717171717371\r
+ 70706F6F71736A5B565C5D69481C3877775C555B554955422E555D4247474142\r
+ 4938191F69693E38383B473E383E3B383838382F2F2F38382E292E2E23292E2E\r
+ 2E231F1B16233F47383838381F16000066C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5393B49707F7F777C7C3F1B3F70\r
+ 71737777777777777173777373716F7173706F6F6F695C5D6969696A5C293871\r
+ 735D5C50494949473E485C4F4248473B4738192E6F5638383B3E413E3838383B\r
+ 3B38382F382F2E2E3B38292E2E2929231F1F1C16193847382E2F312319130013\r
+ 8BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5BF29415B77837C7F7C5C23295D77737377777373737777737373717071\r
+ 7171717171706F6F6A6A695D603823707756495B554F4F4F5556473E42424742\r
+ 48381B3871552E2E383E3B3B423B383838382F2F3838382F2F2E2E2E2E292323\r
+ 1F231B162942492F2F382F1F160B003DC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5393856717F7C777C773B1F42\r
+ 707C777C7373777777777170707373716A696F737170706E5D6A6A5D6947236A\r
+ 7C5C4F5555504A504F4848424747474947381C496E42383E3E31383E3E3B3838\r
+ 382F2F383B382E2F2E2E292323292323231C161B384238382F2F2919100000BF\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C583234A5B7C7F7C7F7C5D2323507377737377777773737373706F7171\r
+ 706F6F7070706A5C6A69696A6F5D3E5C735D4F4A4F4F50492E234F483E474748\r
+ 483823555D3B383F3E3838383B3B3838383B3B3B382E2E38382E2E2F29292923\r
+ 1F1916233B3B3838382F2316100035C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5AE29384270837C777F77471F\r
+ 38697773737777777373737773706F7377716A6F69696A696969695D6A6A475C\r
+ 735C4F504F4F5B3810002C69473B4142483E2F555038383E3B383B3838383838\r
+ 38383838383838382F2E2F2E2929231F1C18193849382E38382E1B1600007BC5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5801F3B5D7C7F7F7F7C702E1F4A7373777C73717377777171737170\r
+ 706E6E6F6A6A6A6A6A6F69565D69565C6F5C4F55565C5B2300002F6F483E4948\r
+ 423B3B4842383B3B3F3E38383B383838382F3838382F2E2F2F2E2E2E2E23231F\r
+ 1916233F423838382F1F16100036C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C52323486F7F7F7C70735B\r
+ 1F386A737173737371737373707071716F6E71716A5D6A6A69695C5C5D6A6A6A\r
+ 706E5555565C5C2E00165671423847423E4148423838383E4138383B38383838\r
+ 3838382E2E2E2E2E2E2E292E2E29231C1619424829383838291B1000007EC5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5881F2950777F7C737773381F3F70737370717371707377717071\r
+ 737171706E6969695D5D5D695C695C231F4A5B555550563B1019707042423B3B\r
+ 3E231B233B3B3B3E3B383B382F38382F2F2F2F38382E2E2E2E29292923232319\r
+ 162E4F3B2F3B382E1F160B003D98C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5401D3B697C837C7C7C\r
+ 6923235573737377777770707073717071706A706A5D696A695D695D696F2E00\r
+ 001F6F5D564941421F1F694F3B48473E2310001642412E3B3B3B3838383B382E\r
+ 2F38383838292E2E2F2E2323231F1C161C42472F2F2F38231910000083C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5981C2349737F7F7C7C73481F2E5D717373717071737073706E\r
+ 71706F7070696A6A5D695D5C69601F000032735D474747474F554F423E3B3B3B\r
+ 1F0F0F326A3E293838382F3838382E2E2E2E2E3829232E2F2E232323231F1618\r
+ 3B4F3E3838382E1C130B0058A0C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C01D2456777C7C7C\r
+ 77682F29386973706F6F6A71705D5B5D6A6A5D696A6A695D5C695C5C5D604216\r
+ 0038715649504F423B3F4742423F3F421F001664692E38382F2F2F2E2F2E383E\r
+ 3823292F2E2323292923232323191323423E2E2F383129191000138BC5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5391D386A7F7F7C7C7C5C232F496A716F696E695B5C6A70\r
+ 6A5B5B5B565C695C505B5C5C565C5C1B105770474956502E10001B423B2F3847\r
+ 2300207350232F2E3838382F2E2E2E2E292E2E2323232923232923231B161C48\r
+ 563838382F291B10000074A0C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5881F1F3B717F7C\r
+ 7C777148232E496A6A6A695C505D695D5B5C5C5C5D5C50555B5D5C5650495B3E\r
+ 3B705C474847471C00001B49412F383B381F3F492F2938382E292E2F2E2E2E23\r
+ 2329232323232323231F231C161B3B4F47382F38381F1610003397C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5671B234F777C737C7C71381F2F3B3F4F505C69505556\r
+ 495055495055564F484F49505549424F5B4F423E3F4742230F10386A3F383F3B\r
+ 383E3E2E29292E2E2E2E23232E292929232329232323231F1C1C19161F2E3E41\r
+ 38383B3823161000008BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5A6391B3B507C\r
+ 7F777777703B1C233838383F49494949504F505B555049474249554948484747\r
+ 3F3F42423B3B422E101649562E2E3838382E23232E2E23232E2E232323232323\r
+ 23232323231C1C1C1B1B1F23232F3E3B383B38231B130000C0C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C58E1C1F3E5D7C7C777377735C2E1B1F2E38382F2E2E\r
+ 2F3B3E47473F424748423E413B3B3F3E3E3E3E3B3B3B3E3819206949232E3829\r
+ 292E2E23232923231F1F2323231F1F1C1C1B1C1F1B191C1F23231C1F3838383B\r
+ 3B38291C160B0044C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C58B1B1D2F\r
+ 60777C7C777377715B3B23231F1F3838232E38382E23383838383B383838383B\r
+ 3B38382E29292F2F3B5041232329292E232323231F1F1F1F1C1C1C1B1B1B1B1C\r
+ 19181C231F1F1F1F1F1F2E3E4138383B382E1B130F001E8BC5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C576151C3B55737C7F7773737773735D4F42231C\r
+ 1C232E292E2E2E29232329232329231F23231F1F1F231F1C1F1F1C1C1F1C1C1F\r
+ 1C1B1B1B1B1B1B1B1B1B1B1C1C1C1C1F1F1C1F1F232329383B3B3B2F383B3838\r
+ 2E1C160C001088C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C57413\r
+ 162E3E55737C777773777C737377705D50423823231F1F1F1F1F1F1F1F2E2E23\r
+ 232323232323231F1C1B1C1F1C1F1F1C1C1C1C1C1C1C1F1C1C1C1F23231F1F29\r
+ 2E2E2F3B3E3E3E3E3E38383838382E231C160B001683C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C58819001923384F5C6F6F71737773717173\r
+ 7171716F5549473E382923231F1F1F23231F1F1F1F1C232E231F1F231F1F231F\r
+ 1F1F1C1F1F1F1F23232E2E292E3838383B3B3E3E3E3B3B383B3B382F231F1C18\r
+ 130B00198BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 98441000131B292F384755696E707170707173716F7171706E60605D55554F3B\r
+ 383838382E2E292E2E29292E2E38383838382F2E2E3B413B3E42424242423B3B\r
+ 3B3B3E423B2E2F231F1C1B1918161300000F58C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C55810000010181C1F232E3B4248\r
+ 555B69706F7071716E605D6969696E5D5655565D5B4F494F5049474747474742\r
+ 4242424242484742413E3F473E383B3B382E292E231F1C1B1816131000000000\r
+ 208B98C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5A007441000000010181B1B1C29383841484F5C5C50505C695D5D6A69\r
+ 5C5D5D5D5C565B5C564F4849494948473F3F4249423E3E3E413B2F2F2E292E23\r
+ 1F1B1B19161613130F0000000016C00798C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C58335100000000B\r
+ 1016191B1B1C1C1C2329383E4147484247484850504947474847474747483E38\r
+ 3B3838382F2E2323231F1B1B1C1B18161310100B0B00000000105783C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5A08BC01E00000000000F13161616191B1B1B1C1C\r
+ 1B1C23231F1F232323231F1F1F231F1C1C1B1B1B1B1916161616131313100000\r
+ 000000000019C0889DC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C58874571900000000000000000F1010101313101013131010161610101313\r
+ 100F0B0B0B0B00000000000000000018537E07C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50780C03D20161310\r
+ 000000000000000000000000000000000000000B101016182C577688C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C58C8B88807E7266643D3233323232363D4458\r
+ 6772767E808BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000}\r
+ Visible = False\r
+ end\r
+ object ComboBox2: TComboBox\r
+ Tag = 1\r
+ Left = 152\r
+ Top = 16\r
+ Width = 113\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 1\r
+ TabOrder = 0\r
+ Text = 'Operator Logo'\r
+ OnSelect = ComboBox2Select\r
+ Items.Strings = (\r
+ 'Caller Group Logo'\r
+ 'Operator Logo'\r
+ 'Picture Image'\r
+ 'Startup Logo')\r
+ end\r
+ object Button12: TButton\r
+ Left = 272\r
+ Top = 16\r
+ Width = 33\r
+ Height = 25\r
+ Hint = 'Makes bitmap clean'\r
+ Caption = 'New'\r
+ TabOrder = 6\r
+ OnClick = Button12Click\r
+ end\r
+ object Button4: TButton\r
+ Left = 304\r
+ Top = 16\r
+ Width = 49\r
+ Height = 25\r
+ Hint = 'Reads bitmap from file'\r
+ Caption = 'Read file'\r
+ TabOrder = 1\r
+ OnClick = Button4Click\r
+ end\r
+ object Button5: TButton\r
+ Left = 352\r
+ Top = 16\r
+ Width = 49\r
+ Height = 25\r
+ Caption = 'Save file'\r
+ TabOrder = 2\r
+ OnClick = Button5Click\r
+ end\r
+ object Button18: TButton\r
+ Left = 408\r
+ Top = 16\r
+ Width = 33\r
+ Height = 25\r
+ Caption = 'SMS'\r
+ TabOrder = 7\r
+ OnClick = Button18Click\r
+ end\r
+ object Button6: TButton\r
+ Left = 440\r
+ Top = 16\r
+ Width = 33\r
+ Height = 25\r
+ Hint = 'Set in phone'\r
+ Caption = 'Set'\r
+ TabOrder = 3\r
+ OnClick = Button6Click\r
+ end\r
+ object Button7: TButton\r
+ Left = 472\r
+ Top = 16\r
+ Width = 33\r
+ Height = 25\r
+ Hint = 'Get from phone'\r
+ Caption = 'Get'\r
+ TabOrder = 4\r
+ OnClick = Button7Click\r
+ end\r
+ object Button8: TButton\r
+ Left = 504\r
+ Top = 16\r
+ Width = 41\r
+ Height = 25\r
+ Hint = 'Clear in phone'\r
+ Caption = 'Clear'\r
+ ParentShowHint = False\r
+ ShowHint = True\r
+ TabOrder = 5\r
+ OnClick = Button8Click\r
+ end\r
+ end\r
+ end\r
+ object RingtonesTabSheet: TTabSheet\r
+ Caption = 'ring'\r
+ ImageIndex = 4\r
+ object GroupBox5: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Ringtones'\r
+ TabOrder = 0\r
+ object GroupBox15: TGroupBox\r
+ Left = 8\r
+ Top = 24\r
+ Width = 393\r
+ Height = 81\r
+ Caption = 'RTTL format'\r
+ TabOrder = 0\r
+ object Label11: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 31\r
+ Height = 13\r
+ Caption = 'Name:'\r
+ end\r
+ object Button1: TButton\r
+ Left = 184\r
+ Top = 48\r
+ Width = 97\r
+ Height = 25\r
+ Caption = 'Read from file'\r
+ TabOrder = 0\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 288\r
+ Top = 48\r
+ Width = 97\r
+ Height = 25\r
+ Caption = 'Set in phone'\r
+ TabOrder = 1\r
+ OnClick = Button2Click\r
+ end\r
+ object Button3: TButton\r
+ Left = 184\r
+ Top = 16\r
+ Width = 49\r
+ Height = 25\r
+ Caption = 'Play'\r
+ TabOrder = 2\r
+ OnClick = Button3Click\r
+ end\r
+ object Edit1: TEdit\r
+ Left = 48\r
+ Top = 16\r
+ Width = 113\r
+ Height = 21\r
+ TabOrder = 3\r
+ OnChange = Edit1Change\r
+ end\r
+ object Button16: TButton\r
+ Left = 240\r
+ Top = 16\r
+ Width = 41\r
+ Height = 25\r
+ Caption = 'Stop'\r
+ TabOrder = 4\r
+ OnClick = Button16Click\r
+ end\r
+ object Button17: TButton\r
+ Left = 288\r
+ Top = 16\r
+ Width = 97\r
+ Height = 25\r
+ Caption = 'SMS (Send/Save)'\r
+ TabOrder = 5\r
+ OnClick = Button17Click\r
+ end\r
+ end\r
+ object GroupBox16: TGroupBox\r
+ Left = 8\r
+ Top = 112\r
+ Width = 393\r
+ Height = 49\r
+ Caption = 'Binary format'\r
+ TabOrder = 1\r
+ object Label15: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 31\r
+ Height = 13\r
+ Caption = 'Name:'\r
+ end\r
+ object Button13: TButton\r
+ Left = 184\r
+ Top = 16\r
+ Width = 97\r
+ Height = 25\r
+ Caption = 'Read from file'\r
+ TabOrder = 0\r
+ OnClick = Button13Click\r
+ end\r
+ object Button14: TButton\r
+ Left = 288\r
+ Top = 16\r
+ Width = 97\r
+ Height = 25\r
+ Caption = 'Set in phone'\r
+ TabOrder = 1\r
+ OnClick = Button14Click\r
+ end\r
+ object Edit2: TEdit\r
+ Left = 48\r
+ Top = 16\r
+ Width = 113\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 2\r
+ end\r
+ end\r
+ object Button22: TButton\r
+ Left = 296\r
+ Top = 176\r
+ Width = 97\r
+ Height = 25\r
+ Caption = 'Get from phone'\r
+ TabOrder = 2\r
+ OnClick = Button22Click\r
+ end\r
+ end\r
+ end\r
+ object SMSTabSheet: TTabSheet\r
+ Caption = 'sms'\r
+ ImageIndex = 5\r
+ OnHide = SMSTabSheetHide\r
+ OnShow = SMSTabSheetShow\r
+ object GroupBox6: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'SMS'\r
+ TabOrder = 0\r
+ object Panel2: TPanel\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 26\r
+ Align = alTop\r
+ BevelOuter = bvNone\r
+ TabOrder = 0\r
+ object Label10: TLabel\r
+ Left = 8\r
+ Top = 0\r
+ Width = 29\r
+ Height = 13\r
+ Caption = 'Folder'\r
+ end\r
+ object ComboBox3: TComboBox\r
+ Left = 48\r
+ Top = 0\r
+ Width = 233\r
+ Height = 21\r
+ ItemHeight = 0\r
+ TabOrder = 0\r
+ Text = 'None'\r
+ OnChange = ComboBox3Change\r
+ end\r
+ end\r
+ object Panel3: TPanel\r
+ Left = 2\r
+ Top = 41\r
+ Width = 498\r
+ Height = 286\r
+ Align = alClient\r
+ BevelOuter = bvNone\r
+ Caption = 'Panel3'\r
+ TabOrder = 1\r
+ object Splitter2: TSplitter\r
+ Left = 0\r
+ Top = 96\r
+ Width = 498\r
+ Height = 5\r
+ Cursor = crVSplit\r
+ Align = alTop\r
+ end\r
+ object ListView2: TListView\r
+ Left = 0\r
+ Top = 0\r
+ Width = 498\r
+ Height = 96\r
+ Align = alTop\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ end\r
+ item\r
+ Caption = 'Text'\r
+ Width = 150\r
+ end\r
+ item\r
+ Caption = 'Sender'\r
+ Width = 150\r
+ end\r
+ item\r
+ Caption = 'Date'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Time'\r
+ Width = 80\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = SMSPopupMenu\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ OnSelectItem = ListView2SelectItem\r
+ end\r
+ object Memo1: TMemo\r
+ Left = 0\r
+ Top = 101\r
+ Width = 498\r
+ Height = 52\r
+ Align = alTop\r
+ BevelInner = bvNone\r
+ BevelOuter = bvNone\r
+ BorderStyle = bsNone\r
+ Color = clScrollBar\r
+ ReadOnly = True\r
+ TabOrder = 1\r
+ end\r
+ object Memo2: TMemo\r
+ Left = 0\r
+ Top = 153\r
+ Width = 498\r
+ Height = 133\r
+ Align = alClient\r
+ Lines.Strings = (\r
+ ''\r
+ 'Please click above to see SMS details')\r
+ ReadOnly = True\r
+ TabOrder = 2\r
+ end\r
+ end\r
+ end\r
+ end\r
+ object SpeedTabSheet: TTabSheet\r
+ Caption = 'speed'\r
+ ImageIndex = 6\r
+ OnHide = SpeedTabSheetHide\r
+ OnShow = SpeedTabSheetShow\r
+ object GroupBox7: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Speed dials'\r
+ TabOrder = 0\r
+ object ListView3: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 162\r
+ Align = alTop\r
+ Columns = <\r
+ item\r
+ Caption = 'Pos'\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 150\r
+ end\r
+ item\r
+ Caption = 'Number'\r
+ Width = 150\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ end\r
+ end\r
+ object CalendarTabSheet: TTabSheet\r
+ Caption = 'calendar'\r
+ ImageIndex = 7\r
+ OnHide = CalendarTabSheetHide\r
+ OnShow = CalendarTabSheetShow\r
+ object GroupBox8: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Calendar'\r
+ Ctl3D = True\r
+ ParentCtl3D = False\r
+ TabOrder = 0\r
+ object ListView4: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ Width = 35\r
+ end\r
+ item\r
+ Caption = 'Type'\r
+ Width = 40\r
+ end\r
+ item\r
+ Caption = 'Text'\r
+ Width = 125\r
+ end\r
+ item\r
+ Caption = 'Phone'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'Date'\r
+ Width = 130\r
+ end\r
+ item\r
+ Caption = 'Alarm'\r
+ Width = 130\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = CalendarPopupMenu\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ OnDblClick = ListView4DblClick\r
+ OnSelectItem = ListView4SelectItem\r
+ end\r
+ end\r
+ end\r
+ object SMSCTabSheet: TTabSheet\r
+ Caption = 'SMSC'\r
+ ImageIndex = 8\r
+ OnHide = SMSCTabSheetHide\r
+ OnShow = SMSCTabSheetShow\r
+ object GroupBox9: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'SMS Center'\r
+ TabOrder = 0\r
+ object ListView6: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 80\r
+ end\r
+ item\r
+ Caption = 'Number'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Validity'\r
+ Width = 90\r
+ end\r
+ item\r
+ Caption = 'Format'\r
+ Width = 80\r
+ end\r
+ item\r
+ Caption = 'Default recipient'\r
+ Width = 100\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = SMSCPopupMenu\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ OnSelectItem = ListView6SelectItem\r
+ end\r
+ end\r
+ end\r
+ object CallerTabSheet: TTabSheet\r
+ Caption = 'caller'\r
+ ImageIndex = 9\r
+ OnHide = CallerTabSheetHide\r
+ OnShow = CallerTabSheetShow\r
+ object GroupBox10: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Caller groups'\r
+ TabOrder = 0\r
+ object ListView5: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Ringtone'\r
+ Width = 80\r
+ end\r
+ item\r
+ Caption = 'Logo'\r
+ Width = 120\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ end\r
+ end\r
+ object ProfileTabSheet: TTabSheet\r
+ Caption = 'profile'\r
+ ImageIndex = 10\r
+ OnHide = ProfileTabSheetHide\r
+ OnShow = ProfileTabSheetShow\r
+ object GroupBox13: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Profiles'\r
+ TabOrder = 0\r
+ object ListView7: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ Width = 40\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'Incoming call'\r
+ Width = 80\r
+ end\r
+ item\r
+ Caption = 'Ringtone'\r
+ Width = 60\r
+ end\r
+ item\r
+ Caption = 'Ring volume'\r
+ Width = 80\r
+ end\r
+ item\r
+ Caption = 'Vibration'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'SMS tone'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'Key tone'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'Warning tone'\r
+ Width = 70\r
+ end\r
+ item\r
+ Caption = 'Alert for'\r
+ Width = 70\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ end\r
+ end\r
+ object WapBookTabSheet: TTabSheet\r
+ Caption = 'wap book'\r
+ ImageIndex = 11\r
+ OnHide = WapBookTabSheetHide\r
+ OnShow = WapBookTabSheetShow\r
+ object GroupBox17: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'WAP bookmarks'\r
+ TabOrder = 0\r
+ object ListView9: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'URL'\r
+ Width = 200\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = WAPBookPopupMenu\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ OnSelectItem = ListView9SelectItem\r
+ end\r
+ end\r
+ end\r
+ object ConfigTabSheet: TTabSheet\r
+ Caption = 'config'\r
+ ImageIndex = 12\r
+ OnHide = ConfigTabSheetHide\r
+ OnShow = ConfigTabSheetShow\r
+ object GroupBox18: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Configuration'\r
+ TabOrder = 0\r
+ object Label3: TLabel\r
+ Left = 8\r
+ Top = 40\r
+ Width = 80\r
+ Height = 13\r
+ Caption = 'Connection type:'\r
+ end\r
+ object Label12: TLabel\r
+ Left = 8\r
+ Top = 64\r
+ Width = 65\r
+ Height = 13\r
+ Caption = 'Phone model:'\r
+ end\r
+ object Label13: TLabel\r
+ Left = 8\r
+ Top = 96\r
+ Width = 22\r
+ Height = 13\r
+ Caption = 'Port:'\r
+ end\r
+ object ComboBox4: TComboBox\r
+ Left = 104\r
+ Top = 32\r
+ Width = 193\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 0\r
+ Text = 'FBUS cable'\r
+ Items.Strings = (\r
+ 'MBUS cable'\r
+ 'FBUS cable'\r
+ 'FBUS over DLR-3 cable'\r
+ 'Direct infrared')\r
+ end\r
+ object ComboBox5: TComboBox\r
+ Left = 104\r
+ Top = 96\r
+ Width = 193\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 1\r
+ TabOrder = 1\r
+ Text = 'com2:'\r
+ Items.Strings = (\r
+ 'com1:'\r
+ 'com2:'\r
+ 'com3:'\r
+ 'com4:'\r
+ 'com5:'\r
+ 'com6:'\r
+ 'com7:'\r
+ 'com8:')\r
+ end\r
+ object CheckBox2: TCheckBox\r
+ Left = 8\r
+ Top = 128\r
+ Width = 193\r
+ Height = 17\r
+ Caption = 'Synchronize time in phone from PC'\r
+ TabOrder = 2\r
+ end\r
+ object ComboBox6: TComboBox\r
+ Left = 104\r
+ Top = 64\r
+ Width = 193\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 3\r
+ Text = 'auto'\r
+ Items.Strings = (\r
+ 'auto'\r
+ 'modelauto'\r
+ '3210'\r
+ '3310'\r
+ '5110'\r
+ '5130'\r
+ '5190'\r
+ '6110'\r
+ '6130'\r
+ '6150'\r
+ '6190'\r
+ '6210'\r
+ '6250'\r
+ '7110'\r
+ '8210'\r
+ '8850'\r
+ '9110')\r
+ end\r
+ end\r
+ end\r
+ object WAPSettTabSheet: TTabSheet\r
+ Caption = 'WAPSett'\r
+ ImageIndex = 13\r
+ object GroupBox19: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'WAP Settings'\r
+ TabOrder = 0\r
+ object Label21: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 19\r
+ Height = 13\r
+ Caption = 'Set:'\r
+ end\r
+ object Label22: TLabel\r
+ Left = 8\r
+ Top = 56\r
+ Width = 23\r
+ Height = 13\r
+ Caption = 'Title:'\r
+ end\r
+ object Label23: TLabel\r
+ Left = 8\r
+ Top = 80\r
+ Width = 55\r
+ Height = 13\r
+ Caption = 'Homepage:'\r
+ end\r
+ object Label24: TLabel\r
+ Left = 8\r
+ Top = 104\r
+ Width = 34\r
+ Height = 13\r
+ Caption = 'Bearer:'\r
+ end\r
+ object Label25: TLabel\r
+ Left = 8\r
+ Top = 128\r
+ Width = 96\r
+ Height = 13\r
+ Caption = 'Connection security:'\r
+ end\r
+ object Label26: TLabel\r
+ Left = 8\r
+ Top = 152\r
+ Width = 80\r
+ Height = 13\r
+ Caption = 'Connection type:'\r
+ end\r
+ object Label27: TLabel\r
+ Left = 8\r
+ Top = 176\r
+ Width = 72\r
+ Height = 13\r
+ Caption = 'Server number:'\r
+ end\r
+ object Label28: TLabel\r
+ Left = 8\r
+ Top = 200\r
+ Width = 77\r
+ Height = 13\r
+ Caption = 'Service number:'\r
+ end\r
+ object Label29: TLabel\r
+ Left = 8\r
+ Top = 224\r
+ Width = 71\r
+ Height = 13\r
+ Caption = 'Dialup number:'\r
+ end\r
+ object Label30: TLabel\r
+ Left = 264\r
+ Top = 224\r
+ Width = 53\r
+ Height = 13\r
+ Caption = 'IP address:'\r
+ end\r
+ object Label31: TLabel\r
+ Left = 264\r
+ Top = 56\r
+ Width = 94\r
+ Height = 13\r
+ Caption = 'Authentication type:'\r
+ end\r
+ object Label32: TLabel\r
+ Left = 264\r
+ Top = 80\r
+ Width = 68\r
+ Height = 13\r
+ Caption = 'Data call type:'\r
+ end\r
+ object Label33: TLabel\r
+ Left = 264\r
+ Top = 104\r
+ Width = 77\r
+ Height = 13\r
+ Caption = 'Data call speed:'\r
+ end\r
+ object Label34: TLabel\r
+ Left = 264\r
+ Top = 128\r
+ Width = 54\r
+ Height = 13\r
+ Caption = 'User name:'\r
+ end\r
+ object Label35: TLabel\r
+ Left = 264\r
+ Top = 152\r
+ Width = 49\r
+ Height = 13\r
+ Caption = 'Password:'\r
+ end\r
+ object Label36: TLabel\r
+ Left = 264\r
+ Top = 176\r
+ Width = 66\r
+ Height = 13\r
+ Caption = 'Service code:'\r
+ end\r
+ object Label37: TLabel\r
+ Left = 264\r
+ Top = 200\r
+ Width = 64\r
+ Height = 13\r
+ Caption = 'Address type:'\r
+ end\r
+ object ComboBox7: TComboBox\r
+ Left = 112\r
+ Top = 16\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 0\r
+ Text = 'None'\r
+ OnChange = ComboBox7Change\r
+ Items.Strings = (\r
+ 'None'\r
+ 'Set 1'\r
+ 'Set 2'\r
+ 'Set 3'\r
+ 'Set 4'\r
+ 'Set 5')\r
+ end\r
+ object Edit6: TEdit\r
+ Left = 112\r
+ Top = 56\r
+ Width = 145\r
+ Height = 21\r
+ ParentShowHint = False\r
+ ReadOnly = True\r
+ ShowHint = True\r
+ TabOrder = 1\r
+ end\r
+ object Edit8: TEdit\r
+ Left = 112\r
+ Top = 80\r
+ Width = 145\r
+ Height = 21\r
+ ParentShowHint = False\r
+ ReadOnly = True\r
+ ShowHint = True\r
+ TabOrder = 2\r
+ end\r
+ object ComboBox8: TComboBox\r
+ Left = 112\r
+ Top = 104\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 3\r
+ Text = 'SMS'\r
+ Items.Strings = (\r
+ 'SMS'\r
+ 'Data (CSD)'\r
+ 'USSD')\r
+ end\r
+ object ComboBox9: TComboBox\r
+ Left = 112\r
+ Top = 128\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 4\r
+ Text = 'On'\r
+ Items.Strings = (\r
+ 'On'\r
+ 'Off')\r
+ end\r
+ object ComboBox10: TComboBox\r
+ Left = 112\r
+ Top = 152\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 5\r
+ Text = 'continuous'\r
+ Items.Strings = (\r
+ 'continuous'\r
+ 'temporary')\r
+ end\r
+ object Edit9: TEdit\r
+ Left = 112\r
+ Top = 176\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 6\r
+ end\r
+ object Edit10: TEdit\r
+ Left = 112\r
+ Top = 200\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 7\r
+ end\r
+ object Edit11: TEdit\r
+ Left = 112\r
+ Top = 224\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 8\r
+ end\r
+ object Edit12: TEdit\r
+ Left = 360\r
+ Top = 224\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 9\r
+ end\r
+ object ComboBox11: TComboBox\r
+ Left = 360\r
+ Top = 56\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 10\r
+ Text = 'normal'\r
+ Items.Strings = (\r
+ 'normal'\r
+ 'secure')\r
+ end\r
+ object ComboBox12: TComboBox\r
+ Left = 360\r
+ Top = 80\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 11\r
+ Text = 'ISDN'\r
+ Items.Strings = (\r
+ 'ISDN'\r
+ 'analogue')\r
+ end\r
+ object ComboBox13: TComboBox\r
+ Left = 360\r
+ Top = 104\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 12\r
+ Text = '9600'\r
+ Items.Strings = (\r
+ '9600'\r
+ '14400')\r
+ end\r
+ object Edit13: TEdit\r
+ Left = 360\r
+ Top = 128\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 13\r
+ end\r
+ object Edit14: TEdit\r
+ Left = 360\r
+ Top = 152\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 14\r
+ end\r
+ object Edit15: TEdit\r
+ Left = 360\r
+ Top = 176\r
+ Width = 145\r
+ Height = 21\r
+ ReadOnly = True\r
+ TabOrder = 15\r
+ end\r
+ object ComboBox14: TComboBox\r
+ Left = 360\r
+ Top = 200\r
+ Width = 145\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 16\r
+ Text = 'IP address'\r
+ Items.Strings = (\r
+ 'IP address'\r
+ 'service number')\r
+ end\r
+ object Button23: TButton\r
+ Left = 360\r
+ Top = 16\r
+ Width = 105\r
+ Height = 25\r
+ Caption = 'SMS (Send/Save)'\r
+ TabOrder = 17\r
+ OnClick = Button23Click\r
+ end\r
+ end\r
+ end\r
+ object DivertTabSheet: TTabSheet\r
+ Caption = 'Divert'\r
+ ImageIndex = 14\r
+ object GroupBox20: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Call diverts'\r
+ TabOrder = 0\r
+ object PageControl2: TPageControl\r
+ Left = 8\r
+ Top = 24\r
+ Width = 449\r
+ Height = 169\r
+ ActivePage = TabSheet1\r
+ TabIndex = 0\r
+ TabOrder = 0\r
+ object TabSheet1: TTabSheet\r
+ Caption = 'Voice'\r
+ object Label38: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 85\r
+ Height = 13\r
+ Caption = 'Divert when busy:'\r
+ Enabled = False\r
+ end\r
+ object Label39: TLabel\r
+ Left = 8\r
+ Top = 40\r
+ Width = 127\r
+ Height = 13\r
+ Caption = 'Divert when not answered:'\r
+ Enabled = False\r
+ end\r
+ object Label40: TLabel\r
+ Left = 288\r
+ Top = 40\r
+ Width = 30\r
+ Height = 13\r
+ Caption = 'Delay:'\r
+ Enabled = False\r
+ end\r
+ object Label41: TLabel\r
+ Left = 8\r
+ Top = 64\r
+ Width = 99\r
+ Height = 13\r
+ Caption = 'Divert if out of reach:'\r
+ Enabled = False\r
+ end\r
+ object Button19: TButton\r
+ Left = 8\r
+ Top = 104\r
+ Width = 73\r
+ Height = 25\r
+ Caption = 'Check all'\r
+ TabOrder = 0\r
+ OnClick = Button19Click\r
+ end\r
+ object Edit16: TEdit\r
+ Left = 144\r
+ Top = 16\r
+ Width = 137\r
+ Height = 21\r
+ Enabled = False\r
+ ReadOnly = True\r
+ TabOrder = 1\r
+ end\r
+ object Edit17: TEdit\r
+ Left = 144\r
+ Top = 40\r
+ Width = 137\r
+ Height = 21\r
+ Enabled = False\r
+ ReadOnly = True\r
+ TabOrder = 2\r
+ end\r
+ object ComboBox15: TComboBox\r
+ Left = 328\r
+ Top = 40\r
+ Width = 105\r
+ Height = 21\r
+ Enabled = False\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 3\r
+ Text = '5 seconds'\r
+ Items.Strings = (\r
+ '5 seconds'\r
+ '10 seconds'\r
+ '15 seconds'\r
+ '20 seconds'\r
+ '25 seconds'\r
+ '30 seconds')\r
+ end\r
+ object Edit18: TEdit\r
+ Left = 144\r
+ Top = 64\r
+ Width = 137\r
+ Height = 21\r
+ Enabled = False\r
+ ReadOnly = True\r
+ TabOrder = 4\r
+ end\r
+ end\r
+ object TabSheet2: TTabSheet\r
+ Caption = 'Fax'\r
+ ImageIndex = 1\r
+ end\r
+ object TabSheet3: TTabSheet\r
+ Caption = 'Data'\r
+ ImageIndex = 2\r
+ end\r
+ end\r
+ object Button20: TButton\r
+ Left = 20\r
+ Top = 208\r
+ Width = 73\r
+ Height = 25\r
+ Caption = 'Cancel all'\r
+ TabOrder = 1\r
+ OnClick = Button20Click\r
+ end\r
+ end\r
+ end\r
+ object AboutTabSheet: TTabSheet\r
+ Caption = 'AboutTabSheet'\r
+ ImageIndex = 15\r
+ OnShow = AboutTabSheetShow\r
+ object GroupBox21: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'About'\r
+ TabOrder = 0\r
+ object Label19: TLabel\r
+ Left = 8\r
+ Top = 304\r
+ Width = 106\r
+ Height = 13\r
+ Caption = 'Mygnokii DLL Version:'\r
+ end\r
+ object Label20: TLabel\r
+ Left = 120\r
+ Top = 304\r
+ Width = 38\r
+ Height = 13\r
+ Caption = 'Label20'\r
+ end\r
+ object Memo3: TMemo\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 282\r
+ Align = alTop\r
+ Lines.Strings = (\r
+ \r
+ 'This is testing version of non-commercional tool, which will all' +\r
+ 'ow to use functions'\r
+ 'available in various cellular phones.'\r
+ 'In this moment you shouldn'#39't have big problems with using'\r
+ \r
+ 'Nokia 3210, 33xx, 5110, 5130, 5190, 6110, 6130, 6150, 6190, 6210' +\r
+ ', 6250, 7110,'\r
+ '8210, 8850, 9110 with this software.'\r
+ 'There are supported MBUS, FBUS, DLR3 cables and direct infrared'\r
+ \r
+ '(for 61xx from main menu, in 8210/8850 from 2 players snake menu' +\r
+ ').'\r
+ ''\r
+ \r
+ 'You use it on your risk. Some functions can not work or work inc' +\r
+ 'orrectly.'\r
+ ''\r
+ 'If you have questions or want to help in improving it,'\r
+ 'please email to marcin-wiacek@topnet.pl.'\r
+ 'Do not forget also to send bug reports ;-).'\r
+ ''\r
+ \r
+ 'Latest versions (with full source) are on http://marcin-wiacek.t' +\r
+ 'opnet.pl.'\r
+ \r
+ 'There are also available releases for various Unix (Linux) versi' +\r
+ 'ons.'\r
+ \r
+ '----------------------------------------------------------------' +\r
+ '--------------------------------'\r
+ 'History:'\r
+ ''\r
+ 'Version 0.1:'\r
+ \r
+ '1.projected windows structures. Many functions works, but with e' +\r
+ 'rrors'\r
+ ''\r
+ 'Vestion 0.2:'\r
+ '1.added many new functions (WAP, PC, etc.)'\r
+ '2.removed many bugs, improved stability'\r
+ '3.6210 compatibility'\r
+ '4.config sheet available'\r
+ ''\r
+ 'Version 0.3:'\r
+ '1.almost everything provided'\r
+ '2.everything important can be edited'\r
+ ''\r
+ 'TODO:'\r
+ '1.better error handling'\r
+ '2.support for new models'\r
+ '3.extending support to new models in gnokiiapi.dll'\r
+ '4.synchronization tools with Outlook, etc.')\r
+ ReadOnly = True\r
+ ScrollBars = ssVertical\r
+ TabOrder = 0\r
+ end\r
+ end\r
+ end\r
+ object PCSMSTabSheet: TTabSheet\r
+ Caption = 'PCSMS'\r
+ ImageIndex = 16\r
+ OnShow = PCSMSTabSheetShow\r
+ object GroupBox22: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'SMS Offline'\r
+ TabOrder = 0\r
+ object Splitter3: TSplitter\r
+ Left = 2\r
+ Top = 160\r
+ Width = 498\r
+ Height = 2\r
+ Cursor = crVSplit\r
+ Align = alTop\r
+ end\r
+ object Panel4: TPanel\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 145\r
+ Align = alTop\r
+ BevelOuter = bvNone\r
+ Caption = 'Panel4'\r
+ TabOrder = 0\r
+ object ListView10: TListView\r
+ Left = 0\r
+ Top = 0\r
+ Width = 498\r
+ Height = 145\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ Width = 40\r
+ end\r
+ item\r
+ Caption = 'Text'\r
+ Width = 160\r
+ end\r
+ item\r
+ Caption = 'Sender'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Date'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Time'\r
+ Width = 100\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = PCSMSPopupMenu\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ OnSelectItem = ListView10SelectItem\r
+ end\r
+ end\r
+ object Panel5: TPanel\r
+ Left = 2\r
+ Top = 162\r
+ Width = 498\r
+ Height = 165\r
+ Align = alClient\r
+ BevelOuter = bvNone\r
+ Caption = 'Panel5'\r
+ TabOrder = 1\r
+ object Memo4: TMemo\r
+ Left = 0\r
+ Top = 0\r
+ Width = 498\r
+ Height = 49\r
+ Align = alTop\r
+ BevelInner = bvNone\r
+ BevelOuter = bvNone\r
+ BorderStyle = bsNone\r
+ Color = clScrollBar\r
+ ReadOnly = True\r
+ TabOrder = 0\r
+ end\r
+ object Memo5: TMemo\r
+ Left = 0\r
+ Top = 49\r
+ Width = 498\r
+ Height = 116\r
+ Align = alClient\r
+ ReadOnly = True\r
+ TabOrder = 1\r
+ end\r
+ end\r
+ end\r
+ end\r
+ object PCCalendarTabSheet: TTabSheet\r
+ Caption = 'PCCalendar'\r
+ ImageIndex = 17\r
+ OnShow = PCCalendarTabSheetShow\r
+ object GroupBox23: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Calendar offline'\r
+ TabOrder = 0\r
+ object ListView11: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ Width = 40\r
+ end\r
+ item\r
+ Caption = 'Type'\r
+ end\r
+ item\r
+ Caption = 'Text'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Phone'\r
+ Width = 80\r
+ end\r
+ item\r
+ Caption = 'Date'\r
+ Width = 110\r
+ end\r
+ item\r
+ Caption = 'Alarm'\r
+ Width = 110\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ PopupMenu = PCCalendarPopupMenu\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ end\r
+ end\r
+ object PCOfflineTabSheet: TTabSheet\r
+ Caption = 'PCOfflineTabSheet'\r
+ ImageIndex = 18\r
+ OnShow = PCOfflineTabSheetShow\r
+ object GroupBox24: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Offline'\r
+ TabOrder = 0\r
+ object Label42: TLabel\r
+ Left = 8\r
+ Top = 24\r
+ Width = 59\r
+ Height = 13\r
+ Caption = 'Offline SMS:'\r
+ end\r
+ object Label43: TLabel\r
+ Left = 96\r
+ Top = 24\r
+ Width = 38\r
+ Height = 13\r
+ Caption = 'Label43'\r
+ end\r
+ object Label44: TLabel\r
+ Left = 8\r
+ Top = 48\r
+ Width = 77\r
+ Height = 13\r
+ Caption = 'Offline calendar:'\r
+ end\r
+ object Label45: TLabel\r
+ Left = 96\r
+ Top = 48\r
+ Width = 38\r
+ Height = 13\r
+ Caption = 'Label45'\r
+ end\r
+ end\r
+ end\r
+ object PCPBKTabSheet: TTabSheet\r
+ Caption = 'PBKOffline'\r
+ ImageIndex = 19\r
+ OnShow = PCPBKTabSheetShow\r
+ object GroupBox25: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 502\r
+ Height = 329\r
+ Align = alClient\r
+ Caption = 'Phonebook offline'\r
+ TabOrder = 0\r
+ object ListView12: TListView\r
+ Left = 2\r
+ Top = 15\r
+ Width = 498\r
+ Height = 312\r
+ Align = alClient\r
+ Columns = <\r
+ item\r
+ Caption = 'Num'\r
+ end\r
+ item\r
+ Caption = 'Name'\r
+ Width = 150\r
+ end\r
+ item\r
+ Caption = 'Number'\r
+ Width = 150\r
+ end>\r
+ ColumnClick = False\r
+ GridLines = True\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ end\r
+ end\r
+ end\r
+ object MainMenu1: TMainMenu\r
+ Left = 72\r
+ Top = 344\r
+ object File1: TMenuItem\r
+ Caption = 'File'\r
+ object Savebackuptofile1: TMenuItem\r
+ Caption = 'Save backup to file/another application'\r
+ OnClick = Savebackuptofile1Click\r
+ end\r
+ object Restorebackupfromfile1: TMenuItem\r
+ Caption = 'Restore backup from file/another application'\r
+ OnClick = Restorebackupfromfile1Click\r
+ end\r
+ object N6: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object Configuration1: TMenuItem\r
+ Caption = 'Configuration'\r
+ OnClick = Configuration1Click\r
+ end\r
+ object N1: TMenuItem\r
+ Caption = '-'\r
+ Visible = False\r
+ end\r
+ object Quit1: TMenuItem\r
+ Caption = 'Quit'\r
+ OnClick = Quit1Click\r
+ end\r
+ end\r
+ object Help1: TMenuItem\r
+ Caption = 'Help'\r
+ object About1: TMenuItem\r
+ Caption = 'About'\r
+ OnClick = About1Click\r
+ end\r
+ end\r
+ end\r
+ object Timer1: TTimer\r
+ Interval = 500\r
+ OnTimer = Timer1Timer\r
+ Left = 136\r
+ Top = 344\r
+ end\r
+ object OpenDialog1: TOpenDialog\r
+ Options = [ofHideReadOnly, ofPathMustExist, ofFileMustExist, ofEnableSizing]\r
+ Left = 8\r
+ Top = 344\r
+ end\r
+ object SaveDialog1: TSaveDialog\r
+ Options = [ofOverwritePrompt, ofHideReadOnly, ofEnableSizing]\r
+ Left = 40\r
+ Top = 344\r
+ end\r
+ object CalendarPopupMenu: TPopupMenu\r
+ OnPopup = CalendarPopupMenuPopup\r
+ Left = 264\r
+ Top = 344\r
+ object New1: TMenuItem\r
+ Caption = 'New'\r
+ OnClick = New1Click\r
+ end\r
+ object Edit3: TMenuItem\r
+ Caption = 'Edit'\r
+ OnClick = Edit3Click\r
+ end\r
+ object Delete1: TMenuItem\r
+ Caption = 'Delete'\r
+ OnClick = Delete1Click\r
+ end\r
+ object SMS1: TMenuItem\r
+ Caption = 'SMS (Send/Save)'\r
+ OnClick = SMS1Click\r
+ end\r
+ object N4: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object CopytoPC2: TMenuItem\r
+ Caption = 'Copy to PC'\r
+ OnClick = CopytoPC2Click\r
+ end\r
+ end\r
+ object SMSPopupMenu: TPopupMenu\r
+ OnPopup = SMSPopupMenuPopup\r
+ Left = 200\r
+ Top = 344\r
+ object New2: TMenuItem\r
+ Caption = 'New (Send/Save)'\r
+ OnClick = New2Click\r
+ end\r
+ object Edit4: TMenuItem\r
+ Caption = 'Edit (Send/Save)'\r
+ OnClick = Edit4Click\r
+ end\r
+ object Delete2: TMenuItem\r
+ Caption = 'Delete'\r
+ OnClick = Delete2Click\r
+ end\r
+ object N2: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object CopytoPC1: TMenuItem\r
+ Caption = 'Copy to PC'\r
+ OnClick = CopytoPC1Click\r
+ end\r
+ end\r
+ object SMSCPopupMenu: TPopupMenu\r
+ OnPopup = SMSCPopupMenuPopup\r
+ Left = 232\r
+ Top = 344\r
+ object Edit5: TMenuItem\r
+ Caption = 'Edit'\r
+ OnClick = Edit5Click\r
+ end\r
+ end\r
+ object PBKPopupMenu: TPopupMenu\r
+ OnPopup = PBKPopupMenuPopup\r
+ Left = 296\r
+ Top = 344\r
+ object Delete4: TMenuItem\r
+ Caption = 'Delete'\r
+ OnClick = Delete4Click\r
+ end\r
+ object Edit19: TMenuItem\r
+ Caption = 'Edit'\r
+ OnClick = Edit19Click\r
+ end\r
+ object Edit7: TMenuItem\r
+ Caption = 'View'\r
+ OnClick = Edit7Click\r
+ end\r
+ object N10: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object SMSSendSave1: TMenuItem\r
+ Caption = 'SMS (Send/Save)'\r
+ OnClick = SMSSendSave1Click\r
+ end\r
+ object N7: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object CopyphonebooktoPC1: TMenuItem\r
+ Caption = 'Copy phonebook to PC'\r
+ OnClick = CopyphonebooktoPC1Click\r
+ end\r
+ object Savephonebooktofileanotherapplication1: TMenuItem\r
+ Caption = 'Save phonebook to file/another application'\r
+ OnClick = Savephonebooktofileanotherapplication1Click\r
+ end\r
+ end\r
+ object Timer2: TTimer\r
+ Interval = 2000\r
+ OnTimer = Timer2Timer\r
+ Left = 104\r
+ Top = 344\r
+ end\r
+ object PCSMSPopupMenu: TPopupMenu\r
+ OnPopup = PCSMSPopupMenuPopup\r
+ Left = 328\r
+ Top = 344\r
+ object SendSave1: TMenuItem\r
+ Caption = 'SMS (Send/Save)'\r
+ OnClick = SendSave1Click\r
+ end\r
+ object N3: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object Delete3: TMenuItem\r
+ Caption = 'Delete'\r
+ OnClick = Delete3Click\r
+ end\r
+ end\r
+ object PCCalendarPopupMenu: TPopupMenu\r
+ OnPopup = PCCalendarPopupMenuPopup\r
+ Left = 168\r
+ Top = 344\r
+ object Copytocalendar1: TMenuItem\r
+ Caption = 'Copy to phone'\r
+ OnClick = Copytocalendar1Click\r
+ end\r
+ object N5: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object Delete5: TMenuItem\r
+ Caption = 'Delete'\r
+ OnClick = Delete5Click\r
+ end\r
+ end\r
+ object WAPBookPopupMenu: TPopupMenu\r
+ OnPopup = WAPBookPopupMenuPopup\r
+ Left = 360\r
+ Top = 344\r
+ object New20: TMenuItem\r
+ Caption = 'New'\r
+ OnClick = New20Click\r
+ end\r
+ object Edit20: TMenuItem\r
+ Caption = 'Edit'\r
+ OnClick = Edit20Click\r
+ end\r
+ object N8: TMenuItem\r
+ Caption = '-'\r
+ end\r
+ object SMSSendSave2: TMenuItem\r
+ Caption = 'SMS (Send/Save)'\r
+ OnClick = SMSSendSave2Click\r
+ end\r
+ end\r
+end\r
--- /dev/null
+unit MainUnit;\r
+\r
+interface\r
+\r
+{$I-}\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,\r
+ Dialogs, ComCtrls, GnokiiAPI, ExtCtrls, Menus, StdCtrls, Spin, IniFiles;\r
+\r
+type\r
+ TMainForm = class(TForm)\r
+ StatusBar1: TStatusBar;\r
+ TreeView1: TTreeView;\r
+ Splitter1: TSplitter;\r
+ MainMenu1: TMainMenu;\r
+ File1: TMenuItem;\r
+ Quit1: TMenuItem;\r
+ Help1: TMenuItem;\r
+ About1: TMenuItem;\r
+ Timer1: TTimer;\r
+ OpenDialog1: TOpenDialog;\r
+ SaveDialog1: TSaveDialog;\r
+ PageControl1: TPageControl;\r
+ NetmonitorTabSheet: TTabSheet;\r
+ GroupBox1: TGroupBox;\r
+ Label1: TLabel;\r
+ NetmonGroupBox: TGroupBox;\r
+ NetmonLabel: TLabel;\r
+ SpinEdit1: TSpinEdit;\r
+ Button11: TButton;\r
+ PhonebookTabSheet: TTabSheet;\r
+ GroupBox2: TGroupBox;\r
+ Panel1: TPanel;\r
+ Label2: TLabel;\r
+ ComboBox1: TComboBox;\r
+ ListView1: TListView;\r
+ PhoneTabSheet: TTabSheet;\r
+ GroupBox3: TGroupBox;\r
+ GroupBox12: TGroupBox;\r
+ Label4: TLabel;\r
+ Label5: TLabel;\r
+ Label7: TLabel;\r
+ Label8: TLabel;\r
+ Label9: TLabel;\r
+ Label6: TLabel;\r
+ Button9: TButton;\r
+ GroupBox14: TGroupBox;\r
+ ListView8: TListView;\r
+ GroupBox11: TGroupBox;\r
+ CheckBox1: TCheckBox;\r
+ LogosTabSheet: TTabSheet;\r
+ GroupBox4: TGroupBox;\r
+ LogosImage: TImage;\r
+ Image1: TImage;\r
+ Image2: TImage;\r
+ ComboBox2: TComboBox;\r
+ Button6: TButton;\r
+ Button7: TButton;\r
+ Button8: TButton;\r
+ Button12: TButton;\r
+ Button4: TButton;\r
+ Button5: TButton;\r
+ RingtonesTabSheet: TTabSheet;\r
+ GroupBox5: TGroupBox;\r
+ Label11: TLabel;\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ Button3: TButton;\r
+ SMSTabSheet: TTabSheet;\r
+ GroupBox6: TGroupBox;\r
+ Panel2: TPanel;\r
+ Label10: TLabel;\r
+ ComboBox3: TComboBox;\r
+ ListView2: TListView;\r
+ SpeedTabSheet: TTabSheet;\r
+ GroupBox7: TGroupBox;\r
+ ListView3: TListView;\r
+ CalendarTabSheet: TTabSheet;\r
+ GroupBox8: TGroupBox;\r
+ ListView4: TListView;\r
+ SMSCTabSheet: TTabSheet;\r
+ GroupBox9: TGroupBox;\r
+ ListView6: TListView;\r
+ CallerTabSheet: TTabSheet;\r
+ GroupBox10: TGroupBox;\r
+ ListView5: TListView;\r
+ ProfileTabSheet: TTabSheet;\r
+ GroupBox13: TGroupBox;\r
+ ListView7: TListView;\r
+ Panel3: TPanel;\r
+ Splitter2: TSplitter;\r
+ GroupBox15: TGroupBox;\r
+ GroupBox16: TGroupBox;\r
+ Button13: TButton;\r
+ Button14: TButton;\r
+ Label15: TLabel;\r
+ Edit1: TEdit;\r
+ Edit2: TEdit;\r
+ Button16: TButton;\r
+ CalendarPopupMenu: TPopupMenu;\r
+ New1: TMenuItem;\r
+ Edit3: TMenuItem;\r
+ Delete1: TMenuItem;\r
+ SMSPopupMenu: TPopupMenu;\r
+ Edit4: TMenuItem;\r
+ Memo1: TMemo;\r
+ Memo2: TMemo;\r
+ New2: TMenuItem;\r
+ Label14: TLabel;\r
+ Label16: TLabel;\r
+ WapBookTabSheet: TTabSheet;\r
+ GroupBox17: TGroupBox;\r
+ DateTimePicker1: TDateTimePicker;\r
+ ConfigTabSheet: TTabSheet;\r
+ GroupBox18: TGroupBox;\r
+ Configuration1: TMenuItem;\r
+ N1: TMenuItem;\r
+ Delete2: TMenuItem;\r
+ SMSCPopupMenu: TPopupMenu;\r
+ Edit5: TMenuItem;\r
+ Label3: TLabel;\r
+ ComboBox4: TComboBox;\r
+ Label12: TLabel;\r
+ ComboBox5: TComboBox;\r
+ Label13: TLabel;\r
+ CheckBox2: TCheckBox;\r
+ Label17: TLabel;\r
+ Label18: TLabel;\r
+ PBKPopupMenu: TPopupMenu;\r
+ Edit7: TMenuItem;\r
+ Button17: TButton;\r
+ SMS1: TMenuItem;\r
+ Button18: TButton;\r
+ SMSSendSave1: TMenuItem;\r
+ ComboBox6: TComboBox;\r
+ WAPSettTabSheet: TTabSheet;\r
+ DivertTabSheet: TTabSheet;\r
+ GroupBox19: TGroupBox;\r
+ GroupBox20: TGroupBox;\r
+ Timer2: TTimer;\r
+ ListView9: TListView;\r
+ AboutTabSheet: TTabSheet;\r
+ GroupBox21: TGroupBox;\r
+ Label19: TLabel;\r
+ Label20: TLabel;\r
+ PCSMSTabSheet: TTabSheet;\r
+ GroupBox22: TGroupBox;\r
+ Panel4: TPanel;\r
+ Splitter3: TSplitter;\r
+ Panel5: TPanel;\r
+ ListView10: TListView;\r
+ CopytoPC1: TMenuItem;\r
+ N2: TMenuItem;\r
+ Memo4: TMemo;\r
+ Memo5: TMemo;\r
+ PCSMSPopupMenu: TPopupMenu;\r
+ SendSave1: TMenuItem;\r
+ N3: TMenuItem;\r
+ Delete3: TMenuItem;\r
+ Label21: TLabel;\r
+ ComboBox7: TComboBox;\r
+ Label22: TLabel;\r
+ Edit6: TEdit;\r
+ Label23: TLabel;\r
+ Edit8: TEdit;\r
+ Label24: TLabel;\r
+ ComboBox8: TComboBox;\r
+ Label25: TLabel;\r
+ ComboBox9: TComboBox;\r
+ Label26: TLabel;\r
+ ComboBox10: TComboBox;\r
+ Label27: TLabel;\r
+ Edit9: TEdit;\r
+ Label28: TLabel;\r
+ Edit10: TEdit;\r
+ Label29: TLabel;\r
+ Edit11: TEdit;\r
+ Label30: TLabel;\r
+ Edit12: TEdit;\r
+ Label31: TLabel;\r
+ ComboBox11: TComboBox;\r
+ Label32: TLabel;\r
+ ComboBox12: TComboBox;\r
+ Label33: TLabel;\r
+ ComboBox13: TComboBox;\r
+ Label34: TLabel;\r
+ Edit13: TEdit;\r
+ Label35: TLabel;\r
+ Edit14: TEdit;\r
+ Label36: TLabel;\r
+ Edit15: TEdit;\r
+ Label37: TLabel;\r
+ ComboBox14: TComboBox;\r
+ Memo3: TMemo;\r
+ PageControl2: TPageControl;\r
+ TabSheet1: TTabSheet;\r
+ Button19: TButton;\r
+ Label38: TLabel;\r
+ Edit16: TEdit;\r
+ Label39: TLabel;\r
+ Edit17: TEdit;\r
+ Label40: TLabel;\r
+ ComboBox15: TComboBox;\r
+ Label41: TLabel;\r
+ Edit18: TEdit;\r
+ Button20: TButton;\r
+ PCCalendarTabSheet: TTabSheet;\r
+ GroupBox23: TGroupBox;\r
+ ListView11: TListView;\r
+ N4: TMenuItem;\r
+ CopytoPC2: TMenuItem;\r
+ PCCalendarPopupMenu: TPopupMenu;\r
+ Copytocalendar1: TMenuItem;\r
+ N5: TMenuItem;\r
+ Delete5: TMenuItem;\r
+ PCOfflineTabSheet: TTabSheet;\r
+ GroupBox24: TGroupBox;\r
+ Label42: TLabel;\r
+ Label43: TLabel;\r
+ Label44: TLabel;\r
+ Label45: TLabel;\r
+ TabSheet2: TTabSheet;\r
+ TabSheet3: TTabSheet;\r
+ N6: TMenuItem;\r
+ Savebackuptofile1: TMenuItem;\r
+ Restorebackupfromfile1: TMenuItem;\r
+ N7: TMenuItem;\r
+ Savephonebooktofileanotherapplication1: TMenuItem;\r
+ PCPBKTabSheet: TTabSheet;\r
+ GroupBox25: TGroupBox;\r
+ ListView12: TListView;\r
+ Edit19: TMenuItem;\r
+ N10: TMenuItem;\r
+ Delete4: TMenuItem;\r
+ Button22: TButton;\r
+ WAPBookPopupMenu: TPopupMenu;\r
+ New20: TMenuItem;\r
+ SMSSendSave2: TMenuItem;\r
+ N8: TMenuItem;\r
+ Edit20: TMenuItem;\r
+ Button23: TButton;\r
+ CopyphonebooktoPC1: TMenuItem;\r
+ procedure TreeView1MouseDown(Sender: TObject; Button: TMouseButton;\r
+ Shift: TShiftState; X, Y: Integer);\r
+ procedure FormCreate(Sender: TObject);\r
+ procedure Timer1Timer(Sender: TObject);\r
+ procedure NetmonitorTabSheetShow(Sender: TObject);\r
+ procedure NetmonitorTabSheetHide(Sender: TObject);\r
+ procedure SpinEdit1Change(Sender: TObject);\r
+ procedure ComboBox1Change(Sender: TObject);\r
+ procedure PhonebookTabSheetHide(Sender: TObject);\r
+ procedure Quit1Click(Sender: TObject);\r
+ procedure FormResize(Sender: TObject);\r
+ procedure About1Click(Sender: TObject);\r
+ procedure LogosImageMouseMove(Sender: TObject; Shift: TShiftState; X,\r
+ Y: Integer);\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure Button4Click(Sender: TObject);\r
+ procedure Button3Click(Sender: TObject);\r
+ procedure PhoneTabSheetShow(Sender: TObject);\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure LogosTabSheetShow(Sender: TObject);\r
+ procedure ComboBox2Select(Sender: TObject);\r
+ procedure Button7Click(Sender: TObject);\r
+ procedure LogosImageMouseDown(Sender: TObject; Button: TMouseButton;\r
+ Shift: TShiftState; X, Y: Integer);\r
+ procedure Button6Click(Sender: TObject);\r
+ procedure Button5Click(Sender: TObject);\r
+ procedure Button8Click(Sender: TObject);\r
+ procedure SpeedTabSheetShow(Sender: TObject);\r
+ procedure Button9Click(Sender: TObject);\r
+ procedure SpeedTabSheetHide(Sender: TObject);\r
+ procedure Button11Click(Sender: TObject);\r
+ procedure Button12Click(Sender: TObject);\r
+ procedure CalendarTabSheetShow(Sender: TObject);\r
+ procedure CallerTabSheetShow(Sender: TObject);\r
+ procedure SMSCTabSheetShow(Sender: TObject);\r
+ procedure Button10Click(Sender: TObject);\r
+ procedure ProfileTabSheetShow(Sender: TObject);\r
+ procedure SMSCTabSheetHide(Sender: TObject);\r
+ procedure CalendarTabSheetHide(Sender: TObject);\r
+ procedure CallerTabSheetHide(Sender: TObject);\r
+ procedure ProfileTabSheetHide(Sender: TObject);\r
+ procedure PhonebookTabSheetShow(Sender: TObject);\r
+ procedure SMSTabSheetShow(Sender: TObject);\r
+ procedure ComboBox3Change(Sender: TObject);\r
+ procedure ListView2SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+ procedure New1Click(Sender: TObject);\r
+ procedure Edit3Click(Sender: TObject);\r
+ procedure ListView4SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+ procedure Delete1Click(Sender: TObject);\r
+ procedure Button16Click(Sender: TObject);\r
+ procedure Edit4Click(Sender: TObject);\r
+ procedure New2Click(Sender: TObject);\r
+ procedure Configuration1Click(Sender: TObject);\r
+ procedure TreeView1KeyUp(Sender: TObject; var Key: Word;\r
+ Shift: TShiftState);\r
+ procedure SMSTabSheetHide(Sender: TObject);\r
+ procedure SMSPopupMenuPopup(Sender: TObject);\r
+ procedure CalendarPopupMenuPopup(Sender: TObject);\r
+ procedure Edit1Change(Sender: TObject);\r
+ procedure Delete2Click(Sender: TObject);\r
+ procedure Edit5Click(Sender: TObject);\r
+ procedure Image1MouseDown(Sender: TObject; Button: TMouseButton;\r
+ Shift: TShiftState; X, Y: Integer);\r
+ procedure SMSCPopupMenuPopup(Sender: TObject);\r
+ procedure ListView6SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+ procedure ListView1SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+ procedure Edit7Click(Sender: TObject);\r
+ procedure Button18Click(Sender: TObject);\r
+ procedure Button17Click(Sender: TObject);\r
+ procedure SMS1Click(Sender: TObject);\r
+ procedure SMSSendSave1Click(Sender: TObject);\r
+ procedure Button13Click(Sender: TObject);\r
+ procedure Button14Click(Sender: TObject);\r
+ procedure ConfigTabSheetHide(Sender: TObject);\r
+ procedure ConfigTabSheetShow(Sender: TObject);\r
+ procedure Timer2Timer(Sender: TObject);\r
+ procedure AboutTabSheetShow(Sender: TObject);\r
+ procedure PCSMSTabSheetShow(Sender: TObject);\r
+ procedure CopytoPC1Click(Sender: TObject);\r
+ procedure ListView10SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+ procedure PCSMSPopupMenuPopup(Sender: TObject);\r
+ procedure Delete3Click(Sender: TObject);\r
+ procedure SendSave1Click(Sender: TObject);\r
+ procedure WapBookTabSheetHide(Sender: TObject);\r
+ procedure WapBookTabSheetShow(Sender: TObject);\r
+ procedure ComboBox7Change(Sender: TObject);\r
+ procedure Button19Click(Sender: TObject);\r
+ procedure Button20Click(Sender: TObject);\r
+ procedure PCOfflineTabSheetShow(Sender: TObject);\r
+ procedure PCCalendarTabSheetShow(Sender: TObject);\r
+ procedure CopytoPC2Click(Sender: TObject);\r
+ procedure Delete5Click(Sender: TObject);\r
+ procedure Copytocalendar1Click(Sender: TObject);\r
+ procedure PCCalendarPopupMenuPopup(Sender: TObject);\r
+ procedure Savebackuptofile1Click(Sender: TObject);\r
+ procedure Restorebackupfromfile1Click(Sender: TObject);\r
+ procedure PBKPopupMenuPopup(Sender: TObject);\r
+ procedure Savephonebooktofileanotherapplication1Click(Sender: TObject);\r
+ procedure ListView4DblClick(Sender: TObject);\r
+ procedure Edit19Click(Sender: TObject);\r
+ procedure Delete4Click(Sender: TObject);\r
+ procedure Button22Click(Sender: TObject);\r
+ procedure New20Click(Sender: TObject);\r
+ procedure ListView9SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+ procedure Edit20Click(Sender: TObject);\r
+ procedure WAPBookPopupMenuPopup(Sender: TObject);\r
+ procedure SMSSendSave2Click(Sender: TObject);\r
+ procedure Button23Click(Sender: TObject);\r
+ procedure CopyphonebooktoPC1Click(Sender: TObject);\r
+ procedure PCPBKTabSheetShow(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ MainForm: TMainForm;\r
+ setcalendarnote:GSM_CalendarNote;\r
+ setsms:GSM_MultiSMSMessage;\r
+ setsmslocation:integer;\r
+ smscselectitem:integer;\r
+ bitma:GSM_Bitmap;\r
+ rington:GSM_Ringtone;\r
+ calenda:GSM_CalendarNote;\r
+ pbk:GSM_PhonebookEntry;\r
+ previewcolor:TColor;\r
+ bookmarknum2:integer;\r
+ bookma:GSM_WAPBookmark;\r
+ wapset:GSM_WAPSettings;\r
+ pbkofflinenumber:integer;\r
+ \r
+ PhoneBackup: GSM_Backup;\r
+ PhoneBackupAvailable:boolean;\r
+\r
+procedure AddCalendarNote(note:GSM_CalendarNote;myview:TListView);\r
+function DayOFweek3(date:TDateTime):string;\r
+procedure SetSMSC(num:integer);\r
+procedure ReadPBKOffline;\r
+\r
+implementation\r
+\r
+uses Calendar, SMSEdit, LogosRing, Netmon, smscedit, pbkedit, backup,\r
+ backup2, pbkedit2, wapbook;\r
+\r
+{$R *.dfm}\r
+\r
+type\r
+ TNetmonThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TPhonebookThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TSpeedThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TSMSCThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TSMSThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TCalendarThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TCallerThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TProfileThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TPlayRingtoneThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+ TWAPBookmarkThread = class(TThread)\r
+ public\r
+ procedure Execute; override;\r
+ end;\r
+\r
+var\r
+ //phone sheet\r
+ phoneinfo:boolean;\r
+\r
+ //reading netmonitor variables\r
+ netmonnum: integer; //number of netmon screen\r
+ NetmonThread: TNetmonThread;\r
+\r
+ //reading phonebook memories variables\r
+ phonebookstatus:GSM_MemoryStatus;\r
+ phonebookcur:integer;\r
+ phonebookfound:integer;\r
+ PhonebookThread: TPhonebookThread;\r
+ pbknumberentry:integer;\r
+ \r
+ //logos\r
+ pointsize:integer;\r
+ x2,y2:byte;\r
+ logofilename:string='xxx';\r
+\r
+ //ringtones\r
+ PlayRingtoneThread: TPlayRingtoneThread;\r
+ ringindex:integer;\r
+ binring:GSM_BinRingtone;\r
+\r
+ //speeddials\r
+ speednum:integer;\r
+ SpeedThread: TSpeedThread;\r
+\r
+ //caller groups\r
+ caller:array[1..5] of GSM_Bitmap;\r
+ callerinit:boolean;\r
+ callernum:integer;\r
+ CallerThread: TCallerThread;\r
+\r
+ //smsc\r
+ smscnum:integer;\r
+ SMSCThread: TSMSCThread;\r
+ smscinit: boolean;\r
+ SMSC2:array[1..10] of GSM_MessageCenter;\r
+\r
+ //calendar\r
+ calendarnum:integer;\r
+ CalendarThread: TCalendarThread;\r
+ calendarselect:integer;\r
+ readcalendar:boolean;\r
+\r
+ CalendarOffline:array[1..300] of GSM_CalendarNote;\r
+ CalendarOfflineNumber:integer;\r
+\r
+ //profiles\r
+ profilenum:integer;\r
+ ProfileThread: TProfileThread;\r
+\r
+ SMS:array[1..200] of GSM_SMSMessage;\r
+ SMSnum:integer;\r
+ SMSfolders:GSM_SMSFolders;\r
+ SMSstatus:GSM_SMSStatus;\r
+ smsnumindex:integer;\r
+ SMSThread: TSMSThread;\r
+ smsnum2:integer;\r
+\r
+ SMSOffline:array[1..300] of GSM_SMSMessage;\r
+ SMSOfflineNumber:integer;\r
+\r
+ //wap bookmarks\r
+ WAPBookmarkThread: TWAPBookmarkThread;\r
+ bookmarknum:integer;\r
+\r
+function Inttostr2(I: Longint;digits:integer): string;\r
+\r
+{ Convert any integer type to a string }\r
+var\r
+ S: string[11];\r
+ j:integer;\r
+begin\r
+ Str(I:digits, S);\r
+ for j:=1 to 11 do\r
+ begin\r
+ if s[j]<>' ' then break;\r
+ s[j]:='0';\r
+ end;\r
+ Result:= S;\r
+end;\r
+\r
+function DayOFweek3(date:TDateTime):string;\r
+var\r
+ days: array[1..7] of string;\r
+begin\r
+ days[1] := 'Sun';\r
+ days[2] := 'Mon';\r
+ days[3] := 'Tue';\r
+ days[4] := 'Wed';\r
+ days[5] := 'Thu';\r
+ days[6] := 'Fri';\r
+ days[7] := 'Sat';\r
+ DayOfWeek3:= days[DayOfWeek(date)];\r
+end;\r
+\r
+function DayOFweek2(day:integer;month:integer;year:integer):string;\r
+var\r
+ date:TDateTime;\r
+begin\r
+ Date:=EncodeDate(Year,Month,Day);\r
+ DayOfWeek2:= DayOfWeek3(Date);\r
+end;\r
+\r
+procedure SetSMSC(num:integer);\r
+begin\r
+ SMSEditForm.Edit1.Text:=SMSC2[num].Number;\r
+ case SMSC2[num].Validity of\r
+ GSMV_1_Hour : SMSEditForm.ComboBox3.ItemIndex:=0;\r
+ GSMV_6_Hours : SMSEditForm.ComboBox3.ItemIndex:=1;\r
+ GSMV_24_Hours : SMSEditForm.ComboBox3.ItemIndex:=2;\r
+ GSMV_72_Hours : SMSEditForm.ComboBox3.ItemIndex:=3;\r
+ GSMV_1_Week : SMSEditForm.ComboBox3.ItemIndex:=4;\r
+ else\r
+ SMSEditForm.ComboBox3.ItemIndex:=5;\r
+\r
+ end;\r
+ case SMSC2[num].Format of\r
+ GSMF_Text : SMSEditForm.ComboBox4.ItemIndex:=0;\r
+ GSMF_Fax : SMSEditForm.ComboBox4.ItemIndex:=1;\r
+ GSMF_Email : SMSEditForm.ComboBox4.ItemIndex:=2;\r
+ else\r
+ SMSEditForm.ComboBox4.ItemIndex:=3;\r
+ end;\r
+end;\r
+\r
+procedure ReadPBKOffline;\r
+var F:file of GSM_PhonebookEntry;\r
+begin\r
+ AssignFile(F, 'gnokiipbk');\r
+ Reset(F);\r
+ if (ioresult=0) then\r
+ begin\r
+ phonebackup.PhonePhonebookUsed:=0;\r
+ pbkofflinenumber:=0;\r
+ while not eof(f) do\r
+ begin\r
+ pbkofflinenumber:=pbkofflinenumber+1;\r
+ read(f,PhoneBackup.PhonePhonebook[pbkofflinenumber]);\r
+ end;\r
+ CloseFile(F);\r
+ end;\r
+end;\r
+\r
+procedure SavePBKOffline;\r
+var F:file of GSM_PhonebookEntry;\r
+ i:integer;\r
+begin\r
+ AssignFile(F, 'gnokiipbk');\r
+ Rewrite(F);\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ Write(f,PhoneBackup.PhonePhonebook[i]);\r
+ end;\r
+ CloseFile(F);\r
+end;\r
+\r
+procedure AddSMSEditSenderList;\r
+var i,j:integer;\r
+begin\r
+ ReadPBKOffline;\r
+ SMSEditForm.ComboBox9.Items.Clear;\r
+ SMSEditForm.ComboBox9.Sorted:=false;\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[i].Number[1]<>chr(0)) then\r
+ begin\r
+ SMSEditForm.ComboBox9.Items.Add(PhoneBackup.PhonePhonebook[i].Name);\r
+ end else\r
+ begin\r
+ for j:=1 to PhoneBackup.PhonePhonebook[i].SubEntriesCount do\r
+ begin\r
+ if PhoneBackup.PhonePhonebook[i].SubEntries[j].EntryType=GSM_Number then\r
+ begin\r
+ SMSEditForm.ComboBox9.Items.Add(PhoneBackup.PhonePhonebook[i].Name);\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ SMSEditForm.ComboBox9.Sorted:=true;\r
+end;\r
+\r
+procedure ReadCallerGroup();\r
+var\r
+ logo:GSM_Bitmap;\r
+ name:Pchar;\r
+ i:integer;\r
+begin\r
+ if callernum<6 then\r
+ begin\r
+ i:=1;\r
+ while i<>0 do\r
+ begin\r
+ logo.type2:=GSM_CallerLogo;\r
+ logo.number:=callernum-1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ i:=GSM_GetBitmap(@logo);\r
+ MainForm.Timer2.Enabled:=true;\r
+ end;\r
+ caller[callernum]:=logo;\r
+ MainForm.ListView5.Items.Add;\r
+ MainForm.ListView5.Items.Item[callernum-1].Caption:=inttostr(callernum);\r
+ if logo.text[1]=chr(0) then\r
+ begin\r
+ name:='';\r
+ case callernum of\r
+ 1:name:='Family';\r
+ 2:name:='VIP';\r
+ 3:name:='Friends';\r
+ 4:name:='Colleagues';\r
+ 5:name:='Other';\r
+ end;\r
+ for i:=1 to 255 do\r
+ begin\r
+ caller[callernum].text[i]:=chr(0);\r
+ end;\r
+ for i:=1 to strlen(name) do\r
+ begin\r
+ caller[callernum].text[i]:=name[i-1];\r
+ end;\r
+ end;\r
+ MainForm.ListView5.Items.Item[callernum-1].Subitems.Add(caller[callernum].text);\r
+ if logo.ringtone=16 then\r
+ MainForm.ListView5.Items.Item[callernum-1].Subitems.Add('default')\r
+ else\r
+ MainForm.ListView5.Items.Item[callernum-1].Subitems.Add(inttostr(logo.ringtone));\r
+ if logo.enabled<>0 then\r
+ MainForm.ListView5.Items.Item[callernum-1].Subitems.Add('logo enabled')\r
+ else\r
+ MainForm.ListView5.Items.Item[callernum-1].Subitems.Add('logo disabled');\r
+ end else callerinit:=true;\r
+ callernum:=callernum+1;\r
+end;\r
+\r
+procedure ReadAllCallerGroups();\r
+begin\r
+ if (GSM_GetModelFeature(FN_CALLERGROUPS)<>0) then\r
+ begin\r
+ if callerinit=false then\r
+ begin\r
+ MainForm.ListView5.Items.Clear;\r
+ callernum:=1;\r
+ while callerinit=false do\r
+ begin\r
+ ReadCallerGroup();\r
+ if callerinit then break;\r
+ end;\r
+ end;\r
+ end else\r
+ begin\r
+ end;\r
+end;\r
+\r
+//logos sheet\r
+procedure UpdatePointBitmap(i,j:integer);\r
+begin\r
+ if GSM_IsPointBitmap(@bitma,i,j)<>0 then\r
+ begin\r
+ MainForm.LogosImage.Canvas.Brush.Color := clBlack;\r
+ MainForm.Image1.Canvas.Pen.Color := clBlack;\r
+ end else\r
+ begin\r
+ MainForm.LogosImage.Canvas.Brush.Color := PreviewColor;//$0063cf63\r
+ MainForm.Image1.Canvas.Pen.Color := PreviewColor;\r
+ end;\r
+ MainForm.LogosImage.Canvas.FillRect(Rect(i*pointsize+i,j*pointsize+j,(i+1)*pointsize+i,(j+1)*pointsize+j));\r
+ MainForm.Image1.Canvas.Polyline([Point(28+i, 145+j), Point(29+i,146+j)]);\r
+end;\r
+\r
+procedure DrawBitmap();\r
+var\r
+ xsize:integer;\r
+ ysize:integer;\r
+ i,j:integer;\r
+begin\r
+ MainForm.StatusBar1.Panels[0].Text:=inttostr(bitma.width);\r
+ xsize:=bitma.width;\r
+ ysize:=bitma.heigh;\r
+\r
+ MainForm.LogosImage.Canvas.Brush.Style := bsSolid;\r
+ MainForm.LogosImage.Canvas.Brush.Color := clScrollBar;\r
+\r
+ MainForm.LogosImage.Canvas.Pen.Mode := pmCopy;\r
+\r
+ MainForm.LogosImage.Canvas.Pen.Color := clScrollBar;\r
+ MainForm.LogosImage.Canvas.Rectangle(0,0,MainForm.LogosImage.Width,MainForm.LogosImage.Height);\r
+\r
+ MainForm.LogosImage.Canvas.Pen.Color := PreviewColor;\r
+ MainForm.LogosImage.Canvas.Rectangle(0,0,xsize*pointsize+xsize-1,ysize*pointsize+ysize-1);\r
+\r
+ MainForm.LogosImage.Canvas.Brush.Color := PreviewColor;\r
+ MainForm.LogosImage.Canvas.FloodFill(2,2,PreviewColor,fsBorder);\r
+\r
+ MainForm.LogosImage.Canvas.Pen.Color := clBlack;\r
+\r
+ for i:=0 to xsize do\r
+ begin\r
+ MainForm.LogosImage.Canvas.MoveTo(i*pointsize+i-1,0);\r
+ MainForm.LogosImage.Canvas.LineTo(i*pointsize+i-1,ysize*pointsize+ysize-1);\r
+ end;\r
+ for i:=0 to ysize do\r
+ begin\r
+ MainForm.LogosImage.Canvas.MoveTo(0,i*pointsize+i-1);\r
+ MainForm.LogosImage.Canvas.LineTo(xsize*pointsize+xsize-1,i*pointsize+i-1);\r
+ end;\r
+\r
+ MainForm.Image1.Picture.Assign(MainForm.Image2.Picture);\r
+ MainForm.Image1.Canvas.Pen.Mode := pmCopy;\r
+ for i:=0 to xsize-1 do\r
+ begin\r
+ for j:=0 to ysize-1 do\r
+ begin\r
+ UpdatePointBitmap(i,j);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Image1MouseDown(Sender: TObject; Button: TMouseButton;\r
+ Shift: TShiftState; X, Y: Integer);\r
+var\r
+ sr: TSearchRec;\r
+ filefound:integer;\r
+begin\r
+ filefound:=0;\r
+ if FindFirst(ExtractFilePath(Application.ExeName)+'\*bmp', faAnyFile, sr) = 0 then\r
+ begin\r
+ repeat\r
+ if (sr.Attr and faAnyFile) = sr.Attr then\r
+ begin\r
+ if sr.Size=57814 then\r
+ begin\r
+ case filefound of\r
+ 1:begin\r
+ Image2.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\'+sr.name);\r
+ PreviewColor:=Image2.Canvas.Pixels[70,170];\r
+ DrawBitmap;\r
+ filefound:=2;\r
+ logofilename:=sr.name;\r
+ end;\r
+ 0:if logofilename=sr.Name then filefound:=1;\r
+ end;\r
+ if filefound=2 then break;\r
+ end;\r
+ end;\r
+ until FindNext(sr) <> 0;\r
+ FindClose(sr);\r
+ end;\r
+ if filefound<>2 then\r
+ begin\r
+ if FindFirst(ExtractFilePath(Application.ExeName)+'\*bmp', faAnyFile, sr) = 0 then\r
+ begin\r
+ Image2.Picture.LoadFromFile(ExtractFilePath(Application.ExeName)+'\'+sr.name);\r
+ DrawBitmap;\r
+ logofilename:=sr.name;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure LogosMousePos(x,y:integer);\r
+var\r
+ i:integer;\r
+begin\r
+ i:=0;x2:=0;\r
+ while i<=x do\r
+ begin\r
+ i:=i+pointsize+1;\r
+ x2:=x2+1;\r
+ end;\r
+ i:=0;y2:=0;\r
+ while i<=y do\r
+ begin\r
+ i:=i+pointsize+1;\r
+ y2:=y2+1;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ComboBox2Select(Sender: TObject);\r
+var\r
+ bittype:integer;\r
+begin\r
+ case ComboBox2.ItemIndex of\r
+ 0:bittype:=GSM_CallerLogo;\r
+ 1:begin\r
+ bittype:=GSM_OperatorLogo;\r
+ if GSMPhoneConnected then\r
+ begin\r
+ case GSM_GetModelFeature(FN_STARTUP) of\r
+ F_STA62:bittype:=GSM_7110OperatorLogo;\r
+ F_STA71:bittype:=GSM_7110OperatorLogo;\r
+ end;\r
+ end;\r
+ end;\r
+ 2:bittype:=GSM_PictureImage;\r
+ 3:begin\r
+ bittype:=GSM_StartupLogo;\r
+ if GSMPhoneConnected then\r
+ begin\r
+ case GSM_GetModelFeature(FN_STARTUP) of\r
+ F_STA62:bittype:=GSM_6210StartupLogo;\r
+ F_STA71:bittype:=GSM_7110StartupLogo;\r
+ end;\r
+ end;\r
+ end;\r
+ else\r
+ bittype:=GSM_StartupLogo;\r
+ if GSMPhoneConnected then\r
+ begin\r
+ case GSM_GetModelFeature(FN_STARTUP) of\r
+ F_STA62:bittype:=GSM_6210StartupLogo;\r
+ F_STA71:bittype:=GSM_7110StartupLogo;\r
+ end;\r
+ end;\r
+ end;\r
+ GSM_ResizeBitmap(@bitma,bittype);\r
+ DrawBitmap();\r
+ if (bitma.type2<>GSM_OperatorLogo) and\r
+ (bitma.type2<>GSM_7110OperatorLogo) then\r
+ Button8.Enabled:=false\r
+ else\r
+ Button8.Enabled:=true;\r
+end;\r
+\r
+procedure TMainForm.LogosImageMouseMove(Sender: TObject; Shift: TShiftState;\r
+ X, Y: Integer);\r
+begin\r
+ LogosMousePos(x,y);\r
+ if x2<=bitma.width then\r
+ begin\r
+ if y2<=bitma.heigh then\r
+ MainForm.StatusBar1.Panels[0].Text:=inttostr(x2)+','+inttostr(y2)\r
+ else\r
+ MainForm.StatusBar1.Panels[0].Text:='';\r
+ end else\r
+ MainForm.StatusBar1.Panels[0].Text:='';\r
+end;\r
+\r
+procedure TMainForm.LogosTabSheetShow(Sender: TObject);\r
+begin\r
+ DrawBitmap();\r
+end;\r
+\r
+procedure TMainForm.Button7Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ LogosRingForm.Label1.Caption:='What logo do you want to get ?';\r
+ LogosRingForm.ComboBox3.Items.Clear;\r
+ case bitma.type2 of\r
+ GSM_CallerLogo:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ ReadAllCallerGroups();\r
+ for i:=1 to 5 do\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(caller[i].text);\r
+ end;\r
+ LogosRingForm.ComboBox3.ItemIndex:=0;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ begin\r
+ bitma.number:=LogosRingForm.ComboBox3.ItemIndex;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetBitmap(@bitma);\r
+ MainForm.Timer2.Enabled:=true;\r
+ DrawBitmap();\r
+ end;\r
+ end;\r
+ GSM_PictureImage:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ for i:=1 to 20 do\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add('Location '+inttostr(i));\r
+ end;\r
+ LogosRingForm.ComboBox3.ItemIndex:=0;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ begin\r
+ bitma.number:=LogosRingForm.ComboBox3.ItemIndex;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetBitmap(@bitma);\r
+ MainForm.Timer2.Enabled:=true;\r
+ DrawBitmap();\r
+ end;\r
+ end;\r
+ else\r
+ begin\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetBitmap(@bitma);\r
+ MainForm.Timer2.Enabled:=true;\r
+ DrawBitmap();\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button4Click(Sender: TObject);\r
+var\r
+ bit:GSM_Bitmap;\r
+begin\r
+ if OpenDialog1.Execute then\r
+ begin\r
+ if GSM_ReadBitmapFile(PChar(OpenDialog1.FileName),@bit)=0 then\r
+ begin\r
+ bitma:=bit;\r
+ DrawBitmap();\r
+ case bitma.type2 of\r
+ GSM_CallerLogo :ComboBox2.ItemIndex:=0;\r
+ GSM_OperatorLogo:ComboBox2.ItemIndex:=1;\r
+ GSM_7110OperatorLogo:ComboBox2.ItemIndex:=1;\r
+ GSM_PictureImage:ComboBox2.ItemIndex:=2;\r
+ GSM_StartupLogo :ComboBox2.ItemIndex:=3;\r
+ GSM_7110StartupLogo :ComboBox2.ItemIndex:=3;\r
+ GSM_6210StartupLogo :ComboBox2.ItemIndex:=3;\r
+ end;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.LogosImageMouseDown(Sender: TObject; Button: TMouseButton;\r
+ Shift: TShiftState; X, Y: Integer);\r
+begin\r
+ LogosMousePos(x,y);\r
+ if x2<=bitma.width then\r
+ begin\r
+ if y2<=bitma.heigh then\r
+ begin\r
+ if ssLeft in Shift then\r
+ GSM_SetPointBitmap(@bitma,x2-1,y2-1)\r
+ else\r
+ GSM_ClearPointBitmap(@bitma,x2-1,y2-1);\r
+\r
+ UpdatePointBitmap(x2-1,y2-1);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button6Click(Sender: TObject);\r
+var\r
+ i,j:integer;\r
+ Name,Data:array[1..255] of char;\r
+ oldbitma:GSM_Bitmap;\r
+begin\r
+ LogosRingForm.Label1.Caption:='Do you want to set logo ?';\r
+ LogosRingForm.ComboBox3.Items.Clear;\r
+ case bitma.type2 of\r
+ GSM_StartupLogo:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=false;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ GSM_SetBitmap(@bitma);\r
+ end;\r
+ GSM_7110OperatorLogo:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ LogosRingForm.ComboBox3.Items.Add('Preview');\r
+ //preparing network names\r
+ i:=0;\r
+ while true do\r
+ begin\r
+ GSM_GetNetworkData(i,@Name,@Data);\r
+\r
+ // conversion problems\r
+ Label14.Caption:=Name;\r
+ if strcomp(PChar(Label14.Caption),PChar('unknown'))=0 then break;\r
+\r
+ // conversion problems\r
+ Label14.Caption:=' - '+Label14.Caption;\r
+ for j:=6 downto 1 do\r
+ begin\r
+ Label14.Caption:=Data[j]+Label14.Caption;\r
+ end;\r
+\r
+ LogosRingForm.ComboBox3.Items.Add(Pchar(Label14.Caption));\r
+ i:=i+1;\r
+ end;\r
+ //looking for current network\r
+ if GSMPhoneConnected then\r
+ begin\r
+ // conversion problems\r
+ Label14.Caption:=MainForm.StatusBar1.Panels[1].Text;\r
+ Label14.Caption:=' - '+Label14.Caption;\r
+ for j:=6 downto 1 do\r
+ begin\r
+ Label14.Caption:=GSMNetworkInfo.NetworkCode[j]+Label14.Caption;\r
+ end;\r
+\r
+ i:=1;\r
+ while true do\r
+ begin\r
+ if strcomp(pchar(LogosRingForm.ComboBox3.Items[i]),pchar(Label14.Caption))=0\r
+ then break;\r
+ i:=i+1;\r
+ end;\r
+ LogosRingForm.ComboBox3.ItemIndex:=i;\r
+ end;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ begin\r
+ if LogosRingForm.ComboBox3.ItemIndex=0 then\r
+ begin\r
+ bitma.number:=255;\r
+ for i:=1 to 6 do\r
+ begin\r
+ bitma.netcode[i]:=GSMNetworkInfo.NetworkCode[i];\r
+ end;\r
+ bitma.netcode[7]:=chr(0);\r
+ end else\r
+ begin\r
+ GSM_GetNetworkData(LogosRingForm.ComboBox3.ItemIndex-1,@Name,@bitma.netcode);\r
+ end;\r
+ GSM_SetBitmap(@bitma);\r
+ end;\r
+ end;\r
+ GSM_OperatorLogo:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ LogosRingForm.ComboBox3.Items.Add('Preview');\r
+ //preparing network names\r
+ i:=0;\r
+ while true do\r
+ begin\r
+ GSM_GetNetworkData(i,@Name,@Data);\r
+\r
+ // conversion problems\r
+ Label14.Caption:=Name;\r
+ if strcomp(PChar(Label14.Caption),PChar('unknown'))=0 then break;\r
+\r
+ // conversion problems\r
+ Label14.Caption:=' - '+Label14.Caption;\r
+ for j:=6 downto 1 do\r
+ begin\r
+ Label14.Caption:=Data[j]+Label14.Caption;\r
+ end;\r
+\r
+ LogosRingForm.ComboBox3.Items.Add(Pchar(Label14.Caption));\r
+ i:=i+1;\r
+ end;\r
+ //looking for current network\r
+ if GSMPhoneConnected then\r
+ begin\r
+ // conversion problems\r
+ Label14.Caption:=MainForm.StatusBar1.Panels[1].Text;\r
+ Label14.Caption:=' - '+Label14.Caption;\r
+ for j:=6 downto 1 do\r
+ begin\r
+ Label14.Caption:=GSMNetworkInfo.NetworkCode[j]+Label14.Caption;\r
+ end;\r
+\r
+ i:=1;\r
+ while true do\r
+ begin\r
+ if strcomp(pchar(LogosRingForm.ComboBox3.Items[i]),pchar(Label14.Caption))=0\r
+ then break;\r
+ i:=i+1;\r
+ end;\r
+ LogosRingForm.ComboBox3.ItemIndex:=i;\r
+ end;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ begin\r
+ if LogosRingForm.ComboBox3.ItemIndex=0 then\r
+ begin\r
+ bitma.number:=255;\r
+ for i:=1 to 6 do\r
+ begin\r
+ bitma.netcode[i]:=GSMNetworkInfo.NetworkCode[i];\r
+ end;\r
+ bitma.netcode[7]:=chr(0);\r
+ end else\r
+ begin\r
+ GSM_GetNetworkData(LogosRingForm.ComboBox3.ItemIndex-1,@Name,@bitma.netcode);\r
+ end;\r
+ GSM_SetBitmap(@bitma);\r
+ end;\r
+ end;\r
+ GSM_PictureImage:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ for i:=1 to 20 do\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add('Location '+inttostr(i));\r
+ end;\r
+ LogosRingForm.ComboBox3.ItemIndex:=0;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ begin\r
+ if LogosRingForm.ComboBox3.ItemIndex=0 then\r
+ begin\r
+ bitma.number:=255;\r
+ end else\r
+ begin\r
+ bitma.number:=LogosRingForm.ComboBox3.ItemIndex;\r
+ end;\r
+ GSM_SetBitmap(@bitma);\r
+ end;\r
+ end;\r
+ GSM_CallerLogo:\r
+ begin\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ LogosRingForm.ComboBox3.Items.Add('Preview');\r
+ ReadAllCallerGroups();\r
+ for i:=1 to 5 do\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(caller[i].text);\r
+ end;\r
+ LogosRingForm.ComboBox3.ItemIndex:=1;\r
+ LogosRingForm.ShowModal();\r
+ if (LogosRingForm.ComboBox3.Visible) then\r
+ begin\r
+ if LogosRingForm.ComboBox3.ItemIndex=0 then\r
+ begin\r
+ bitma.number:=255;\r
+ end else\r
+ begin\r
+ bitma.number:=LogosRingForm.ComboBox3.ItemIndex-1;\r
+ //we need to get old caller group datas\r
+ oldbitma.type2:=bitma.type2;\r
+ oldbitma.number:=bitma.number;\r
+ GSM_GetBitmap(@oldbitma);\r
+ bitma.ringtone:=oldbitma.ringtone;\r
+ bitma.text:=oldbitma.text;\r
+ end;\r
+ GSM_SetBitmap(@bitma);\r
+ end;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button5Click(Sender: TObject);\r
+begin\r
+ if SaveDialog1.Execute then\r
+ begin\r
+ GSM_SaveBitmapFile(PChar(SaveDialog1.FileName),@bitma);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button8Click(Sender: TObject);\r
+var\r
+ bitma2:GSM_Bitmap;\r
+begin\r
+ if MessageDlg('Restore logo to default ?',\r
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then\r
+ begin\r
+ bitma2:=bitma;\r
+ bitma2.netcode[1]:='0';\r
+ bitma2.netcode[2]:='0';\r
+ bitma2.netcode[3]:='0';\r
+ bitma2.netcode[4]:=' ';\r
+ bitma2.netcode[5]:='0';\r
+ bitma2.netcode[6]:='0';\r
+ bitma2.netcode[7]:=chr(0);\r
+ GSM_ClearBitmap(@bitma2);\r
+ GSM_SetBitmap(@bitma2);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button12Click(Sender: TObject);\r
+begin\r
+ GSM_ClearBitmap(@bitma);\r
+ DrawBitmap();\r
+end;\r
+\r
+//MainForm main functions\r
+procedure TMainForm.TreeView1MouseDown(Sender: TObject; Button: TMouseButton;\r
+ Shift: TShiftState; X, Y: Integer);\r
+begin\r
+ MainForm.TreeView1.FullExpand;\r
+ case MainForm.TreeView1.Selected.ImageIndex of\r
+ 0: MainForm.PageControl1.ActivePage:=PhoneTabSheet;\r
+ 1: MainForm.PageControl1.ActivePage:=CalendarTabSheet;\r
+ 2: MainForm.PageControl1.ActivePage:=DivertTabSheet;\r
+ 3: MainForm.PageControl1.ActivePage:=CallerTabSheet;\r
+ 4: MainForm.PageControl1.ActivePage:=LogosTabSheet;\r
+ 5: MainForm.PageControl1.ActivePage:=NetmonitorTabSheet;\r
+ 6: MainForm.PageControl1.ActivePage:=PhonebookTabSheet;\r
+ 7: MainForm.PageControl1.ActivePage:=ProfileTabSheet;\r
+ 8: MainForm.PageControl1.ActivePage:=RingtonesTabSheet;\r
+ 9: MainForm.PageControl1.ActivePage:=SMSTabSheet;\r
+ 10: MainForm.PageControl1.ActivePage:=SMSCTabSheet;\r
+ 11: MainForm.PageControl1.ActivePage:=SpeedTabSheet;\r
+ 12: MainForm.PageControl1.ActivePage:=WAPBookTabSheet;\r
+ 13: MainForm.PageControl1.ActivePage:=WAPSettTabSheet;\r
+ 14: MainForm.PageControl1.ActivePage:=PCOfflineTabSheet;\r
+ 15: MainForm.PageControl1.ActivePage:=PCCalendarTabSheet;\r
+ 16: MainForm.PageControl1.ActivePage:=PCPBKTabSheet;\r
+ 17: MainForm.PageControl1.ActivePage:=PCSMSTabSheet;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Configuration1Click(Sender: TObject);\r
+begin\r
+ MainForm.PageControl1.ActivePage:=ConfigTabSheet;\r
+end;\r
+\r
+procedure TMainForm.TreeView1KeyUp(Sender: TObject; var Key: Word;\r
+ Shift: TShiftState);\r
+begin\r
+ MainForm.TreeView1.FullExpand;\r
+end;\r
+\r
+procedure TMainForm.FormCreate(Sender: TObject);\r
+begin\r
+ MainForm.PhonebookTabSheet.TabVisible:=false;\r
+ MainForm.NetmonitorTabSheet.TabVisible:=false;\r
+ MainForm.LogosTabSheet.TabVisible:=false;\r
+ MainForm.PhoneTabSheet.TabVisible:=false;\r
+ MainForm.RingtonesTabSheet.TabVisible:=false;\r
+ MainForm.SMSTabSheet.TabVisible:=false;\r
+ MainForm.SMSCTabSheet.TabVisible:=false;\r
+ MainForm.SpeedTabSheet.TabVisible:=false;\r
+ MainForm.CalendarTabSheet.TabVisible:=false;\r
+ MainForm.CallerTabSheet.TabVisible:=false;\r
+ MainForm.ProfileTabSheet.TabVisible:=false;\r
+ MainForm.WAPBookTabSheet.TabVisible:=false;\r
+ MainForm.WAPSettTabSheet.TabVisible:=false;\r
+ MainForm.DivertTabSheet.TabVisible:=false;\r
+ MainForm.ConfigTabSheet.TabVisible:=false;\r
+ MainForm.AboutTabSheet.TabVisible:=false;\r
+ MainForm.PCSMSTabSheet.TabVisible:=false;\r
+ MainForm.PCCalendarTabSheet.TabVisible:=false;\r
+ MainForm.PCOfflineTabSheet.TabVisible:=false;\r
+ MainForm.PCPBKTabSheet.TabVisible:=false;\r
+ MainForm.PageControl1.ActivePage:=PhoneTabSheet;\r
+\r
+ PreviewColor:=Image2.Canvas.Pixels[70,170];\r
+\r
+ bitma.size:=126;\r
+ bitma.width:=72;\r
+ bitma.heigh:=14;\r
+ bitma.type2:=GSM_OperatorLogo;\r
+ GSM_ClearBitmap(@bitma);\r
+\r
+ pointsize:=3;\r
+ MainForm.LogosImage.Width:=96*pointsize+96-1;\r
+ MainForm.LogosImage.Height:=65*pointsize+65-1;\r
+\r
+ netmonnum:=1;\r
+\r
+ MainForm.Width:=660;\r
+ MainForm.Height:=470;\r
+\r
+ callerinit:=false;\r
+ phoneinfo:=false;\r
+ smscinit:=false;\r
+\r
+ smsofflinenumber:=0;\r
+ calendarofflinenumber:=0;\r
+ pbkofflinenumber:=0;\r
+ \r
+ readcalendar:=false;\r
+end;\r
+\r
+procedure TMainForm.Timer1Timer(Sender: TObject);\r
+var\r
+ NetworkName:array[1..255] of char;\r
+begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ // Here we should enable interface\r
+ GSM_GetNetworkName(@NetworkName,@GSMNetworkInfo.NetworkCode);\r
+ MainForm.StatusBar1.Panels[1].Text:=NetworkName;\r
+ if PhonebookThread=nil then\r
+ ComboBox1.Enabled:=true;\r
+\r
+ SaveBackupTofile1.Enabled:=true;\r
+ Restorebackupfromfile1.Enabled:=true;\r
+\r
+ ListView1.Enabled:=true;\r
+ NetmonGroupBox.Enabled:=true;\r
+ SpinEdit1.Enabled:=true;\r
+ Button2.Enabled:=true;\r
+ Button3.Enabled:=true;\r
+ Button6.Enabled:=true;\r
+ Button7.Enabled:=true;\r
+ Button9.Enabled:=true;\r
+ Button11.Enabled:=true;\r
+\r
+ //ringtones\r
+ Button16.Enabled:=true;\r
+ if Edit1.Text<>'' then Edit1.Enabled:=true;\r
+ if Edit2.Text<>'' then Edit2.Enabled:=true;\r
+ Button22.Enabled:=true;\r
+\r
+ If MainForm.PageControl1.ActivePage=MainForm.NetmonitorTabSheet then\r
+ NetmonitorTabSheetShow(Sender);\r
+\r
+ If MainForm.PageControl1.ActivePage=MainForm.PhoneTabSheet then\r
+ begin\r
+ if not phoneinfo then\r
+ PhoneTabSheetShow(Sender);\r
+ end;\r
+\r
+ If MainForm.PageControl1.ActivePage=MainForm.SpeedTabSheet then\r
+ begin\r
+ if speednum<>10 then\r
+ SpeedTabSheetShow(Sender);\r
+ end;\r
+\r
+ if (bitma.type2<>GSM_OperatorLogo) and\r
+ (bitma.type2<>GSM_7110OperatorLogo) then\r
+ Button8.Enabled:=false\r
+ else\r
+ Button8.Enabled:=true;\r
+\r
+ if Edit2.Text<>'' then\r
+ Button14.Enabled:=true\r
+ else\r
+ Button14.Enabled:=false;\r
+\r
+ if Edit1.Text<>'' then\r
+ begin\r
+ Button2.Enabled:=true;\r
+ Button17.Enabled:=true;\r
+ if PlayRingtoneThread<>nil then\r
+ begin\r
+ Button3.Enabled:=false;\r
+ Button16.Enabled:=true;\r
+ end\r
+ else\r
+ begin\r
+ Button3.Enabled:=true;\r
+ Button16.Enabled:=false;\r
+ end;\r
+ end else\r
+ begin\r
+ Button2.Enabled:=false;\r
+ Button17.Enabled:=false;\r
+ Button16.Enabled:=false;\r
+ Button3.Enabled:=false;\r
+ end;\r
+\r
+ Button18.Enabled:=false;\r
+ if bitma.type2=GSM_PictureImage then\r
+ Button18.Enabled:=true;\r
+ if (bitma.type2=GSM_OperatorLogo) or\r
+ (bitma.type2=GSM_7110OperatorLogo) then\r
+ Button18.Enabled:=true;\r
+ if bitma.type2=GSM_CallerLogo then\r
+ Button18.Enabled:=true;\r
+\r
+ //wap settings\r
+ WAPSettTabSheet.Enabled:=true;\r
+ if GSM_GetModelFeature(FN_WAP)=0 then\r
+ begin\r
+ Button23.Enabled:=false;\r
+ GroupBox19.Enabled:=false;\r
+ groupbox19.Ctl3D:=false;\r
+ ComboBox7.enabled:=false;\r
+ ComboBox8.enabled:=false;\r
+ ComboBox9.enabled:=false;\r
+ ComboBox10.enabled:=false;\r
+ ComboBox11.enabled:=false;\r
+ ComboBox12.enabled:=false;\r
+ ComboBox13.enabled:=false;\r
+ ComboBox14.enabled:=false;\r
+ Edit6.Enabled:=false;\r
+ Edit8.Enabled:=false;\r
+ Edit9.Enabled:=false;\r
+ Edit10.Enabled:=false;\r
+ Edit11.Enabled:=false;\r
+ Edit12.Enabled:=false;\r
+ Edit13.Enabled:=false;\r
+ Edit14.Enabled:=false;\r
+ Edit15.Enabled:=false;\r
+ end else\r
+ begin\r
+ GroupBox19.Enabled:=true;\r
+ groupbox19.Ctl3D:=true;\r
+ ComboBox7.enabled:=true;\r
+ ComboBox8.enabled:=true;\r
+ ComboBox9.enabled:=true;\r
+ ComboBox10.enabled:=true;\r
+ ComboBox11.enabled:=true;\r
+ ComboBox12.enabled:=true;\r
+ ComboBox13.enabled:=true;\r
+ ComboBox14.enabled:=true;\r
+ Edit6.Enabled:=true;\r
+ Edit8.Enabled:=true;\r
+ Edit9.Enabled:=true;\r
+ Edit10.Enabled:=true;\r
+ Edit11.Enabled:=true;\r
+ Edit12.Enabled:=true;\r
+ Edit13.Enabled:=true;\r
+ Edit14.Enabled:=true;\r
+ Edit15.Enabled:=true;\r
+ Button23.Enabled:=false;\r
+ if ComboBox7.ItemIndex<>0 then Button23.Enabled:=true;\r
+ end;\r
+\r
+ button19.Enabled:=true;\r
+ button20.Enabled:=true;\r
+ end else\r
+ begin\r
+ // Here we should disabled interface\r
+ MainForm.StatusBar1.Panels[1].Text:='Not connected';\r
+\r
+ SaveBackupTofile1.Enabled:=false;\r
+ Restorebackupfromfile1.Enabled:=false;\r
+\r
+ callerinit:=false;\r
+\r
+ MainForm.ComboBox1.Enabled:=false;\r
+ MainForm.ListView1.Enabled:=false;\r
+ MainForm.NetmonGroupBox.Enabled:=false;\r
+ MainForm.SpinEdit1.Enabled:=false;\r
+ MainForm.Button2.Enabled:=false;\r
+ MainForm.Button3.Enabled:=false;\r
+ MainForm.Button6.Enabled:=false;\r
+ MainForm.Button7.Enabled:=false;\r
+ MainForm.Button8.Enabled:=false;\r
+ MainForm.Button9.Enabled:=false;\r
+ MainForm.Button11.Enabled:=false;\r
+ Button18.Enabled:=false;\r
+\r
+ //ringtones\r
+ Button16.Enabled:=false;\r
+ Button14.Enabled:=false;\r
+ Button17.Enabled:=false;\r
+ Edit1.Enabled:=false;\r
+ Edit2.Enabled:=false;\r
+ Button22.Enabled:=false;\r
+\r
+ MainForm.NetmonitorTabSheetHide(Sender);\r
+ MainForm.PhonebookTabSheetHide(Sender);\r
+ MainForm.SpeedTabSheetHide(Sender);\r
+\r
+ //WAP settings\r
+ ComboBox7.enabled:=false;\r
+ ComboBox8.enabled:=false;\r
+ ComboBox9.enabled:=false;\r
+ ComboBox10.enabled:=false;\r
+ ComboBox11.enabled:=false;\r
+ ComboBox12.enabled:=false;\r
+ ComboBox13.enabled:=false;\r
+ ComboBox14.enabled:=false;\r
+ Edit6.Enabled:=false;\r
+ Edit8.Enabled:=false;\r
+ Edit9.Enabled:=false;\r
+ Edit10.Enabled:=false;\r
+ Edit11.Enabled:=false;\r
+ Edit12.Enabled:=false;\r
+ Edit13.Enabled:=false;\r
+ Edit14.Enabled:=false;\r
+ Edit15.Enabled:=false;\r
+ Button23.Enabled:=false;\r
+\r
+ button19.Enabled:=false;\r
+ button20.Enabled:=false;\r
+\r
+ phoneinfo:=false;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Quit1Click(Sender: TObject);\r
+begin\r
+ if GSMPhoneConnected then GSM_Terminate();\r
+ Halt;\r
+end;\r
+\r
+procedure TMainForm.FormResize(Sender: TObject);\r
+begin\r
+ MainForm.StatusBar1.Panels[0].Width:=MainForm.Width-150;\r
+end;\r
+\r
+procedure TMainForm.About1Click(Sender: TObject);\r
+begin\r
+ AboutTabSheet.Show;\r
+end;\r
+\r
+//netmonitor sheet functions\r
+\r
+procedure TNetmonThread.Execute;\r
+var\r
+ netmon:array[1..255] of char;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ GSM_Netmonitor(netmonnum,@netmon);\r
+ MainForm.NetmonLabel.Caption:=netmon;\r
+ MainForm.NetmonGroupBox.Caption:=' Screen ' + IntToStr(netmonnum) + ' ';\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.NetmonitorTabSheetShow(Sender: TObject);\r
+begin\r
+ if NetmonThread<>nil then\r
+ else begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ MainForm.Timer2.Enabled:=false;\r
+ NetmonThread:=TNetmonThread.Create(false);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.NetmonitorTabSheetHide(Sender: TObject);\r
+begin\r
+ if (NetmonThread<>nil) then\r
+ begin\r
+ NetmonThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ NetmonThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SpinEdit1Change(Sender: TObject);\r
+begin\r
+ netmonnum:=SpinEdit1.Value;\r
+end;\r
+\r
+procedure TMainForm.Button11Click(Sender: TObject);\r
+var\r
+ netmon:array[1..255] of char;\r
+begin\r
+ NetmonForm.ShowModal;\r
+ if NetmonForm.RadioGroup1.ItemIndex<>-1 then\r
+ begin\r
+ GSM_Netmonitor(241+NetmonForm.RadioGroup1.ItemIndex,@netmon);\r
+ end;\r
+end;\r
+\r
+//phonebook sheet functions\r
+\r
+procedure EndPhonebookThread;\r
+begin\r
+ if (PhonebookThread<>nil) then\r
+ begin\r
+ PhonebookThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ PhonebookThread:=nil;\r
+ MainForm.ComboBox1.Enabled:=true;\r
+ end;\r
+end;\r
+\r
+procedure AddPBKEntry(MyListView:TListView;x:GSM_PhonebookEntry;number:integer);\r
+var j:integer;\r
+begin\r
+ MyListView.Items.Item[number].Subitems.Add(x.Name);\r
+\r
+ if (x.Number[1]<>chr(0)) then\r
+ MyListView.Items.Item[number].Subitems.Add(x.Number)\r
+ else begin\r
+ for j:=1 to x.SubEntriesCount do\r
+ begin\r
+ if x.SubEntries[j].EntryType=GSM_Number then\r
+ begin\r
+ MyListView.Items.Item[number].Subitems.Add(x.subentries[j].Number);\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ case x.Group of\r
+ 0:MyListView.Items.Item[number].Subitems.Add(caller[x.Group+1].text);\r
+ 1:MyListView.Items.Item[number].Subitems.Add(caller[x.Group+1].text);\r
+ 2:MyListView.Items.Item[number].Subitems.Add(caller[x.Group+1].text);\r
+ 3:MyListView.Items.Item[number].Subitems.Add(caller[x.Group+1].text);\r
+ 4:MyListView.Items.Item[number].Subitems.Add(caller[x.Group+1].text);\r
+ else\r
+ MyListView.Items.Item[number].Subitems.Add('not set');\r
+ end;\r
+\r
+ for j:=1 to x.SubEntriesCount do\r
+ begin\r
+ if x.SubEntries[j].EntryType=GSM_Date then\r
+ begin\r
+ MyListView.Items.Item[number].Subitems.Add(\r
+ DayOfweek2(x.SubEntries[j].Date.Day,x.SubEntries[j].Date.Month,x.SubEntries[j].Date.Year)+' '+\r
+ inttostr2(x.SubEntries[j].Date.Day,2)+'-'+inttostr2(x.SubEntries[j].Date.Month,2)+'-'+\r
+ inttostr(x.SubEntries[j].Date.Year));\r
+ MyListView.Items.Item[number].Subitems.Add(\r
+ inttostr2(x.SubEntries[j].Date.Hour,2)+':'+inttostr2(x.SubEntries[j].Date.Minute,2)+':'+\r
+ inttostr2(x.SubEntries[j].Date.Second,2));\r
+ break;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TPhonebookThread.Execute;\r
+var\r
+ x:GSM_PhonebookEntry;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ if (phonebookcur<phonebookstatus.Used+phonebookstatus.Free) then\r
+ begin\r
+ phonebookcur:=phonebookcur+1;\r
+ MainForm.StatusBar1.Panels[0].Text:='Reading '+inttostr(phonebookcur)+'/'+inttostr(phonebookstatus.Free+phonebookstatus.Used);\r
+ MainForm.ListView1.Items.Add;\r
+ MainForm.ListView1.Items.Item[phonebookcur-1].Caption:=inttostr(phonebookcur);\r
+ if (phonebookfound<phonebookstatus.Used) then\r
+ begin\r
+ x.MemoryType:=phonebookstatus.MemoryType;\r
+ x.Location:=phonebookcur;\r
+ if (x.MemoryType=GMT_ON) then x.Location:=x.Location-1;\r
+ if (x.MemoryType=GMT_DC) then x.Location:=x.Location-1;\r
+ if (x.MemoryType=GMT_MC) then x.Location:=x.Location-1;\r
+ if (x.MemoryType=GMT_RC) then x.Location:=x.Location-1;\r
+ if GSM_GetMemoryLocation(@x)=0 then\r
+ begin\r
+\r
+ if (x.MemoryType=GMT_ME) then\r
+ begin\r
+ PhoneBackup.PhonePhonebookUsed:=PhoneBackup.PhonePhonebookUsed+1;\r
+ end;\r
+\r
+ PBKOfflineNumber:=PBKOfflineNumber+1;\r
+ PhoneBackup.PhonePhonebook[PBKOfflineNumber]:=x;\r
+\r
+ if (x.MemoryType=GMT_SM) then\r
+ begin\r
+ PhoneBackup.SIMPhonebookUsed:=PhoneBackup.SIMPhonebookUsed+1;\r
+ PhoneBackup.SIMPhonebook[PhoneBackup.SIMPhonebookUsed]:=x;\r
+ end;\r
+ AddPBKEntry(MainForm.ListView1,x,phonebookcur-1);\r
+ if (x.Name[1]<>chr(0)) then phonebookfound:=phonebookfound+1;\r
+ end;\r
+ end;\r
+ end else\r
+ begin\r
+ MainForm.StatusBar1.Panels[0].Text:=inttostr(phonebookstatus.Used)+'/'+inttostr(phonebookstatus.Free+phonebookstatus.Used)+' entries';\r
+ EndPhonebookThread;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.PhonebookTabSheetShow(Sender: TObject);\r
+begin\r
+ if GSMPhoneConnected then ComboBox1.Enabled:=true;\r
+end;\r
+\r
+procedure TMainForm.Button10Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+ FileHandle:integer;\r
+begin\r
+ if SaveDialog1.Execute then\r
+ begin\r
+ FileHandle := FileCreate(SaveDialog1.FileName);\r
+ for i:=1 to ListView1.Items.Count do\r
+ begin\r
+ FileWrite(FileHandle,ListView1.Items.Item[i].Caption, SizeOf(ListView1.Items.Item[i].Caption));\r
+ end;\r
+ FileClose(FileHandle);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ComboBox1Change(Sender: TObject);\r
+begin\r
+ if (ComboBox1.ItemIndex<>0) then\r
+ begin\r
+ case ComboBox1.ItemIndex of\r
+ 1:phonebookstatus.MemoryType:=GMT_DC;\r
+ 2:phonebookstatus.MemoryType:=GMT_MC;\r
+ 3:phonebookstatus.MemoryType:=GMT_ON;\r
+ 4:phonebookstatus.MemoryType:=GMT_ME;\r
+ 5:phonebookstatus.MemoryType:=GMT_SM;\r
+ 6:phonebookstatus.MemoryType:=GMT_RC;\r
+ end;\r
+ if GSM_GetMemoryStatus(@phonebookstatus)<>0 then\r
+ begin\r
+ phonebookstatus.Free:=0;\r
+ phonebookstatus.Used:=30;\r
+ end;\r
+ phonebookcur:=0;\r
+ phonebookfound:=0;\r
+\r
+ PBKOfflineNumber:=0;\r
+ PhoneBackup.PhonePhonebookUsed:=0;\r
+ PhoneBackup.SIMPhonebookUsed:=0;\r
+ if (phonebookstatus.MemoryType=GMT_ME) then\r
+ begin\r
+ PhoneBackup.PhonePhonebookSize:=phonebookstatus.Free+phonebookstatus.Used;\r
+ end;\r
+ if (phonebookstatus.MemoryType=GMT_SM) then\r
+ begin\r
+ PhoneBackup.SIMPhonebookSize:=phonebookstatus.Free+phonebookstatus.Used;\r
+ end;\r
+\r
+ ComboBox1.Enabled:=false;\r
+\r
+ ReadAllCallerGroups();\r
+\r
+ MainForm.ListView1.Items.Clear;\r
+\r
+ MainForm.Timer2.Enabled:=false;\r
+ PhonebookThread:=TPhonebookThread.Create(false);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.PhonebookTabSheetHide(Sender: TObject);\r
+begin\r
+ EndPhonebookThread;\r
+end;\r
+\r
+//ringtones\r
+procedure TMainForm.Button1Click(Sender: TObject);\r
+var\r
+ ring:GSM_Ringtone;\r
+begin\r
+ if OpenDialog1.Execute then\r
+ begin\r
+ if GSM_ReadRingtoneFile(PChar(OpenDialog1.FileName),@ring)=0 then\r
+ begin\r
+ Edit1.Text:=ring.Name;\r
+ rington:=ring;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure EndPlayRingtoneThread;\r
+begin\r
+ if (PlayRingtoneThread<>nil) then\r
+ begin\r
+ PlayRingtoneThread.Terminate();\r
+ GSM_PlayTone(255*255,0);\r
+ MainForm.Timer2.Enabled:=true;\r
+ PlayRingtoneThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TPlayRingtoneThread.Execute;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ GSM_PlayNote(rington.notes[ringindex]);\r
+ ringindex:=ringindex+1;\r
+ if ringindex>rington.NrNotes then\r
+ EndPlayRingtoneThread;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button16Click(Sender: TObject);\r
+begin\r
+ EndPlayRingtoneThread;\r
+end;\r
+\r
+procedure TMainForm.Button3Click(Sender: TObject);\r
+begin\r
+ ringindex:=1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ PlayRingtoneThread:=TPlayRingtoneThread.Create(false);\r
+end;\r
+\r
+procedure TMainForm.Button2Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+ mybinring:GSM_BinRingtone;\r
+ myring:GSM_Ringtone;\r
+begin\r
+ LogosRingForm.Label1.Caption:='Do you want to set ringtone ?';\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ LogosRingForm.ComboBox3.Items.Clear();\r
+ LogosRingForm.ComboBox3.Items.Add('Preview');\r
+ MainForm.Timer2.Enabled:=false;\r
+ for i:=1 to GSM_GetModelFeature(FN_RINGNUMBER) do\r
+ begin\r
+ mybinring.location:=i;\r
+ if (GSM_GetPhoneRingtone(@mybinring,@myring)=0) then\r
+ begin\r
+ if GSM_GetModelFeature(FN_RINGTONES)=F_RING_SM then\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(myring.name);\r
+ end else\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(mybinring.name);\r
+ end;\r
+ end else\r
+ LogosRingForm.ComboBox3.Items.Add('Location '+inttostr(i));\r
+ end;\r
+ MainForm.Timer2.Enabled:=true;\r
+ LogosRingForm.ComboBox3.ItemIndex:=1;\r
+ LogosRingForm.ShowModal;\r
+ if LogosRingForm.ComboBox3.Visible then\r
+ begin\r
+ if LogosRingForm.ComboBox3.ItemIndex=0 then\r
+ rington.location:=255\r
+ else\r
+ rington.location:=LogosRingForm.ComboBox3.ItemIndex;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_SetRingtone(@rington,@i);\r
+ MainForm.Timer2.Enabled:=true;\r
+ end;\r
+end;\r
+\r
+//phone sheet\r
+procedure TMainForm.PhoneTabSheetShow(Sender: TObject);\r
+var\r
+ xxxx,xxx:array[1..256] of char;\r
+ time:GSM_DateTime;\r
+ siml:GSM_AllSimlocks;\r
+ i:integer;\r
+ code:GSM_SecurityCode;\r
+begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ GSM_GetRevision(@xxx);\r
+ Label9.Caption:=xxx;\r
+ GSM_GetImei(@xxx);\r
+ Label7.Caption:=xxx;\r
+ GSM_GetModel(@xxx);\r
+ GSM_GetModelNumber(@xxx,@xxxx);\r
+ Label5.Caption:=xxx;\r
+ Label5.Caption:=Label5.Caption+' ('+xxxx;\r
+ Label5.Caption:=Label5.Caption+')';\r
+ GSM_GetAlarm(1,@time);\r
+ if time.isSet<>0 then\r
+ CheckBox1.Checked:=true\r
+ else\r
+ CheckBox1.Checked:=false;\r
+ DateTimePicker1.Time:=EncodeTime(time.Hour,time.Minute,0,0);\r
+ ListView8.Items.Clear();\r
+ GSM_GetSimlock(@siml);\r
+ for i:=1 to 4 do\r
+ begin\r
+ MainForm.ListView8.Items.Add;\r
+ MainForm.ListView8.Items.Item[i-1].Caption:=inttostr(i);\r
+ MainForm.ListView8.Items.Item[i-1].Subitems.Add(siml.simlocks[i].data);\r
+ if siml.simlocks[i].enabled=0 then\r
+ MainForm.ListView8.Items.Item[i-1].Subitems.Add('disabled')\r
+ else\r
+ begin\r
+ if siml.simlocks[i].factory<>0 then\r
+ MainForm.ListView8.Items.Item[i-1].Subitems.Add('factory')\r
+ else\r
+ MainForm.ListView8.Items.Item[i-1].Subitems.Add('user');\r
+ end;\r
+ MainForm.ListView8.Items.Item[i-1].Subitems.Add(inttostr(siml.simlocks[i].counter));\r
+ end;\r
+ code.Type2:=GSCT_SecurityCode;\r
+ GSM_GetSecurityCode(@code);\r
+ Label18.Caption:=code.Code;\r
+\r
+ phoneinfo:=true;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button9Click(Sender: TObject);\r
+begin\r
+ GSM_Reset(GSM_SoftReset);\r
+end;\r
+\r
+//speed dials\r
+procedure TMainForm.SpeedTabSheetShow(Sender: TObject);\r
+begin\r
+ if SpeedThread<>nil then\r
+ else begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ MainForm.ListView3.Items.Clear;\r
+ speednum:=1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ SpeedThread:=TSpeedThread.Create(false);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure EndSpeedThread();\r
+begin\r
+ if (SpeedThread<>nil) then\r
+ begin\r
+ SpeedThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ SpeedThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SpeedTabSheetHide(Sender: TObject);\r
+begin\r
+ EndSpeedThread();\r
+end;\r
+\r
+procedure TSpeedThread.Execute;\r
+var\r
+ entry1:GSM_SpeedDial;\r
+ entry2:GSM_PhonebookEntry;\r
+ i:integer;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ entry1.Number:=speednum;\r
+ if GSM_GetSpeedDial(@entry1)=0 then\r
+ begin\r
+ entry2.Location:=entry1.Location;\r
+ entry2.MemoryType:=entry1.MemoryType;\r
+ if entry2.Location=0 then\r
+ entry2.Location:=speednum;\r
+ GSM_GetMemoryLocation(@entry2);\r
+ MainForm.ListView3.Items.Add;\r
+ MainForm.ListView3.Items.Item[speednum-1].Caption:=inttostr(speednum);\r
+ MainForm.ListView3.Items.Item[speednum-1].Subitems.Add(entry2.Name);\r
+ if entry2.Number[1]<>chr(0) then\r
+ MainForm.ListView3.Items.Item[speednum-1].Subitems.Add(entry2.Number)\r
+ else begin\r
+ for i:=1 to entry2.SubEntriesCount do\r
+ begin\r
+ if entry2.SubEntries[i].EntryType=GSM_Number then\r
+ begin\r
+ MainForm.ListView3.Items.Item[speednum-1].Subitems.Add(entry2.SubEntries[i].Number);\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ speednum:=speednum+1;\r
+ end;\r
+ if speednum=10 then\r
+ EndSpeedThread();\r
+ end;\r
+end;\r
+\r
+//calendar\r
+procedure EndCalendarThread();\r
+begin\r
+ if (CalendarThread<>nil) then\r
+ begin\r
+ CalendarThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ CalendarThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure AddCalendarNote(note:GSM_CalendarNote;myview:TListView);\r
+var\r
+ j,z:integer;\r
+ found:boolean;\r
+begin\r
+ myview.Items.Add;\r
+ myview.Items.Item[myview.Items.Count-1].Caption:=inttostr(myview.Items.Count);\r
+ case note.Type2 of\r
+ GCN_Reminder:myview.Items.Item[myview.Items.Count-1].Subitems.Add('Reminder');\r
+ GCN_Call :myview.Items.Item[myview.Items.Count-1].Subitems.Add('Call');\r
+ GCN_Meeting :myview.Items.Item[myview.Items.Count-1].Subitems.Add('Meeting');\r
+ GCN_Birthday:myview.Items.Item[myview.Items.Count-1].Subitems.Add('Birthday');\r
+ end;\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add(note.Text);\r
+\r
+ found:=false;\r
+ if note.Type2=GCN_Call then\r
+ begin\r
+ MainForm.Label14.Caption:=note.Phone;\r
+ for z:=1 to PBKOfflineNumber do\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[z].Number[1]<>chr(0)) then\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[z].Number;\r
+ if (MainForm.Label14.Caption=MainForm.Label16.Caption) then\r
+ begin\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add(PhoneBackup.PhonePhonebook[z].Name);\r
+ found:=true;\r
+ break;\r
+ end;\r
+ end;\r
+ for j:=1 to PhoneBackup.PhonePhonebook[z].SubEntriesCount do\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[z].SubEntries[j].Number;\r
+ if (MainForm.Label14.Caption=MainForm.Label16.Caption) then\r
+ begin\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add(PhoneBackup.PhonePhonebook[z].Name);\r
+ found:=true;\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ if not found then\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add(note.Phone);\r
+\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add(DayOfweek2(note.Time.Day,note.Time.Month,note.Time.Year)+' '+inttostr2(note.Time.Day,2)+'-'+inttostr2(note.Time.Month,2)+'-'+inttostr(note.Time.Year)+' '+inttostr2(note.Time.Hour,2)+':'+inttostr2(note.Time.Minute,2)+':'+inttostr2(note.Time.Second,2));\r
+ if note.Alarm.Year<>0 then\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add(DayOfweek2(note.Alarm.Day,note.Alarm.Month,note.Alarm.Year)+' '+inttostr2(note.Alarm.Day,2)+'-'+inttostr2(note.Alarm.Month,2)+'-'+inttostr(note.Alarm.Year)+' '+inttostr2(note.Alarm.Hour,2)+':'+inttostr2(note.Alarm.Minute,2)+':'+inttostr2(note.Alarm.Second,2))\r
+ else\r
+ myview.Items.Item[myview.Items.Count-1].Subitems.Add('');\r
+end;\r
+\r
+procedure TCalendarThread.Execute;\r
+var\r
+ note:GSM_CalendarNote;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ note.Location:=calendarnum;\r
+ if GSM_GetCalendarNote(@note)=0 then\r
+ begin\r
+ AddCalendarNote(note,MainForm.ListView4);\r
+ calendarnum:=calendarnum+1;\r
+ end else begin\r
+ readcalendar:=true;\r
+ EndCalendarThread();\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.CalendarTabSheetShow(Sender: TObject);\r
+begin\r
+ if CalendarThread=nil then\r
+ begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ if (GSM_GetModelFeature(FN_Calendar)<>0) then\r
+ begin\r
+ ListView4.Enabled:=true;\r
+ ListView4.Ctl3D:=true;\r
+ GroupBox8.Ctl3D:=true;\r
+\r
+ MainForm.ListView4.Items.Clear;\r
+ CalendarNum:=1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ readcalendar:=false;\r
+\r
+ ReadPBKOffline;\r
+\r
+ CalendarThread:=TCalendarThread.Create(false);\r
+ end else\r
+ begin\r
+ ListView4.Enabled:=false;\r
+ ListView4.Ctl3D:=false;\r
+ GroupBox8.Ctl3D:=false;\r
+ end;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.CalendarTabSheetHide(Sender: TObject);\r
+begin\r
+ EndCalendarThread();\r
+end;\r
+\r
+procedure TMainForm.New1Click(Sender: TObject);\r
+var i,j:integer;\r
+begin\r
+ setcalendarnote.Location:=MainForm.ListView4.Items.Count+1;\r
+ CalendarForm.ComboBox1.ItemIndex:=0;\r
+ CalendarForm.ComboBox1.OnSelect(nil);\r
+ CalendarForm.Edit2.Text:='';\r
+ CalendarForm.ComboBox3.Text:='';\r
+ CalendarForm.DateTimePicker1.DateTime:=Date;\r
+ CalendarForm.DateTimePicker3.Time:=Time;\r
+ CalendarForm.DateTimePicker2.DateTime:=Date;\r
+ CalendarForm.DateTimePicker4.Time:=Time;\r
+\r
+ ReadPBKOffline;\r
+ CalendarForm.ComboBox3.Items.Clear;\r
+ CalendarForm.ComboBox3.Sorted:=false;\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[i].Number[1]<>chr(0)) then\r
+ begin\r
+ CalendarForm.ComboBox3.Items.Add(PhoneBackup.PhonePhonebook[i].Name);\r
+ end else\r
+ begin\r
+ for j:=1 to PhoneBackup.PhonePhonebook[i].SubEntriesCount do\r
+ begin\r
+ if PhoneBackup.PhonePhonebook[i].SubEntries[j].EntryType=GSM_Number then\r
+ begin\r
+ CalendarForm.ComboBox3.Items.Add(PhoneBackup.PhonePhonebook[i].Name);\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ CalendarForm.ComboBox3.Sorted:=true;\r
+\r
+ CalendarForm.ShowModal;\r
+end;\r
+\r
+procedure EditCalendarNote;\r
+var i,j,z:integer;\r
+begin\r
+ i:=0;\r
+\r
+ CalendarForm.DateTimePicker1.Date:=EncodeDate(setcalendarnote.Time.Year,\r
+ setcalendarnote.Time.Month,\r
+ setcalendarnote.Time.Day);\r
+ CalendarForm.DateTimePicker3.Time:=EncodeTime(setcalendarnote.Time.Hour,\r
+ setcalendarnote.Time.Minute,\r
+ setcalendarnote.Time.Second,i);\r
+ case setcalendarnote.Type2 of\r
+ GCN_BIRTHDAY: CalendarForm.ComboBox1.ItemIndex:=0;\r
+ GCN_CALL: CalendarForm.ComboBox1.ItemIndex:=1;\r
+ GCN_MEETING: CalendarForm.ComboBox1.ItemIndex:=2;\r
+ GCN_REMINDER: CalendarForm.ComboBox1.ItemIndex:=3;\r
+ end;\r
+\r
+ CalendarForm.Edit2.Text:=setcalendarnote.Text;\r
+ CalendarForm.ComboBox3.Text:=setcalendarnote.Phone;\r
+\r
+ if setcalendarnote.Alarm.Year<>0 then\r
+ begin\r
+ CalendarForm.CheckBox1.checked:=true;\r
+ CalendarForm.DateTimePicker2.Date:=EncodeDate(setcalendarnote.Alarm.Year,\r
+ setcalendarnote.Alarm.Month,\r
+ setcalendarnote.Alarm.Day);\r
+ CalendarForm.DateTimePicker4.Time:=EncodeTime(setcalendarnote.Alarm.Hour,\r
+ setcalendarnote.Alarm.Minute,\r
+ setcalendarnote.Alarm.Second,i);\r
+ end else\r
+ begin\r
+ CalendarForm.CheckBox1.checked:=false;\r
+ CalendarForm.DateTimePicker2.Date:=CalendarForm.DateTimePicker1.Date;\r
+ CalendarForm.DateTimePicker4.Time:=CalendarForm.DateTimePicker3.Time;\r
+ end;\r
+\r
+ if GSM_GetModelFeature(FN_CALENDAR)=F_CAL71 then\r
+ begin\r
+ if setcalendarnote.Type2<>GCN_BIRTHDAY then\r
+ begin\r
+ CalendarForm.CheckBox2.Checked:=True;\r
+ case setcalendarnote.Recurrance of\r
+ 0 :begin\r
+ CalendarForm.CheckBox2.Checked:=False;\r
+ CalendarForm.ComboBox2.Enabled:=False;\r
+ end;\r
+ 1*24 :CalendarForm.ComboBox2.ItemIndex:=0;\r
+ 7*24 :CalendarForm.ComboBox2.ItemIndex:=1;\r
+ 14*24 :CalendarForm.ComboBox2.ItemIndex:=2;\r
+ 365*24:CalendarForm.ComboBox2.ItemIndex:=3;\r
+ end;\r
+ CalendarForm.RadioButton1.Enabled:=False;\r
+ CalendarForm.RadioButton2.Enabled:=False;\r
+ end else begin\r
+ CalendarForm.ComboBox2.ItemIndex:=0;\r
+ CalendarForm.CheckBox2.Checked:=False;\r
+ CalendarForm.ComboBox2.Enabled:=False;\r
+ CalendarForm.RadioButton1.Enabled:=True;\r
+ CalendarForm.RadioButton2.Enabled:=True;\r
+ if setcalendarnote.AlarmType=1 then\r
+ CalendarForm.RadioButton1.Checked:=True\r
+ else\r
+ CalendarForm.RadioButton2.Checked:=True;\r
+ end;\r
+ end;\r
+ CalendarForm.ComboBox1.OnSelect(nil);\r
+\r
+ ReadPBKOffline;\r
+ CalendarForm.ComboBox3.Items.Clear;\r
+ CalendarForm.ComboBox3.Sorted:=false;\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[i].Number[1]<>chr(0)) then\r
+ begin\r
+ CalendarForm.ComboBox3.Items.Add(PhoneBackup.PhonePhonebook[i].Name);\r
+ end else\r
+ begin\r
+ for j:=1 to PhoneBackup.PhonePhonebook[i].SubEntriesCount do\r
+ begin\r
+ if PhoneBackup.PhonePhonebook[i].SubEntries[j].EntryType=GSM_Number then\r
+ begin\r
+ CalendarForm.ComboBox3.Items.Add(PhoneBackup.PhonePhonebook[i].Name);\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ CalendarForm.ComboBox3.Sorted:=true;\r
+\r
+ if setcalendarnote.Type2=GCN_Call then\r
+ begin\r
+ MainForm.Label14.Caption:=setcalendarnote.Phone;\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[i].Number[1]<>chr(0)) then\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[i].Number;\r
+ if (MainForm.Label14.Caption=MainForm.Label16.Caption) then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[i].Name;\r
+ for z:=0 to CalendarForm.ComboBox3.Items.Count do\r
+ begin\r
+ if (MainForm.Label14.Caption=CalendarForm.ComboBox3.Items[z]) then\r
+ begin\r
+ CalendarForm.ComboBox3.ItemIndex:=z;\r
+ break;\r
+ end;\r
+ end;\r
+ break;\r
+ end;\r
+ end;\r
+ for j:=1 to PhoneBackup.PhonePhonebook[i].SubEntriesCount do\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[i].SubEntries[j].Number;\r
+ if (MainForm.Label14.Caption=MainForm.Label16.Caption) then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[i].Name;\r
+ for z:=0 to CalendarForm.ComboBox3.Items.Count do\r
+ begin\r
+ if (MainForm.Label14.Caption=CalendarForm.ComboBox3.Items[z]) then\r
+ begin\r
+ CalendarForm.ComboBox3.ItemIndex:=z;\r
+ break;\r
+ end;\r
+ end;\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ CalendarForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.Edit3Click(Sender: TObject);\r
+begin\r
+ setcalendarnote.Location:=calendarselect;\r
+\r
+ mainform.Timer2.Enabled:=false;\r
+ GSM_GetCalendarNote(@setcalendarnote);\r
+ mainform.Timer2.Enabled:=true;\r
+\r
+ EditCalendarNote;\r
+end;\r
+\r
+procedure TMainForm.ListView4SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+begin\r
+ if Selected then\r
+ begin\r
+ calendarselect:=Item.Index+1;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Delete1Click(Sender: TObject);\r
+begin\r
+// if listview4.selected<>nil then\r
+// begin\r
+ if MessageDlg('Do you want to delete this calendar note ?',\r
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then\r
+ begin\r
+ setcalendarnote.Location:=calendarselect;\r
+ GSM_DeleteCalendarNote(@setcalendarnote);\r
+ MainForm.CalendarTabSheetShow(nil);\r
+ end;\r
+// end;\r
+end;\r
+\r
+//caller groups\r
+procedure EndCallerThread();\r
+begin\r
+ if (CallerThread<>nil) then\r
+ begin\r
+ CallerThread.Terminate();\r
+ CallerThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TCallerThread.Execute;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ ReadCallerGroup();\r
+ if callerinit then EndCallerThread();\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.CallerTabSheetShow(Sender: TObject);\r
+begin\r
+ if CallerThread=nil then\r
+ begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ MainForm.ListView5.Items.Clear;\r
+ callerinit:=false;\r
+ callernum:=1;\r
+ CallerThread:=TCallerThread.Create(false);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.CallerTabSheetHide(Sender: TObject);\r
+begin\r
+ EndCallerThread();\r
+end;\r
+\r
+//smsc\r
+procedure TMainForm.SMSCTabSheetShow(Sender: TObject);\r
+begin\r
+ if SMSCThread<>nil then\r
+ else begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscinit:=false;\r
+ smscnum:=1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ SMSCThread:=TSMSCThread.Create(false);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure SMSCTabHide();\r
+begin\r
+ if (SMSCThread<>nil) then\r
+ begin\r
+ SMSCThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ SMSCThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SMSCTabSheetHide(Sender: TObject);\r
+begin\r
+ SMSCTabHide();\r
+end;\r
+\r
+procedure ReadSMSC();\r
+var\r
+ smsc:GSM_MessageCenter;\r
+begin\r
+ smsc.No:=smscnum;\r
+ MainForm.StatusBar1.Panels[0].Text:='Reading SMSC '+inttostr(smscnum);\r
+ if GSM_GetSMSCenter(@smsc)=0 then\r
+ begin\r
+ SMSC2[smscnum]:=smsc;\r
+ MainForm.ListView6.Items.Add;\r
+ MainForm.ListView6.Items.Item[smscnum-1].Caption:=inttostr(smscnum);\r
+ MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add(smsc.name);\r
+ MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add(smsc.number);\r
+ case smsc.Validity of\r
+ GSMV_1_Hour : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('1 hour');\r
+ GSMV_6_Hours : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('6 hours');\r
+ GSMV_24_Hours : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('1 day');\r
+ GSMV_72_Hours : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('3 days');\r
+ GSMV_1_Week : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('1 week');\r
+ GSMV_Max_Time : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('max. time');\r
+ else\r
+ MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('unknown');\r
+ end;\r
+ case smsc.Format of\r
+ GSMF_Text : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('text');\r
+ GSMF_Fax : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('fax');\r
+ GSMF_Voice : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('voice');\r
+ GSMF_ERMES : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('ERMES');\r
+ GSMF_Paging : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('paging');\r
+ GSMF_UCI : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('UCI');\r
+ GSMF_Email : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('email');\r
+ GSMF_X400 : MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('X400');\r
+ else\r
+ MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add('unknown');\r
+ end;\r
+ MainForm.ListView6.Items.Item[smscnum-1].Subitems.Add(smsc.defaultrecipient);\r
+ smscnum:=smscnum+1;\r
+ end else\r
+ begin\r
+ MainForm.StatusBar1.Panels[0].Text:='';\r
+ smscinit:=true;\r
+ end;\r
+end;\r
+\r
+procedure TSMSCThread.Execute;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ ReadSMSC();\r
+ if smscinit then SMSCTabHide();\r
+ end;\r
+end;\r
+\r
+//profiles\r
+procedure ProfileTabHide();\r
+begin\r
+ if (ProfileThread<>nil) then\r
+ begin\r
+ ProfileThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ ProfileThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TProfileThread.Execute;\r
+var\r
+ profile:GSM_Profile;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ profile.number:=profilenum-1;\r
+ GSM_GetProfile(@profile);\r
+ MainForm.ListView7.Items.Add;\r
+ MainForm.ListView7.Items.Item[profilenum-1].Caption:=inttostr(profilenum);\r
+ MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add(profile.name);\r
+ case profile.CallAlert of\r
+ PROFILE_CALLALERT_RINGING :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('ringing');\r
+ PROFILE_CALLALERT_BEEPONCE :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('beep once');\r
+ PROFILE_CALLALERT_OFF :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('off');\r
+ PROFILE_CALLALERT_RINGONCE :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('ring once');\r
+ PROFILE_CALLALERT_ASCENDING:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('ascending');\r
+ PROFILE_CALLALERT_CALLERGROUPS:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('caller groups');\r
+ end;\r
+ MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add(inttostr(profile.Ringtone));\r
+ case profile.Volume of\r
+ PROFILE_VOLUME_LEVEL1:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 1');\r
+ PROFILE_VOLUME_LEVEL2:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 2');\r
+ PROFILE_VOLUME_LEVEL3:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 3');\r
+ PROFILE_VOLUME_LEVEL4:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 4');\r
+ PROFILE_VOLUME_LEVEL5:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 5');\r
+ end;\r
+ case profile.Vibration of\r
+ PROFILE_VIBRATION_OFF :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('off');\r
+ PROFILE_VIBRATION_ON :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('on');\r
+ PROFILE_VIBRATION_FIRST:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('vibrate first');\r
+ end;\r
+ case profile.MessageTone of\r
+ PROFILE_MESSAGE_NOTONE :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('no tone');\r
+ PROFILE_MESSAGE_STANDARD :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('standard');\r
+ PROFILE_MESSAGE_SPECIAL :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('special');\r
+ PROFILE_MESSAGE_BEEPONCE :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('beep once');\r
+ PROFILE_MESSAGE_ASCENDING:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('ascending');\r
+ end;\r
+ case profile.KeypadTone of\r
+ PROFILE_KEYPAD_OFF :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('off');\r
+ PROFILE_KEYPAD_LEVEL1:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 1');\r
+ PROFILE_KEYPAD_LEVEL2:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 2');\r
+ PROFILE_KEYPAD_LEVEL3:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('volume 3');\r
+ end;\r
+ case profile.WarningTone of\r
+ PROFILE_WARNING_OFF:MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('off');\r
+ PROFILE_WARNING_ON :MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add('on');\r
+ end;\r
+ MainForm.ListView7.Items.Item[profilenum-1].Subitems.Add(inttostr(profile.CallerGroups));\r
+ profilenum:=profilenum+1;\r
+ case GSM_GetModelFeature(FN_PROFILES) of\r
+ F_PROF61:if profilenum=8 then ProfileTabHide();\r
+ F_PROF51:if profilenum=3 then ProfileTabHide();\r
+ F_PROF33:if profilenum=7 then ProfileTabHide();\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ProfileTabSheetShow(Sender: TObject);\r
+begin\r
+ if ProfileThread<>nil then\r
+ else begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ MainForm.ListView7.Items.Clear;\r
+ profilenum:=1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ ProfileThread:=TProfileThread.Create(false);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ProfileTabSheetHide(Sender: TObject);\r
+begin\r
+ ProfileTabHide();\r
+end;\r
+\r
+//sms\r
+procedure AddSMSInfo(myobject:TListView;mysms:GSM_SMSMessage);\r
+var number,i,z:integer;\r
+ found:boolean;\r
+begin\r
+ number:=myobject.Items.Count;\r
+\r
+ myobject.Items.Add;\r
+ myobject.Items.Item[number].Caption:=inttostr(number+1);\r
+ myobject.Items.Item[number].Subitems.Add(mysms.MessageText);\r
+\r
+ found:=false;\r
+ for z:=1 to PBKOfflineNumber do\r
+ begin\r
+ mainform.Label14.Caption:=mysms.Sender;\r
+ mainform.Label16.Caption:=PhoneBackup.PhonePhonebook[z].Number;\r
+ if (PhoneBackup.PhonePhonebook[z].Number[1]<>chr(0)) then\r
+ begin\r
+ if (mainform.Label14.Caption=mainform.Label16.Caption) then\r
+ begin\r
+ myobject.Items.Item[number].Subitems.Add(PhoneBackup.PhonePhonebook[z].Name);\r
+ found:=true;\r
+ break;\r
+ end;\r
+ end;\r
+ for i:=1 to PhoneBackup.PhonePhonebook[z].SubEntriesCount do\r
+ begin\r
+ mainform.Label16.Caption:=PhoneBackup.PhonePhonebook[z].SubEntries[i].Number;\r
+ if (PhoneBackup.PhonePhonebook[z].SubEntries[i].EntryType=GSM_Number)\r
+ and (mainform.Label14.Caption=mainform.Label16.Caption) then\r
+ begin\r
+ myobject.Items.Item[number].Subitems.Add(PhoneBackup.PhonePhonebook[z].Name);\r
+ found:=true;\r
+ break;\r
+ end;\r
+ end;\r
+ if found then break;\r
+ end;\r
+ if not found then myobject.Items.Item[number].Subitems.Add(mysms.Sender);\r
+\r
+ if mysms.SMSData=1 then\r
+ begin\r
+ myobject.Items.Item[number].Subitems.Add(DayOfweek2(mysms.Time.Day,mysms.Time.Month,mysms.Time.Year)+' '+inttostr2(mysms.Time.Day,2)+'-'+inttostr2(mysms.Time.Month,2)+'-'+inttostr(mysms.Time.Year));\r
+ myobject.Items.Item[number].Subitems.Add(inttostr2(mysms.Time.Hour,2)+':'+inttostr2(mysms.Time.Minute,2)+':'+inttostr2(mysms.Time.Second,2));\r
+ end;\r
+end;\r
+\r
+procedure DisplaySMSfolder();\r
+var\r
+ i:integer;\r
+begin\r
+ MainForm.ListView2.Items.Clear();\r
+ i:=0;\r
+ while i<>SMSstatus.Number do\r
+ begin\r
+ i:=i+1;\r
+ if (SMSfolders.Folder[SMS[i].folder].Name=\r
+ SMSfolders.Folder[MainForm.ComboBox3.ItemIndex].Name) then\r
+ begin\r
+ AddSMSInfo(MainForm.ListView2,SMS[i]);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure SendSaveSMS(mysms:GSM_SMSMessage);\r
+var i,j,z:integer;\r
+begin\r
+ //text\r
+ SMSEditForm.Memo1.Text:=mysms.MessageText;\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:=mysms.sender;\r
+ AddSMSEditSenderList;\r
+ MainForm.Label14.Caption:=mysms.sender;\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[i].Number[1]<>chr(0)) then\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[i].Number;\r
+ if (MainForm.Label14.Caption=MainForm.Label16.Caption) then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[i].Name;\r
+ for z:=0 to SMSEditForm.ComboBox9.Items.Count do\r
+ begin\r
+ if (MainForm.Label14.Caption=SMSEditForm.ComboBox9.Items[z]) then\r
+ begin\r
+ SMSEditForm.ComboBox9.ItemIndex:=z;\r
+ break;\r
+ end;\r
+ end;\r
+ break;\r
+ end;\r
+ end;\r
+ for j:=1 to PhoneBackup.PhonePhonebook[i].SubEntriesCount do\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[i].SubEntries[j].Number;\r
+ if (MainForm.Label14.Caption=MainForm.Label16.Caption) then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[i].Name;\r
+ for z:=0 to SMSEditForm.ComboBox9.Items.Count do\r
+ begin\r
+ if (MainForm.Label14.Caption=SMSEditForm.ComboBox9.Items[z]) then\r
+ begin\r
+ SMSEditForm.ComboBox9.ItemIndex:=z;\r
+ break;\r
+ end;\r
+ end;\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ //sms folder\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=0 to MainForm.ComboBox3.items.count-1 do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(MainForm.ComboBox3.Items.Strings[i]);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=MainForm.ComboBox3.ItemIndex;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=0;\r
+\r
+ if mysms.ReplyViaSameSMSC<>0 then\r
+ SMSEditForm.CheckBox3.Checked:=true\r
+ else\r
+ SMSEditForm.CheckBox3.Checked:=false;\r
+\r
+ if mysms.Class2=1 then\r
+ SMSEditForm.CheckBox1.Checked:=true\r
+ else\r
+ SMSEditForm.CheckBox1.Checked:=false;\r
+\r
+ if mysms.status=GSS_SENTREAD then\r
+ SMSEditForm.CheckBox4.Checked:=true\r
+ else\r
+ SMSEditForm.CheckBox4.Checked:=false;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PbkSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.TextSMSTabSheet;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.Edit4Click(Sender: TObject);\r
+begin\r
+ setsmslocation:=SMS[smsnumindex].Location;\r
+ SendSaveSMS(SMS[smsnumindex]);\r
+end;\r
+\r
+procedure TMainForm.New2Click(Sender: TObject);\r
+var i:integer;\r
+begin\r
+ setsmslocation:=0;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+\r
+ //folders\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=0 to ComboBox3.items.count-1 do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(ComboBox3.Items.Strings[i]);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=ComboBox3.ItemIndex;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.TextSMSTabSheet;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure EndSMSThread;\r
+begin\r
+ if (SMSThread<>nil) then\r
+ begin\r
+ SMSThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ SMSThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TSMSThread.Execute;\r
+var\r
+ error:integer;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ if SMSnum<>SMSstatus.Number then\r
+ begin\r
+ if GSM_GetModelFeature(FN_SMS)=F_SMS71 then\r
+ SMS[SMSnum+1].Location:=0\r
+ else\r
+ SMS[SMSnum+1].Location:=smsnum2;\r
+ error:=GSM_GetSMSMessage(@SMS[SMSnum+1]);\r
+ if error=0 then\r
+ begin\r
+ if SMS[SMSnum+1].Time.year<1900 then\r
+ begin\r
+ SMS[SMSnum+1].Time.year:=SMS[SMSnum+1].Time.year+2000;\r
+ end;\r
+ if (SMSfolders.Folder[SMS[SMSnum+1].folder].Name=\r
+ SMSfolders.Folder[MainForm.ComboBox3.ItemIndex].Name) then\r
+ begin\r
+ AddSMSInfo(MainForm.ListView2,SMS[SMSnum+1]);\r
+ end;\r
+ SMSnum:=SMSnum+1;\r
+ end;\r
+ if error=GE_SMSTOOLONG then\r
+ begin\r
+ SMSstatus.Number:=SMSstatus.Number-1;\r
+ end;\r
+\r
+ smsnum2:=smsnum2+1;\r
+ end else\r
+ begin\r
+ MainForm.ComboBox3.Enabled:=true;\r
+ EndSMSThread;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SMSTabSheetShow(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ MainForm.ComboBox3.Enabled:=false;\r
+ if GSMPhoneConnected then\r
+ begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ MainForm.Memo1.Lines.Clear;\r
+ MainForm.Memo2.Lines.Clear;\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ MainForm.ComboBox3.Items.Clear();\r
+ for i:=1 to SMSfolders.number do\r
+ begin\r
+ MainForm.ComboBox3.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ MainForm.ComboBox3.ItemIndex:=0;\r
+\r
+ SMSnum:=0;\r
+ GSM_GetSMSStatus(@SMSstatus);\r
+ smsnum2:=1;\r
+ MainForm.ListView2.Items.Clear;\r
+ MainForm.Timer2.Enabled:=false;\r
+ ReadPBKOffline;\r
+ SMSThread:=TSMSThread.Create(false);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ComboBox3Change(Sender: TObject);\r
+begin\r
+ ReadPBKOffline;\r
+ DisplaySMSfolder();\r
+end;\r
+\r
+procedure AddSMSDescription(mysms:GSM_SMSMessage;firstmemo:TMemo;secondmemo:TMemo);\r
+var\r
+ ch:tcaption;\r
+ z:integer;\r
+begin\r
+ firstmemo.Lines.Clear;\r
+ firstmemo.Lines.Add(pchar('Sender: '+mysms.Sender));\r
+\r
+ if mysms.SMSData=1 then\r
+ begin\r
+ ch:=mysms.MessageCenter.Number;\r
+ MainForm.Label14.Caption:=mysms.MessageCenter.Number;\r
+ if (smscinit) and (GSMPhoneConnected) then\r
+ begin\r
+ for z:=1 to smscnum-1 do\r
+ begin\r
+ MainForm.Label16.Caption:=SMSC2[z].Number;\r
+ if MainForm.Label14.Caption=MainForm.Label16.caption then\r
+ ch:=SMSC2[z].Name;\r
+ end;\r
+ end;\r
+ if mysms.ReplyViaSameSMSC<>0 then\r
+ ch:=' (reply via the same SMSC) '+ch;\r
+ firstmemo.Lines.Add('SMSC: '+ch);\r
+\r
+ if (mysms.type2=GST_DR) and (mysms.MessageText[1]='D') then\r
+ begin\r
+ firstmemo.Lines.Add(pchar('Date & time: '+\r
+ DayOfweek2(mysms.Time.Day,mysms.Time.Month,mysms.Time.Year)+' '+inttostr2(mysms.Time.Day,2)+'-'+inttostr2(mysms.Time.Month,2)+'-'+inttostr(mysms.Time.Year)+' '+\r
+ inttostr2(mysms.Time.Hour,2)+':'+inttostr2(mysms.Time.Minute,2)+':'+inttostr2(mysms.Time.Second,2))+\r
+ ' SMSC response date & time: '+\r
+ DayOfweek2(mysms.SMSCTime.Day,mysms.SMSCTime.Month,mysms.SMSCTime.Year)+' '+inttostr2(mysms.SMSCTime.Day,2)+'-'+inttostr2(mysms.SMSCTime.Month,2)+'-'+inttostr(mysms.SMSCTime.Year)+' '+\r
+ inttostr2(mysms.SMSCTime.Hour,2)+':'+inttostr2(mysms.SMSCTime.Minute,2)+':'+inttostr2(mysms.SMSCTime.Second,2));\r
+ end else\r
+ begin\r
+ firstmemo.Lines.Add(pchar('Date & time: '+\r
+ DayOfweek2(mysms.Time.Day,mysms.Time.Month,mysms.Time.Year)+' '+inttostr2(mysms.Time.Day,2)+'-'+inttostr2(mysms.Time.Month,2)+'-'+inttostr(mysms.Time.Year)+' '+\r
+ inttostr2(mysms.Time.Hour,2)+':'+inttostr2(mysms.Time.Minute,2)+':'+inttostr2(mysms.Time.Second,2)));\r
+ end;\r
+ end;\r
+\r
+ secondmemo.Lines.Clear;\r
+ secondmemo.Lines.Add(pchar(''+mysms.MessageText));\r
+end;\r
+\r
+procedure TMainForm.ListView2SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+var\r
+ i:integer;\r
+ j:integer;\r
+begin\r
+ j:=0;\r
+ i:=0;\r
+ while i<>SMSstatus.Number do\r
+ begin\r
+ i:=i+1;\r
+ if (SMSfolders.Folder[SMS[i].folder].Name=\r
+ SMSfolders.Folder[MainForm.ComboBox3.ItemIndex].Name) then\r
+ begin\r
+ if (j=MainForm.ListView2.ItemIndex) then\r
+ begin\r
+ smsnumindex:=i;\r
+ AddSMSDescription(SMS[i],MainForm.Memo1,MainForm.Memo2);\r
+ end;\r
+ j:=j+1;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SMSTabSheetHide(Sender: TObject);\r
+begin\r
+ EndSMSThread;\r
+end;\r
+\r
+procedure TMainForm.SMSPopupMenuPopup(Sender: TObject);\r
+begin\r
+ New2.Enabled:=false;\r
+ Edit4.Enabled:=false;\r
+ CopyToPC1.Enabled:=false;\r
+ Delete2.Enabled:=false;\r
+ if GSMPhoneConnected then\r
+ begin\r
+ New2.Enabled:=true;\r
+ if listview2.selected<>nil then\r
+ begin\r
+ Edit4.Enabled:=true;\r
+ CopyToPC1.Enabled:=true;\r
+ Delete2.Enabled:=true;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.CalendarPopupMenuPopup(Sender: TObject);\r
+begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ New1.Enabled:=true;\r
+ if listview4.selected<>nil then\r
+ begin\r
+ Edit3.Enabled:=true;\r
+ Delete1.Enabled:=true;\r
+ SMS1.Enabled:=true;\r
+ CopyToPC2.Enabled:=true;\r
+ end else\r
+ begin\r
+ Edit3.Enabled:=false;\r
+ Delete1.Enabled:=false;\r
+ SMS1.Enabled:=false;\r
+ CopyToPC2.Enabled:=false;\r
+ end;\r
+ end else\r
+ begin\r
+ New1.Enabled:=false;\r
+ Delete1.Enabled:=false;\r
+ Edit3.Enabled:=false;\r
+ SMS1.Enabled:=false;\r
+ CopyToPC2.Enabled:=false;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Edit1Change(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ for i:=1 to 20 do\r
+ rington.name[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(edit1.text)) do\r
+ rington.name[i]:=edit1.text[i];\r
+end;\r
+\r
+procedure TMainForm.Delete2Click(Sender: TObject);\r
+var\r
+ mysms:GSM_SMSMessage;\r
+begin\r
+ if MessageDlg('Do you want to delete this SMS ?',\r
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then\r
+ begin\r
+ mysms.Location:=SMS[smsnumindex].Location;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_DeleteSMSMessage(@mysms);\r
+ MainForm.Timer2.Enabled:=true;\r
+ MainForm.SMSTabSheetShow(nil);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Edit5Click(Sender: TObject);\r
+begin\r
+// if listview6.selected<>nil then\r
+// begin\r
+ smsceditform.edit1.Text:=smsc2[smscselectitem].name;\r
+ smsceditform.edit2.Text:=smsc2[smscselectitem].number;\r
+ smsceditform.edit3.Text:=smsc2[smscselectitem].DefaultRecipient;\r
+ case smsc2[smscselectitem].Validity of\r
+ GSMV_1_Hour : SMSCEditForm.combobox1.itemindex:=0;\r
+ GSMV_6_Hours : SMSCEditForm.combobox1.itemindex:=1;\r
+ GSMV_24_Hours : SMSCEditForm.combobox1.itemindex:=2;\r
+ GSMV_72_Hours : SMSCEditForm.combobox1.itemindex:=3;\r
+ GSMV_1_Week : SMSCEditForm.combobox1.itemindex:=4;\r
+ else\r
+ SMSCEditForm.combobox1.itemindex:=5;\r
+ end;\r
+ case smsc2[smscselectitem].Format of\r
+ GSMF_Text : SMSCEditForm.combobox2.itemindex:=0;\r
+ GSMF_Fax : SMSCEditForm.combobox2.itemindex:=1;\r
+ GSMF_Email : SMSCEditForm.combobox2.itemindex:=2;\r
+ else\r
+ SMSCEditForm.combobox2.itemindex:=3;\r
+ end;\r
+ SMSCEditForm.ShowModal;\r
+// end;\r
+end;\r
+\r
+procedure TMainForm.SMSCPopupMenuPopup(Sender: TObject);\r
+begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ if listview6.selected<>nil then\r
+ Edit5.Enabled:=true\r
+ else\r
+ Edit5.Enabled:=false;\r
+ end else\r
+ begin\r
+ Edit5.Enabled:=false;\r
+ end;\r
+\r
+end;\r
+\r
+procedure TMainForm.ListView6SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+begin\r
+ if Selected then\r
+ begin\r
+ smscselectitem:=Item.Index+1;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ListView1SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+begin\r
+ if Selected then\r
+ begin\r
+ pbknumberentry:=Item.Index+1;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Edit7Click(Sender: TObject);\r
+var\r
+ current:integer;\r
+ i:integer;\r
+begin\r
+// if listview1.Selected<>nil then\r
+// begin\r
+ pbk.Location:=pbknumberentry;\r
+ case ComboBox1.ItemIndex of\r
+ 1:begin pbk.MemoryType:=GMT_DC;pbk.Location:=pbk.Location-1;end;\r
+ 2:begin pbk.MemoryType:=GMT_MC;pbk.Location:=pbk.Location-1;end;\r
+ 3:begin pbk.MemoryType:=GMT_ON;pbk.Location:=pbk.Location-1;end;\r
+ 4:pbk.MemoryType:=GMT_ME;\r
+ 5:pbk.MemoryType:=GMT_SM;\r
+ 6:begin pbk.MemoryType:=GMT_RC;pbk.Location:=pbk.Location-1;end;\r
+ end;\r
+ GSM_GetMemoryLocation(@pbk);\r
+ current:=0;\r
+ pbkform.ListView1.Items.Clear;\r
+ pbkform.ListView1.Items.Add;\r
+ pbkform.ListView1.Items.Item[0].Caption:='Name';\r
+ pbkform.ListView1.Items.Item[0].SubItems.Add(pbk.name);\r
+ if (pbk.Number[1]<>chr(0)) then\r
+ begin\r
+ current:=current+1;\r
+ pbkform.ListView1.Items.Add;\r
+ pbkform.ListView1.Items.Item[current].Caption:='Number';\r
+ pbkform.ListView1.Items.Item[current].SubItems.Add(pbk.number);\r
+ end;\r
+ for i:=1 to pbk.SubEntriesCount do\r
+ begin\r
+ current:=current+1;\r
+ pbkform.ListView1.Items.Add;\r
+ case pbk.SubEntries[i].EntryType of\r
+ GSM_Number:case pbk.SubEntries[i].NumberType of\r
+ GSM_General :pbkform.ListView1.Items.Item[current].Caption:='General number';\r
+ GSM_General2:pbkform.ListView1.Items.Item[current].Caption:='General number';\r
+ GSM_Mobile :pbkform.ListView1.Items.Item[current].Caption:='Mobile';\r
+ GSM_Work :pbkform.ListView1.Items.Item[current].Caption:='Work';\r
+ GSM_Fax :pbkform.ListView1.Items.Item[current].Caption:='Fax';\r
+ GSM_Home :pbkform.ListView1.Items.Item[current].Caption:='Home';\r
+ else\r
+ pbkform.ListView1.Items.Item[current].Caption:=inttostr(pbk.SubEntries[i].NumberType);\r
+ end;\r
+ GSM_Note :pbkform.ListView1.Items.Item[current].Caption:='Note';\r
+ GSM_Postal:pbkform.ListView1.Items.Item[current].Caption:='Address';\r
+ GSM_Email :pbkform.ListView1.Items.Item[current].Caption:='Email';\r
+ GSM_Date :begin\r
+ pbkform.ListView1.Items.Item[current].Caption:='Date';\r
+ pbkform.ListView1.Items.Item[current].SubItems.Add(DayOfweek2(pbk.SubEntries[i].Date.Day,pbk.SubEntries[i].Date.Month,pbk.SubEntries[i].Date.Year)+' '+inttostr2(pbk.SubEntries[i].Date.Day,2)+'-'+inttostr2(pbk.SubEntries[i].Date.Month,2)+'-'+inttostr(pbk.SubEntries[i].Date.Year)+' '+inttostr2(pbk.SubEntries[i].Date.Hour,2)+':'+inttostr2(pbk.SubEntries[i].Date.Minute,2)+':'+inttostr2(pbk.SubEntries[i].Date.Second,2));\r
+ end;\r
+ end;\r
+ if (pbk.SubEntries[i].EntryType<>GSM_Date) then\r
+ pbkform.ListView1.Items.Item[current].SubItems.Add(pbk.SubEntries[i].Number);\r
+ end;\r
+\r
+ if (pbk.Group>=0) and (pbk.Group<=4) then\r
+ begin\r
+ current:=current+1;\r
+ pbkform.ListView1.Items.Add;\r
+ pbkform.ListView1.Items.Item[current].Caption:='Caller group';\r
+ pbkform.ListView1.Items.Item[current].SubItems.Add(caller[pbk.Group+1].text);\r
+ end;\r
+ pbkform.showmodal;\r
+// end;\r
+end;\r
+\r
+procedure TMainForm.Button18Click(Sender: TObject);\r
+var\r
+ i,j:integer;\r
+ Name,Data:array[1..255] of char;\r
+begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+ \r
+ //folders\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=1 to SMSFolders.number do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=0;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.BitmapSMSTabSheet;\r
+\r
+ SMSEditForm.Image1.Picture:=Image1.Picture;\r
+\r
+ SMSEditForm.Memo2.Text:='';\r
+ SMSEditForm.CheckBox5.Checked:=false;\r
+ if bitma.type2<>GSM_PictureImage then\r
+ begin\r
+ SMSEditForm.Memo2.Visible:=false;\r
+ SMSEditForm.Label10.Visible:=false;\r
+ SMSEditForm.CheckBox5.Visible:=false;\r
+ SMSEditForm.CheckBox6.Visible:=false;\r
+ end else\r
+ begin\r
+ SMSEditForm.Memo2.Visible:=true;\r
+ SMSEditForm.Label10.Visible:=true;\r
+ SMSEditForm.CheckBox5.Visible:=true;\r
+ SMSEditForm.CheckBox6.Visible:=true;\r
+ end;\r
+\r
+ SMSEditForm.Label9.Visible:=false;\r
+ SMSEditForm.ComboBox7.Visible:=false;\r
+ if bitma.type2=GSM_OperatorLogo then\r
+ begin\r
+ SMSEditForm.Label9.Visible:=true;\r
+ SMSEditForm.ComboBox7.Visible:=true;\r
+ //preparing network names\r
+ i:=0;\r
+ while true do\r
+ begin\r
+ GSM_GetNetworkData(i,@Name,@Data);\r
+\r
+ // conversion problems\r
+ Label14.Caption:=Name;\r
+ if strcomp(PChar(Label14.Caption),PChar('unknown'))=0 then break;\r
+\r
+ // conversion problems\r
+ Label14.Caption:=' - '+Label14.Caption;\r
+ for j:=6 downto 1 do\r
+ begin\r
+ Label14.Caption:=Data[j]+Label14.Caption;\r
+ end;\r
+\r
+ SMSEditForm.ComboBox7.Items.Add(Pchar(Label14.Caption));\r
+ i:=i+1;\r
+ end;\r
+ //looking for current network\r
+ if GSMPhoneConnected then\r
+ begin\r
+ // conversion problems\r
+ Label14.Caption:=MainForm.StatusBar1.Panels[1].Text;\r
+ Label14.Caption:=' - '+Label14.Caption;\r
+ for j:=6 downto 1 do\r
+ begin\r
+ Label14.Caption:=GSMNetworkInfo.NetworkCode[j]+Label14.Caption;\r
+ end;\r
+\r
+ i:=1;\r
+ while true do\r
+ begin\r
+ if strcomp(pchar(SMSEditForm.ComboBox7.Items[i]),pchar(Label14.Caption))=0\r
+ then break;\r
+ i:=i+1;\r
+ end;\r
+ SMSEditForm.ComboBox7.ItemIndex:=i;\r
+ end;\r
+ end;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.Button17Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+ \r
+ //folders\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=1 to SMSFolders.number do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=0;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.RingtoneSMSTabSheet;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.SMS1Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+ \r
+ //folders\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=1 to SMSFolders.number do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=0;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.CalendarSMSTabSheet;\r
+\r
+ calenda.Location:=calendarselect;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetCalendarNote(@calenda);\r
+ MainForm.Timer2.Enabled:=true;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.SMSSendSave1Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+ \r
+ //folders\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=1 to SMSFolders.number do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=0;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.PBKSMSTabSheet;\r
+\r
+ pbk.Location:=pbknumberentry-1;\r
+ case ComboBox1.ItemIndex of\r
+ 1:pbk.MemoryType:=GMT_DC;\r
+ 2:pbk.MemoryType:=GMT_MC;\r
+ 3:pbk.MemoryType:=GMT_ON;\r
+ 4:pbk.MemoryType:=GMT_ME;\r
+ 5:pbk.MemoryType:=GMT_SM;\r
+ 6:pbk.MemoryType:=GMT_RC;\r
+ end;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetMemoryLocation(@pbk);\r
+ MainForm.Timer2.Enabled:=true;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.Button13Click(Sender: TObject);\r
+var\r
+ ring:GSM_BinRingtone;\r
+begin\r
+ if OpenDialog1.Execute then\r
+ begin\r
+ if GSM_ReadBinRingtoneFile(PChar(OpenDialog1.FileName),@ring)=0 then\r
+ begin\r
+ Edit2.Text:=ring.Name;\r
+ binring:=ring;\r
+ end;\r
+ end;\r
+\r
+end;\r
+\r
+procedure TMainForm.Button14Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+ mybinring:GSM_BinRingtone;\r
+ myring:GSM_Ringtone;\r
+begin\r
+ LogosRingForm.Label1.Caption:='Do you want to set ringtone ?';\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ LogosRingForm.ComboBox3.Items.Clear();\r
+ MainForm.Timer2.Enabled:=false;\r
+ for i:=1 to GSM_GetModelFeature(FN_RINGNUMBER) do\r
+ begin\r
+ mybinring.location:=i;\r
+ if (GSM_GetPhoneRingtone(@mybinring,@myring)=0) then\r
+ begin\r
+ if GSM_GetModelFeature(FN_RINGTONES)=F_RING_SM then\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(myring.name);\r
+ end else\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(mybinring.name);\r
+ end;\r
+ end else\r
+ LogosRingForm.ComboBox3.Items.Add('Location '+inttostr(i));\r
+ end;\r
+ MainForm.Timer2.Enabled:=true;\r
+ LogosRingForm.ComboBox3.ItemIndex:=0;\r
+ LogosRingForm.ShowModal;\r
+ if LogosRingForm.ComboBox3.Visible then\r
+ begin\r
+ binring.location:=LogosRingForm.ComboBox3.ItemIndex+1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_SetBinRingtone(@binring);\r
+ MainForm.Timer2.Enabled:=true;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ConfigTabSheetHide(Sender: TObject);\r
+var\r
+ MyIniFile: TIniFile;\r
+begin\r
+ if MessageDlg('Do you want to save config ?',\r
+ mtConfirmation, [mbYes, mbNo], 0) = mrYes then\r
+ begin\r
+ MyIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'\gnokiirc');\r
+ case MainForm.ComboBox4.ItemIndex of\r
+ 0:MyIniFile.WriteString('global', 'connection', 'mbus');\r
+ 1:MyIniFile.WriteString('global', 'connection', 'fbus');\r
+ 2:MyIniFile.WriteString('global', 'connection', 'dlr3');\r
+ 3:MyIniFile.WriteString('global', 'connection', 'infrared');\r
+ end;\r
+ MyIniFile.WriteString('global', 'model', MainForm.ComboBox6.Text);\r
+ MyIniFile.WriteString('global', 'port', MainForm.ComboBox5.Text);\r
+ if MainForm.CheckBox2.Checked then\r
+ MyIniFile.WriteString('global', 'synchronizetime', 'yes')\r
+ else\r
+ MyIniFile.WriteString('global', 'synchronizetime', 'no');\r
+ MyIniFile.Free;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ConfigTabSheetShow(Sender: TObject);\r
+var\r
+ MyIniFile: TIniFile;\r
+ x:string;\r
+ i:integer;\r
+begin\r
+ MyIniFile := TIniFile.Create(ExtractFilePath(Application.ExeName)+'\gnokiirc');\r
+\r
+ x:=MyInifile.ReadString('global', 'connection', 'fbus');\r
+ MainForm.ComboBox4.ItemIndex:=0;\r
+ if x='fbus' then MainForm.ComboBox4.ItemIndex:=1;\r
+ if x='dlr3' then MainForm.ComboBox4.ItemIndex:=2;\r
+ if x='infrared' then MainForm.ComboBox4.ItemIndex:=3;\r
+\r
+ x:=MyInifile.ReadString('global', 'port', 'com2:');\r
+ MainForm.ComboBox5.ItemIndex:=0;\r
+ for i:=1 to MainForm.ComboBox5.Items.Count do\r
+ begin\r
+ if MainForm.ComboBox5.Items.Strings[i-1]=x then\r
+ MainForm.ComboBox5.ItemIndex:=i-1;\r
+ end;\r
+\r
+ x:=MyInifile.ReadString('global', 'model', 'auto');\r
+ MainForm.ComboBox6.ItemIndex:=0;\r
+ for i:=1 to MainForm.ComboBox6.Items.Count do\r
+ begin\r
+ if MainForm.ComboBox6.Items.Strings[i-1]=x then\r
+ MainForm.ComboBox6.ItemIndex:=i-1;\r
+ end;\r
+\r
+ x:=MyInifile.ReadString('global', 'synchronizetime', 'no');\r
+ if x='yes' then\r
+ MainForm.CheckBox2.Checked:=True\r
+ else\r
+ MainForm.CheckBox2.Checked:=False;\r
+ MyIniFile.Free;\r
+end;\r
+\r
+procedure TMainForm.Timer2Timer(Sender: TObject);\r
+begin\r
+ if SparkyThread.Suspended then SparkyThread.Resume;\r
+ Timer2.Interval:=2000;\r
+end;\r
+\r
+procedure TMainForm.AboutTabSheetShow(Sender: TObject);\r
+var\r
+ xxx:array[1..256] of char;\r
+begin\r
+ GSM_GetDLLVersion(@xxx);\r
+ Label20.Caption:=xxx;\r
+end;\r
+\r
+procedure SaveSMSOffline;\r
+var F:file of GSM_SMSMessage;\r
+ i:integer;\r
+begin\r
+ AssignFile(F, 'gnokiisms');\r
+ Rewrite(F);\r
+ for i:=1 to SMSOfflineNumber do\r
+ begin\r
+ Write(f,SMSOffline[i]);\r
+ end;\r
+ CloseFile(F);\r
+end;\r
+\r
+procedure ReadSMSOffline;\r
+var F:file of GSM_SMSMessage;\r
+begin\r
+ MainForm.ListView10.items.Clear;\r
+ AssignFile(F, 'gnokiisms');\r
+ Reset(F);\r
+ if (ioresult=0) then\r
+ begin\r
+ ReadPBKOffline;\r
+ smsofflinenumber:=0;\r
+ while not eof(f) do\r
+ begin\r
+ smsofflinenumber:=smsofflinenumber+1;\r
+ read(f,smsoffline[smsofflinenumber]);\r
+ AddSMSInfo(MainForm.ListView10,smsoffline[smsofflinenumber]);\r
+ end;\r
+ CloseFile(F);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.PCSMSTabSheetShow(Sender: TObject);\r
+begin\r
+ ReadSMSOffline;\r
+end;\r
+\r
+procedure TMainForm.CopytoPC1Click(Sender: TObject);\r
+begin\r
+ SMSofflinenumber:=smsofflinenumber+1;\r
+ SMSoffline[SMSofflinenumber]:=SMS[smsnumindex];\r
+ SaveSMSOffline;\r
+end;\r
+\r
+procedure TMainForm.ListView10SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+begin\r
+ AddSMSDescription(SMSOffline[Item.Index+1],MainForm.Memo4,MainForm.Memo5);\r
+end;\r
+\r
+procedure TMainForm.PCSMSPopupMenuPopup(Sender: TObject);\r
+begin\r
+ SendSave1.Enabled:=False;\r
+ if GSMPhoneConnected then SendSave1.Enabled:=True;\r
+\r
+ Delete3.Enabled:=false;\r
+ if listview10.selected<>nil then Delete3.Enabled:=True;\r
+end;\r
+\r
+procedure TMainForm.Delete3Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if Application.MessageBox('Do you want to delete this SMS ?','Question',MB_YESNO)=IDYES then\r
+ begin\r
+ for i:=MainForm.ListView10.ItemIndex to smsofflinenumber-1 do\r
+ begin\r
+ SMSOffline[i]:=SMSOffline[i+1];\r
+ end;\r
+ Smsofflinenumber:=smsofflinenumber-1;\r
+ SaveSMSOffline;\r
+ ReadSMSOffline;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SendSave1Click(Sender: TObject);\r
+var i:integer;\r
+begin\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ MainForm.ComboBox3.Items.Clear();\r
+ for i:=1 to SMSfolders.number do\r
+ begin\r
+ MainForm.ComboBox3.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ MainForm.ComboBox3.ItemIndex:=0;\r
+ setsmslocation:=0;\r
+ SendSaveSMS(SMSOffline[MainForm.ListView10.ItemIndex+1]);\r
+end;\r
+\r
+\r
+procedure EndWAPBookmarkThread;\r
+begin\r
+ if (WAPBookmarkThread<>nil) then\r
+ begin\r
+ WAPBookmarkThread.Terminate();\r
+ MainForm.Timer2.Enabled:=true;\r
+ WAPBookmarkThread:=nil;\r
+ end;\r
+end;\r
+\r
+procedure TWAPBookmarkThread.Execute;\r
+var\r
+ bookmark:GSM_WAPBookmark;\r
+ i:integer;\r
+begin\r
+ while not Terminated do\r
+ begin\r
+ bookmark.location:=bookmarknum;\r
+ i:=GSM_GetWAPBookmark(@bookmark);\r
+ MainForm.ListView9.Items.Add;\r
+ MainForm.ListView9.Items.Item[bookmarknum-1].Caption:=inttostr(bookmarknum);\r
+ if (i=0) then\r
+ begin\r
+ MainForm.ListView9.Items.Item[bookmarknum-1].Subitems.Add(bookmark.title);\r
+ MainForm.ListView9.Items.Item[bookmarknum-1].Subitems.Add(bookmark.adress);\r
+ end else\r
+ begin\r
+ MainForm.ListView9.Items.Item[bookmarknum-1].Subitems.Add('');\r
+ end;\r
+ bookmarknum:=bookmarknum+1;\r
+ if bookmarknum=15 then EndWAPBookmarkThread;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.WapBookTabSheetHide(Sender: TObject);\r
+begin\r
+ EndWAPBookmarkThread;\r
+end;\r
+\r
+procedure TMainForm.WapBookTabSheetShow(Sender: TObject);\r
+begin\r
+ if GSMPhoneConnected then\r
+ begin\r
+ if GSM_GetModelFeature(FN_WAP)<>0 then\r
+ begin\r
+ GroupBox17.Ctl3D:=true;\r
+ ListView9.Ctl3D:=true;\r
+ ListView9.Enabled:=true;\r
+ bookmarknum:=1;\r
+ MainForm.ListView9.Items.Clear;\r
+ MainForm.Timer2.Enabled:=false;\r
+ WAPBookmarkThread:=TWAPBookmarkThread.Create(false);\r
+ end else\r
+ begin\r
+ GroupBox17.Ctl3D:=false;\r
+ ListView9.Ctl3D:=false;\r
+ ListView9.Enabled:=false;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ComboBox7Change(Sender: TObject);\r
+var\r
+ settings:GSM_WAPSettings;\r
+begin\r
+ if combobox7.ItemIndex>0 then\r
+ begin\r
+ settings.location:=combobox7.ItemIndex;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetWAPSettings(@settings);\r
+ MainForm.Timer2.Enabled:=true;\r
+\r
+ if (settings.title[1]<>chr(0)) then\r
+ Edit6.Text:=settings.title\r
+ else\r
+ edit6.Text:='set '+inttostr(combobox7.ItemIndex);\r
+\r
+ edit8.Text:=settings.homepage;\r
+\r
+ combobox10.itemindex:=1;\r
+ if settings.iscontinuous<>0 then combobox10.Itemindex:=0;\r
+\r
+ combobox9.itemindex:=1;\r
+ if settings.issecurity<>0 then combobox9.Itemindex:=0;\r
+\r
+ if (settings.bearer>=0) and (settings.bearer<3) then\r
+ begin\r
+ combobox8.ItemIndex:=settings.bearer;\r
+\r
+ Label27.enabled:=false;\r
+ Label28.enabled:=false;\r
+ Label29.enabled:=false;\r
+ label30.enabled:=false;\r
+ label31.enabled:=false;\r
+ label32.enabled:=false;\r
+ label33.enabled:=false;\r
+ label34.enabled:=false;\r
+ label35.enabled:=false;\r
+ label36.enabled:=false;\r
+ label37.enabled:=false;\r
+ edit9.enabled:=false;\r
+ edit10.enabled:=false;\r
+ edit11.enabled:=false;\r
+ edit12.enabled:=false;\r
+ edit13.enabled:=false;\r
+ edit14.enabled:=false;\r
+ edit15.enabled:=false;\r
+ combobox11.enabled:=false;\r
+ combobox12.enabled:=false;\r
+ combobox13.enabled:=false;\r
+ combobox14.enabled:=false;\r
+\r
+ case settings.bearer of\r
+ WAPSETTINGS_BEARER_SMS:\r
+ begin\r
+ label27.enabled:=true;\r
+ edit9.text:=settings.server;\r
+ edit9.enabled:=true;\r
+\r
+ label28.enabled:=true;\r
+ edit10.text:=settings.service;\r
+ edit10.enabled:=true;\r
+ end;\r
+ WAPSETTINGS_BEARER_DATA:\r
+ begin\r
+ label29.enabled:=true;\r
+ edit11.text:=settings.dialup;\r
+ edit11.enabled:=true;\r
+\r
+ label34.enabled:=true;\r
+ edit13.text:=settings.user;\r
+ edit13.enabled:=true;\r
+\r
+ label35.enabled:=true;\r
+ edit14.text:=settings.password;\r
+ edit14.enabled:=true;\r
+\r
+ label30.enabled:=true;\r
+ edit12.text:=settings.ipaddress;\r
+ edit12.enabled:=true;\r
+\r
+ label31.enabled:=true;\r
+ combobox11.enabled:=true;\r
+ combobox11.ItemIndex:=0;\r
+ if settings.isnormalauthentication=0 then\r
+ combobox11.ItemIndex:=1;\r
+\r
+ label32.enabled:=true;\r
+ combobox12.enabled:=true;\r
+ combobox12.ItemIndex:=0;\r
+ if settings.isISDNcall=0 then\r
+ combobox12.ItemIndex:=1;\r
+\r
+ label33.enabled:=true;\r
+ combobox13.enabled:=true;\r
+ combobox13.ItemIndex:=1;\r
+ if settings.isspeed14400=0 then\r
+ combobox13.ItemIndex:=0;\r
+ end;\r
+ WAPSETTINGS_BEARER_USSD:\r
+ begin\r
+ label36.enabled:=true;\r
+ edit15.text:=settings.code;\r
+ edit15.enabled:=true;\r
+\r
+ label37.enabled:=true;\r
+ combobox14.Enabled:=true;\r
+ combobox14.ItemIndex:=1;\r
+ if settings.isIP=0 then\r
+ begin\r
+ combobox14.ItemIndex:=1;\r
+\r
+ label28.enabled:=true;\r
+ edit10.text:=settings.service;\r
+ edit10.enabled:=true;\r
+ end else\r
+ begin\r
+ label30.enabled:=true;\r
+ edit12.text:=settings.ipaddress;\r
+ edit12.enabled:=true;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Button19Click(Sender: TObject);\r
+var\r
+ Divert:GSM_CallDivert;\r
+begin\r
+ MainForm.Timer2.Enabled:=false;\r
+\r
+ divert.DType:=GSM_CDV_Busy;\r
+ divert.ctype:=GSM_CDV_VoiceCalls;\r
+ divert.Operation:=GSM_CDV_Query;\r
+ if gsm_calldivertoperation(@divert)=0 then\r
+ begin\r
+ if divert.enabled=0 then\r
+ begin\r
+ Label38.enabled:=false;\r
+ edit16.enabled:=false;\r
+ edit16.Text:='Not active';\r
+ end else\r
+ begin\r
+ Label38.enabled:=true;\r
+ edit16.enabled:=true;\r
+ edit16.Text:=divert.Number;\r
+ end;\r
+ end;\r
+\r
+ divert.DType:=GSM_CDV_NoAnswer;\r
+ divert.ctype:=GSM_CDV_VoiceCalls;\r
+ divert.Operation:=GSM_CDV_Query;\r
+ if gsm_calldivertoperation(@divert)=0 then\r
+ begin\r
+ if divert.enabled=0 then\r
+ begin\r
+ Label39.enabled:=false;\r
+ edit17.enabled:=false;\r
+ edit17.Text:='Not active';\r
+ label40.Enabled:=false;\r
+ combobox15.Enabled:=false;\r
+ end else\r
+ begin\r
+ Label39.enabled:=true;\r
+ edit17.enabled:=true;\r
+ edit17.Text:=divert.Number;\r
+ label40.Enabled:=true;\r
+ combobox15.Enabled:=true;\r
+ case divert.timeout of\r
+ 5:combobox15.ItemIndex:=0;\r
+ 10:combobox15.ItemIndex:=1;\r
+ 15:combobox15.ItemIndex:=2;\r
+ 20:combobox15.ItemIndex:=3;\r
+ 25:combobox15.ItemIndex:=4;\r
+ 30:combobox15.ItemIndex:=5;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ divert.DType:=GSM_CDV_OutOfreach;\r
+ divert.ctype:=GSM_CDV_VoiceCalls;\r
+ divert.Operation:=GSM_CDV_Query;\r
+ if gsm_calldivertoperation(@divert)=0 then\r
+ begin\r
+ if divert.enabled=0 then\r
+ begin\r
+ Label41.enabled:=false;\r
+ edit18.enabled:=false;\r
+ edit18.Text:='Not active';\r
+ end else\r
+ begin\r
+ Label41.enabled:=true;\r
+ edit18.enabled:=true;\r
+ edit18.Text:=divert.Number;\r
+ end;\r
+ end;\r
+\r
+ MainForm.Timer2.Enabled:=true;\r
+end;\r
+\r
+procedure TMainForm.Button20Click(Sender: TObject);\r
+var\r
+ Divert:GSM_CallDivert;\r
+begin\r
+ MainForm.Timer2.Enabled:=false;\r
+\r
+ divert.DType:=GSM_CDV_AllTypes;\r
+ divert.ctype:=GSM_CDV_AllCalls;\r
+ divert.Operation:=GSM_CDV_Erasure;\r
+ gsm_calldivertoperation(@divert);\r
+\r
+ MainForm.Timer2.Enabled:=true;\r
+\r
+end;\r
+\r
+procedure ReadCalendarOffline;\r
+var F:file of GSM_calendarnote;\r
+begin\r
+ MainForm.ListView11.items.Clear;\r
+ AssignFile(F, 'gnokiicalendar');\r
+ Reset(F);\r
+ if (ioresult=0) then\r
+ begin\r
+ calendarofflinenumber:=0;\r
+ while not eof(f) do\r
+ begin\r
+ calendarofflinenumber:=calendarofflinenumber+1;\r
+ read(f,calendaroffline[calendarofflinenumber]);\r
+ AddCalendarNote(calendaroffline[calendarofflinenumber],mainform.ListView11);\r
+ end;\r
+ CloseFile(F);\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.PCOfflineTabSheetShow(Sender: TObject);\r
+begin\r
+ ReadSMSOffline;\r
+ Label43.Caption:=inttostr(smsofflinenumber);\r
+ ReadCalendarOffline;\r
+ Label45.Caption:=inttostr(calendarofflinenumber);\r
+end;\r
+\r
+procedure SaveCalendarOffline;\r
+var F:file of GSM_CalendarNote;\r
+ i:integer;\r
+begin\r
+ AssignFile(F, 'gnokiicalendar');\r
+ Rewrite(F);\r
+ for i:=1 to CalendarOfflineNumber do\r
+ begin\r
+ Write(f,CalendarOffline[i]);\r
+ end;\r
+ CloseFile(F);\r
+end;\r
+\r
+procedure TMainForm.PCCalendarTabSheetShow(Sender: TObject);\r
+begin\r
+ ReadCalendarOffline;\r
+end;\r
+\r
+procedure TMainForm.CopytoPC2Click(Sender: TObject);\r
+begin\r
+ setcalendarnote.Location:=calendarselect;\r
+ mainform.Timer2.Enabled:=false;\r
+ GSM_GetCalendarNote(@setcalendarnote);\r
+ mainform.Timer2.Enabled:=true;\r
+ Calendarofflinenumber:=calendarofflinenumber+1;\r
+ Calendaroffline[Calendarofflinenumber]:=setcalendarnote;\r
+ SaveCalendarOffline;\r
+end;\r
+\r
+procedure TMainForm.Delete5Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if Application.MessageBox('Do you want to delete this note ?','Question',MB_YESNO)=IDYES then\r
+ begin\r
+ for i:=MainForm.ListView11.ItemIndex to calendarofflinenumber-1 do\r
+ begin\r
+ CalendarOffline[i]:=CalendarOffline[i+1];\r
+ end;\r
+ Calendarofflinenumber:=calendarofflinenumber-1;\r
+ SaveCalendarOffline;\r
+ ReadCalendarOffline;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Copytocalendar1Click(Sender: TObject);\r
+begin\r
+ if not readcalendar then\r
+ begin\r
+ application.MessageBox('Please read first calendar notes from phone','info',mb_ok);\r
+ end else begin\r
+ setcalendarnote:=calendaroffline[mainform.listview11.itemindex+1];\r
+ setcalendarnote.Location:=MainForm.ListView4.Items.Count+1;\r
+\r
+ EditCalendarNote;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.PCCalendarPopupMenuPopup(Sender: TObject);\r
+begin\r
+ CopyTocalendar1.Enabled:=False;\r
+ if (GSMPhoneConnected) and (GSM_GetModelFeature(FN_Calendar)<>0)\r
+ and (listview11.selected<>nil) then copytocalendar1.Enabled:=True;\r
+\r
+ Delete5.Enabled:=false;\r
+ if listview11.selected<>nil then Delete5.Enabled:=True;\r
+end;\r
+\r
+procedure TMainForm.Savebackuptofile1Click(Sender: TObject);\r
+begin\r
+ PhoneBackup.PhonePhonebookUsed:=0;\r
+ PhoneBackup.SIMPhonebookUsed:=0;\r
+ PhoneBackup.CallerAvailable:=0;\r
+ PhoneBackup.StartupLogoAvailable:=0;\r
+ PhoneBackup.StartupText.text[1]:=chr(0);\r
+ PhoneBackup.OperatorLogoAvailable:=0;\r
+ PhoneBackup.SpeedAvailable:=0;\r
+\r
+ BackupForm.CheckBox3.Enabled:=true;\r
+ BackupForm.CheckBox4.Enabled:=true;\r
+ BackupForm.CheckBox2.Enabled:=true;\r
+ BackupForm.CheckBox1.Enabled:=true;\r
+ BackupForm.CheckBox5.Enabled:=true;\r
+\r
+ BackupForm.GroupBox1.Caption:=' What do you want to backup ? ';\r
+ PhoneBackupAvailable:=True;\r
+ BackupForm.ListBox1.ItemIndex:=0;\r
+ BackupForm.GroupBox2.Visible:=true;\r
+ BackupForm.ShowModal;\r
+ if PhoneBackupAvailable then\r
+ begin\r
+ BackupProgressForm.ShowModal;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Restorebackupfromfile1Click(Sender: TObject);\r
+begin\r
+ if OpenDialog1.Execute then\r
+ begin\r
+ if GSM_ReadBackupFile(PChar(OpenDialog1.FileName),@phonebackup)=0 then\r
+ begin\r
+ BackupForm.CheckBox3.Enabled:=true;\r
+ if PhoneBackup.CallerAvailable=0 then\r
+ BackupForm.CheckBox3.Enabled:=false;\r
+\r
+ BackupForm.CheckBox4.Enabled:=true;\r
+ if PhoneBackup.OperatorLogoAvailable=0 then\r
+ BackupForm.CheckBox4.Enabled:=false;\r
+\r
+ BackupForm.CheckBox2.Enabled:=true;\r
+ if PhoneBackup.PhonePhonebookUsed=0 then\r
+ BackupForm.CheckBox2.Enabled:=false;\r
+\r
+ BackupForm.CheckBox1.Enabled:=true;\r
+ if PhoneBackup.SIMPhonebookUsed=0 then\r
+ BackupForm.CheckBox1.Enabled:=false;\r
+\r
+ BackupForm.CheckBox5.Enabled:=true;\r
+\r
+ BackupForm.GroupBox1.Caption:=' What do you want to restore ? ';\r
+ PhoneBackupAvailable:=true;\r
+ BackupForm.GroupBox2.Visible:=false;\r
+ BackupForm.ShowModal;\r
+ if PhoneBackupAvailable then\r
+ begin\r
+ PhoneBackupAvailable:=false;\r
+ BackupProgressForm.ShowModal;\r
+ end;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.PBKPopupMenuPopup(Sender: TObject);\r
+begin\r
+ Savephonebooktofileanotherapplication1.enabled:=false;\r
+ Delete4.enabled:=false;\r
+ Edit19.Enabled:=false;\r
+ Edit7.Enabled:=false;\r
+ SMSSendSave1.Enabled:=false;\r
+ copyphonebooktopc1.Enabled:=false;\r
+ if GSMPhoneConnected then\r
+ begin\r
+ if (pbkofflinenumber<>0) then copyphonebooktopc1.Enabled:=true;\r
+ if (ComboBox1.ItemIndex=4) or (ComboBox1.ItemIndex=5) then\r
+ begin\r
+ Savephonebooktofileanotherapplication1.enabled:=true;\r
+ if listview1.Selected<>nil then\r
+ begin\r
+ Delete4.enabled:=true;\r
+ Edit19.Enabled:=true;\r
+ end;\r
+ end;\r
+ if listview1.Selected<>nil then\r
+ begin\r
+ SMSSendSave1.Enabled:=true;\r
+ Edit7.Enabled:=true;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.Savephonebooktofileanotherapplication1Click(\r
+ Sender: TObject);\r
+begin\r
+ PhoneBackup.CallerAvailable:=0;\r
+ PhoneBackup.StartupLogoAvailable:=0;\r
+ PhoneBackup.StartupText.text[1]:=chr(0);\r
+ PhoneBackup.OperatorLogoAvailable:=0;\r
+\r
+ BackupForm.CheckBox3.Enabled:=false;\r
+ BackupForm.CheckBox4.Enabled:=false;\r
+\r
+ BackupForm.CheckBox2.Enabled:=true;\r
+ if PhoneBackup.PhonePhonebookUsed=0 then\r
+ BackupForm.CheckBox2.Enabled:=false;\r
+\r
+ BackupForm.CheckBox1.Enabled:=true;\r
+ if PhoneBackup.SIMPhonebookUsed=0 then\r
+ BackupForm.CheckBox1.Enabled:=false;\r
+\r
+ BackupForm.CheckBox5.Enabled:=false;\r
+\r
+ BackupForm.GroupBox1.Caption:=' What do you want to backup ? ';\r
+ PhoneBackupAvailable:=True;\r
+ BackupForm.ListBox1.ItemIndex:=0;\r
+ BackupForm.GroupBox2.Visible:=true;\r
+ BackupForm.ShowModal;\r
+ if PhoneBackupAvailable then\r
+ begin\r
+ if MainForm.SaveDialog1.Execute then\r
+ begin\r
+ GSM_SaveBackupFile(PChar(MainForm.SaveDialog1.FileName),@phonebackup);\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.ListView4DblClick(Sender: TObject);\r
+begin\r
+// if (GSMPhoneConnected) and (ListView4.Selected<>nil) then\r
+// Edit3Click(Sender);\r
+end;\r
+\r
+procedure TMainForm.Edit19Click(Sender: TObject);\r
+var\r
+ i,j:integer;\r
+ num_num,text_num:integer;\r
+begin\r
+ if listview1.Selected<>nil then\r
+ begin\r
+ PBKEditForm.ComboBox1.ItemIndex:=1;\r
+ PBKEditForm.COmboBox2.Items:=PBKEditForm.COmboBox1.Items;\r
+ PBKEditForm.ComboBox2.ItemIndex:=1;\r
+ PBKEditForm.COmboBox3.Items:=PBKEditForm.COmboBox1.Items;\r
+ PBKEditForm.ComboBox3.ItemIndex:=1;\r
+ PBKEditForm.COmboBox4.Items:=PBKEditForm.COmboBox1.Items;\r
+ PBKEditForm.ComboBox4.ItemIndex:=1;\r
+ PBKEditForm.COmboBox5.Items:=PBKEditForm.COmboBox1.Items;\r
+ PBKEditForm.ComboBox5.ItemIndex:=1;\r
+ PBKEditForm.ComboBox6.ItemIndex:=0;\r
+ PBKEditForm.COmboBox7.Items:=PBKEditForm.COmboBox6.Items;\r
+ PBKEditForm.ComboBox7.ItemIndex:=0;\r
+ PbkEditForm.Edit2.Text:='';\r
+\r
+ num_num:=1;\r
+ text_num:=1;\r
+ pbk.Location:=pbknumberentry;\r
+ case ComboBox1.ItemIndex of\r
+ 4:pbk.MemoryType:=GMT_ME;\r
+ 5:pbk.MemoryType:=GMT_SM;\r
+ end;\r
+ GSM_GetMemoryLocation(@pbk);\r
+\r
+ pbkeditform.ComboBox1.enabled:=false;\r
+ pbkeditform.ComboBox2.enabled:=false;\r
+ pbkeditform.ComboBox3.enabled:=false;\r
+ pbkeditform.ComboBox4.enabled:=false;\r
+ pbkeditform.ComboBox5.enabled:=false;\r
+ pbkeditform.ComboBox6.enabled:=false;\r
+ pbkeditform.ComboBox7.enabled:=false;\r
+ pbkeditform.Edit3.enabled:=false;\r
+ pbkeditform.Edit4.enabled:=false;\r
+ pbkeditform.Edit5.enabled:=false;\r
+ pbkeditform.Edit6.enabled:=false;\r
+ pbkeditform.Edit7.enabled:=false;\r
+ pbkeditform.Edit8.enabled:=false;\r
+ PbkEditForm.Edit3.Text:='Not available';\r
+ PbkEditForm.Edit4.Text:='Not available';\r
+ PbkEditForm.Edit5.Text:='Not available';\r
+ PbkEditForm.Edit6.Text:='Not available';\r
+ PbkEditForm.Edit7.Text:='Not available';\r
+ PbkEditForm.Edit8.Text:='Not available';\r
+ if (pbk.MemoryType=GMT_ME) and\r
+ (GSM_GetModelFeature(FN_PHONEBOOK)=F_PBK71INT) then\r
+ begin\r
+ pbkeditform.ComboBox1.enabled:=true;\r
+ pbkeditform.ComboBox2.enabled:=true;\r
+ pbkeditform.ComboBox3.enabled:=true;\r
+ pbkeditform.ComboBox4.enabled:=true;\r
+ pbkeditform.ComboBox5.enabled:=true;\r
+ pbkeditform.ComboBox6.enabled:=true;\r
+ pbkeditform.ComboBox7.enabled:=true;\r
+ pbkeditform.Edit3.enabled:=true;\r
+ pbkeditform.Edit4.enabled:=true;\r
+ pbkeditform.Edit5.enabled:=true;\r
+ pbkeditform.Edit6.enabled:=true;\r
+ pbkeditform.Edit7.enabled:=true;\r
+ pbkeditform.Edit8.enabled:=true;\r
+ PbkEditForm.Edit3.Text:='';\r
+ PbkEditForm.Edit4.Text:='';\r
+ PbkEditForm.Edit5.Text:='';\r
+ PbkEditForm.Edit6.Text:='';\r
+ PbkEditForm.Edit7.Text:='';\r
+ PbkEditForm.Edit8.Text:='';\r
+ end;\r
+\r
+ pbkeditform.Label2.Enabled:=true;\r
+ pbkeditform.ComboBox8.Enabled:=true;\r
+ if (GSM_GetModelFeature(FN_CALLERGROUPS)=0) then\r
+ begin\r
+ pbkeditform.Label2.Enabled:=false;\r
+ pbkeditform.ComboBox8.Enabled:=false;\r
+ end;\r
+\r
+ pbkeditform.Edit1.Text:=pbk.name;\r
+ if (pbk.Number[1]<>chr(0)) then\r
+ begin\r
+ pbkeditform.ComboBox1.ItemIndex:=1;\r
+ pbkeditform.Edit2.Text:=pbk.number;\r
+ num_num:=num_num+1;\r
+ end;\r
+ for i:=1 to pbk.SubEntriesCount do\r
+ begin\r
+ case pbk.SubEntries[i].EntryType of\r
+ GSM_Number:\r
+ begin\r
+ j:=1;\r
+ case pbk.SubEntries[i].NumberType of\r
+ GSM_General :j:=1;\r
+ GSM_General2:j:=1;\r
+ GSM_Mobile :j:=3;\r
+ GSM_Work :j:=4;\r
+ GSM_Fax :j:=0;\r
+ GSM_Home :j:=2;\r
+ end;\r
+ case num_num of\r
+ 1:begin\r
+ pbkeditform.ComboBox1.ItemIndex:=j;\r
+ pbkeditform.edit2.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 2:begin\r
+ pbkeditform.ComboBox2.ItemIndex:=j;\r
+ pbkeditform.edit3.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 3:begin\r
+ pbkeditform.ComboBox3.ItemIndex:=j;\r
+ pbkeditform.edit4.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 4:begin\r
+ pbkeditform.ComboBox4.ItemIndex:=j;\r
+ pbkeditform.edit5.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 5:begin\r
+ pbkeditform.ComboBox5.ItemIndex:=j;\r
+ pbkeditform.edit6.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ end;\r
+ num_num:=num_num+1;\r
+ end;\r
+ GSM_Note :\r
+ begin\r
+ j:=1;\r
+ case text_num of\r
+ 1:begin\r
+ pbkeditform.ComboBox6.ItemIndex:=j;\r
+ pbkeditform.edit7.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 2:begin\r
+ pbkeditform.ComboBox7.ItemIndex:=j;\r
+ pbkeditform.edit8.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ end;\r
+ text_num:=text_num+1;\r
+ end;\r
+ GSM_Postal:\r
+ begin\r
+ j:=2;\r
+ case text_num of\r
+ 1:begin\r
+ pbkeditform.ComboBox6.ItemIndex:=j;\r
+ pbkeditform.edit7.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 2:begin\r
+ pbkeditform.ComboBox7.ItemIndex:=j;\r
+ pbkeditform.edit8.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ end;\r
+ text_num:=text_num+1;\r
+ end;\r
+ GSM_Email :\r
+ begin\r
+ j:=0;\r
+ case text_num of\r
+ 1:begin\r
+ pbkeditform.ComboBox6.ItemIndex:=j;\r
+ pbkeditform.edit7.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ 2:begin\r
+ pbkeditform.ComboBox7.ItemIndex:=j;\r
+ pbkeditform.edit8.text:=pbk.SubEntries[i].Number;\r
+ end;\r
+ end;\r
+ text_num:=text_num+1;\r
+ end;\r
+\r
+ end;\r
+ end;\r
+\r
+ pbkeditform.ComboBox8.items.clear;\r
+ pbkeditform.ComboBox8.items.add('Not assigned');\r
+ for i:=1 to 5 do\r
+ begin\r
+ pbkeditform.ComboBox8.items.add(caller[i].text);\r
+ end;\r
+ pbkeditform.ComboBox8.itemindex:=0;\r
+ if (GSM_GetModelFeature(FN_CALLERGROUPS)<>0) then\r
+ begin\r
+ if (pbk.Group>=0) and (pbk.Group<=4) then\r
+ begin\r
+ pbkeditform.ComboBox8.itemindex:=pbk.Group+1;\r
+ end;\r
+ end;\r
+ \r
+ PbkEditForm.ShowModal;\r
+ end;\r
+\r
+end;\r
+\r
+procedure TMainForm.Delete4Click(Sender: TObject);\r
+begin\r
+ if Application.MessageBox('Do you want to delete this phonebook entry ?','Question',MB_YESNO)=IDYES then\r
+ begin\r
+\r
+ pbk.Location:=pbknumberentry;\r
+ case ComboBox1.ItemIndex of\r
+ 4:pbk.MemoryType:=GMT_ME;\r
+ 5:pbk.MemoryType:=GMT_SM;\r
+ end;\r
+\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetMemoryLocation(@pbk);\r
+\r
+ pbk.SubEntriesCount:=0;\r
+ pbk.Name[1]:=chr(0);\r
+ pbk.Number[1]:=chr(0);\r
+ GSM_WritePhonebookLocation(@pbk);\r
+ MainForm.Timer2.Enabled:=true;\r
+ MainForm.ComboBox1Change(nil);\r
+ end;\r
+end;\r
+\r
+\r
+procedure TMainForm.Button22Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+ mybinring:GSM_BinRingtone;\r
+ myring:GSM_Ringtone;\r
+begin\r
+ LogosRingForm.Label1.Caption:='Do you want to get ringtone ?';\r
+ LogosRingForm.ComboBox3.Visible:=true;\r
+ LogosRingForm.ComboBox3.Items.Clear();\r
+ MainForm.Timer2.Enabled:=false;\r
+ for i:=1 to GSM_GetModelFeature(FN_RINGNUMBER) do\r
+ begin\r
+ mybinring.location:=i;\r
+ if (GSM_GetPhoneRingtone(@mybinring,@myring)=0) then\r
+ begin\r
+ if GSM_GetModelFeature(FN_RINGTONES)=F_RING_SM then\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(myring.name);\r
+ end else\r
+ begin\r
+ LogosRingForm.ComboBox3.Items.Add(mybinring.name);\r
+ end;\r
+ end else\r
+ LogosRingForm.ComboBox3.Items.Add('Location '+inttostr(i));\r
+ end;\r
+ MainForm.Timer2.Enabled:=true;\r
+ LogosRingForm.ComboBox3.ItemIndex:=0;\r
+ LogosRingForm.ShowModal;\r
+ if LogosRingForm.ComboBox3.Visible then\r
+ begin\r
+ mybinring.location:=LogosRingForm.ComboBox3.ItemIndex+1;\r
+ MainForm.Timer2.Enabled:=false;\r
+ if (GSM_GetPhoneRingtone(@mybinring,@myring)=0) then\r
+ begin\r
+ MainForm.Timer2.Enabled:=true;\r
+ if GSM_GetModelFeature(FN_RINGTONES)=F_RING_SM then\r
+ begin\r
+ application.MessageBox('Smart Messaging format','',0);\r
+ if SaveDialog1.Execute then\r
+ begin\r
+ GSM_SaveRingtoneFile(PChar(SaveDialog1.FileName),@myring);\r
+ end;\r
+ end else\r
+ begin\r
+ application.MessageBox('Binary format','',0);\r
+ if SaveDialog1.Execute then\r
+ begin\r
+ GSM_SaveBinRingtoneFile(PChar(SaveDialog1.FileName),@mybinring);\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ MainForm.Timer2.Enabled:=true;\r
+ end;\r
+\r
+end;\r
+\r
+procedure TMainForm.New20Click(Sender: TObject);\r
+begin\r
+ bookmarknum:=65535;\r
+ WAPBookForm.Edit1.Text:='';\r
+ WAPBookForm.Edit2.Text:='';\r
+ WAPBookForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.ListView9SelectItem(Sender: TObject; Item: TListItem;\r
+ Selected: Boolean);\r
+begin\r
+ if Selected then bookmarknum2:=item.Index+1;\r
+end;\r
+\r
+procedure TMainForm.Edit20Click(Sender: TObject);\r
+var\r
+ bookmark:GSM_WAPBookmark;\r
+begin\r
+ bookmark.location:=bookmarknum2;\r
+ mainform.Timer2.Enabled:=false;\r
+ GSM_GetWAPBookmark(@bookmark);\r
+ mainform.Timer2.Enabled:=true;\r
+ WAPBookForm.Edit1.Text:=bookmark.title;\r
+ WAPBookForm.Edit2.Text:=bookmark.adress;\r
+ WAPBookForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.WAPBookPopupMenuPopup(Sender: TObject);\r
+begin\r
+ New20.Enabled:=false;\r
+ Edit20.Enabled:=false;\r
+ SMSSendSave2.Enabled:=false;\r
+ if (WAPBookmarkThread=nil) and (GSMPhoneConnected) then\r
+ begin\r
+ New20.Enabled:=true;\r
+ if (ListView9.Selected<>nil) and\r
+ (ListView9.Selected.SubItems[0]<>'') then\r
+ begin\r
+ Edit20.Enabled:=true;\r
+ SMSSendSave2.Enabled:=true;\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure TMainForm.SMSSendSave2Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+ \r
+ //folders\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=1 to SMSFolders.number do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=0;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.WAPBookTabSheet;\r
+\r
+ bookma.location:=bookmarknum2;\r
+ mainform.Timer2.Enabled:=false;\r
+ GSM_GetWAPBookmark(@bookma);\r
+ mainform.Timer2.Enabled:=true;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.Button23Click(Sender: TObject);\r
+var\r
+ i:integer;\r
+begin\r
+ if smscinit=false then\r
+ begin\r
+ MainForm.ListView6.Items.Clear;\r
+ smscnum:=1;\r
+ while true do\r
+ begin\r
+ ReadSMSC;\r
+ if smscinit then break;\r
+ end;\r
+ end;\r
+\r
+ //sms text\r
+ SMSEditForm.Memo1.Text:='';\r
+\r
+ //number\r
+ SMSEditForm.ComboBox9.Text:='';\r
+ AddSMSEditSenderList;\r
+ \r
+ //folders\r
+ GSM_GetSMSFolders(@SMSfolders);\r
+ SMSEditForm.ComboBox1.Items.Clear;\r
+ for i:=1 to SMSFolders.number do\r
+ begin\r
+ SMSEditForm.ComboBox1.Items.Add(SMSfolders.folder[i].Name);\r
+ end;\r
+ SMSEditForm.ComboBox1.ItemIndex:=0;\r
+\r
+ //smsc\r
+ SetSMSC(1);\r
+ SMSEditForm.ComboBox2.Items.Clear;\r
+ SMSEditForm.ComboBox2.Items.Add('custom');\r
+ for i:=1 to smscnum-1 do\r
+ begin\r
+ if SMSC2[i].Name[1]<>chr(0) then\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i)+' - '+SMSC2[i].Name)\r
+ else\r
+ SMSEditForm.ComboBox2.Items.Add('set '+inttostr(i));\r
+ end;\r
+ SMSEditForm.ComboBox2.ItemIndex:=1;\r
+\r
+ SMSEditForm.TextSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.BitmapSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.RingtoneSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.CalendarSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPBookTabSheet.TabVisible:=false;\r
+ SMSEditForm.WAPSettTabSheet.TabVisible:=false;\r
+ SMSEditForm.PBKSMSTabSheet.TabVisible:=false;\r
+ SMSEditForm.SMSEditPageControl.ActivePage:=Smseditform.WAPSettTabSheet;\r
+\r
+ Wapset.location:=combobox7.ItemIndex;\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_GetWAPSettings(@wapset);\r
+ MainForm.Timer2.Enabled:=true;\r
+\r
+ if (GSM_GetModelFeature(FN_SMS)=F_SMS71) then\r
+ begin\r
+ SMSEditForm.edit3.Visible:=true;\r
+ SMSEditForm.label14.Visible:=true;\r
+ end else\r
+ begin\r
+ SMSEditForm.edit3.Visible:=false;\r
+ SMSEditForm.label14.Visible:=false;\r
+ end;\r
+\r
+ SMSEditForm.ShowModal;\r
+end;\r
+\r
+procedure TMainForm.CopyphonebooktoPC1Click(Sender: TObject);\r
+begin\r
+ SavePBKOffline;\r
+end;\r
+\r
+procedure TMainForm.PCPBKTabSheetShow(Sender: TObject);\r
+var i:integer;\r
+begin\r
+ ReadPBKOffline;\r
+ ListView12.Items.Clear;\r
+ for i:=1 to PBKOfflineNumber do\r
+ begin\r
+ MainForm.ListView12.Items.Add;\r
+ MainForm.ListView12.Items.Item[i-1].Caption:=inttostr(PhoneBackup.PhonePhonebook[i].Location);\r
+ AddPBKEntry(ListView12,PhoneBackup.PhonePhonebook[i],i-1);\r
+ end;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object NetmonForm: TNetmonForm\r
+ Left = 302\r
+ Top = 272\r
+ Width = 202\r
+ Height = 185\r
+ Caption = 'Set Netmonitor'\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ OnCreate = FormCreate\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 128\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'OK'\r
+ TabOrder = 0\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 104\r
+ Top = 128\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'Cancel'\r
+ TabOrder = 1\r
+ OnClick = Button2Click\r
+ end\r
+ object RadioGroup1: TRadioGroup\r
+ Left = 8\r
+ Top = 16\r
+ Width = 177\r
+ Height = 97\r
+ Caption = ' Netmonitor state '\r
+ ItemIndex = 2\r
+ Items.Strings = (\r
+ 'OFF'\r
+ 'Simple'\r
+ 'Extended')\r
+ TabOrder = 2\r
+ end\r
+end\r
--- /dev/null
+unit Netmon;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls, ExtCtrls;\r
+\r
+type\r
+ TNetmonForm = class(TForm)\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ RadioGroup1: TRadioGroup;\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure FormCreate(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ NetmonForm: TNetmonForm;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TNetmonForm.Button1Click(Sender: TObject);\r
+begin\r
+ NetmonForm.close();\r
+end;\r
+\r
+procedure TNetmonForm.Button2Click(Sender: TObject);\r
+begin\r
+ RadioGroup1.ItemIndex:=-1;\r
+ NetmonForm.close();\r
+end;\r
+\r
+procedure TNetmonForm.FormCreate(Sender: TObject);\r
+begin\r
+ RadioGroup1.ItemIndex:=2;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object PbkForm: TPbkForm\r
+ Left = 263\r
+ Top = 136\r
+ BorderStyle = bsDialog\r
+ Caption = 'View phonebook entry'\r
+ ClientHeight = 207\r
+ ClientWidth = 313\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object ListView1: TListView\r
+ Left = 8\r
+ Top = 8\r
+ Width = 297\r
+ Height = 161\r
+ Columns = <\r
+ item\r
+ Caption = 'Type'\r
+ Width = 100\r
+ end\r
+ item\r
+ Caption = 'Entry'\r
+ Width = 190\r
+ end>\r
+ ReadOnly = True\r
+ RowSelect = True\r
+ TabOrder = 0\r
+ ViewStyle = vsReport\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 176\r
+ Width = 77\r
+ Height = 25\r
+ Caption = 'OK'\r
+ TabOrder = 1\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 224\r
+ Top = 176\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'Cancel'\r
+ TabOrder = 2\r
+ OnClick = Button2Click\r
+ end\r
+end\r
--- /dev/null
+unit pbkedit;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls, ComCtrls, MainUnit, GnokiiAPI, Menus;\r
+\r
+type\r
+ TPbkForm = class(TForm)\r
+ ListView1: TListView;\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure Button2Click(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ PbkForm: TPbkForm;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TPbkForm.Button1Click(Sender: TObject);\r
+begin\r
+ Pbkform.Close;\r
+end;\r
+\r
+procedure TPbkForm.Button2Click(Sender: TObject);\r
+begin\r
+ Pbkform.Close;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object PBKEditForm: TPBKEditForm\r
+ Left = 209\r
+ Top = 107\r
+ BorderIcons = [biSystemMenu]\r
+ BorderStyle = bsSingle\r
+ Caption = 'Edit phonebook entry'\r
+ ClientHeight = 380\r
+ ClientWidth = 347\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object GroupBox1: TGroupBox\r
+ Left = 8\r
+ Top = 16\r
+ Width = 329\r
+ Height = 305\r
+ Caption = 'Phonebook entry details'\r
+ TabOrder = 0\r
+ object Label1: TLabel\r
+ Left = 8\r
+ Top = 24\r
+ Width = 31\r
+ Height = 13\r
+ Caption = 'Name:'\r
+ end\r
+ object Label2: TLabel\r
+ Left = 8\r
+ Top = 280\r
+ Width = 59\r
+ Height = 13\r
+ Caption = 'Caller group:'\r
+ end\r
+ object Edit1: TEdit\r
+ Left = 144\r
+ Top = 24\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 0\r
+ end\r
+ object ComboBox1: TComboBox\r
+ Left = 8\r
+ Top = 64\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 1\r
+ Text = 'Fax number'\r
+ Items.Strings = (\r
+ 'Fax number'\r
+ 'General number'\r
+ 'Home number'\r
+ 'Mobile number'\r
+ 'Work number')\r
+ end\r
+ object ComboBox2: TComboBox\r
+ Left = 8\r
+ Top = 88\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 2\r
+ Text = 'ComboBox2'\r
+ end\r
+ object ComboBox3: TComboBox\r
+ Left = 8\r
+ Top = 112\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 3\r
+ Text = 'ComboBox3'\r
+ end\r
+ object ComboBox4: TComboBox\r
+ Left = 8\r
+ Top = 136\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 4\r
+ Text = 'ComboBox4'\r
+ end\r
+ object ComboBox5: TComboBox\r
+ Left = 8\r
+ Top = 160\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 5\r
+ Text = 'ComboBox5'\r
+ end\r
+ object ComboBox6: TComboBox\r
+ Left = 8\r
+ Top = 208\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 6\r
+ Text = 'Email'\r
+ Items.Strings = (\r
+ 'Email'\r
+ 'Note'\r
+ 'Post address')\r
+ end\r
+ object ComboBox7: TComboBox\r
+ Left = 8\r
+ Top = 232\r
+ Width = 129\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 7\r
+ Text = 'ComboBox7'\r
+ end\r
+ object Edit2: TEdit\r
+ Left = 144\r
+ Top = 64\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 8\r
+ end\r
+ object Edit3: TEdit\r
+ Left = 144\r
+ Top = 88\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 9\r
+ end\r
+ object Edit4: TEdit\r
+ Left = 144\r
+ Top = 112\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 10\r
+ end\r
+ object Edit5: TEdit\r
+ Left = 144\r
+ Top = 136\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 11\r
+ end\r
+ object Edit6: TEdit\r
+ Left = 144\r
+ Top = 160\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 12\r
+ end\r
+ object Edit7: TEdit\r
+ Left = 144\r
+ Top = 208\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 13\r
+ end\r
+ object Edit8: TEdit\r
+ Left = 144\r
+ Top = 232\r
+ Width = 177\r
+ Height = 21\r
+ TabOrder = 14\r
+ end\r
+ object ComboBox8: TComboBox\r
+ Left = 144\r
+ Top = 272\r
+ Width = 177\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 15\r
+ Text = 'ComboBox8'\r
+ end\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 336\r
+ Width = 89\r
+ Height = 25\r
+ Caption = '&OK'\r
+ TabOrder = 1\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 248\r
+ Top = 336\r
+ Width = 89\r
+ Height = 25\r
+ Caption = '&Cancel'\r
+ TabOrder = 2\r
+ OnClick = Button2Click\r
+ end\r
+end\r
--- /dev/null
+unit pbkedit2;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls, MainUnit, GnokiiAPI;\r
+\r
+type\r
+ TPBKEditForm = class(TForm)\r
+ GroupBox1: TGroupBox;\r
+ Label1: TLabel;\r
+ Edit1: TEdit;\r
+ ComboBox1: TComboBox;\r
+ ComboBox2: TComboBox;\r
+ ComboBox3: TComboBox;\r
+ ComboBox4: TComboBox;\r
+ ComboBox5: TComboBox;\r
+ ComboBox6: TComboBox;\r
+ ComboBox7: TComboBox;\r
+ Edit2: TEdit;\r
+ Edit3: TEdit;\r
+ Edit4: TEdit;\r
+ Edit5: TEdit;\r
+ Edit6: TEdit;\r
+ Edit7: TEdit;\r
+ Edit8: TEdit;\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ Label2: TLabel;\r
+ ComboBox8: TComboBox;\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure Button1Click(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ PBKEditForm: TPBKEditForm;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TPBKEditForm.Button2Click(Sender: TObject);\r
+begin\r
+ PBKEditForm.Close;\r
+end;\r
+\r
+procedure AddOneNumber(Edit: TEdit; ComboBox:TComboBox);\r
+var i:integer;\r
+begin\r
+ if Edit.Text<>'' then\r
+ begin\r
+ if not ComboBox.Enabled then\r
+ begin\r
+ for i:=1 to 49 do\r
+ pbk.Number[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit.text)) do\r
+ pbk.Number[i]:=Edit.Text[i];\r
+ end else\r
+ begin\r
+ pbk.SubEntriesCount:=pbk.SubEntriesCount+1;\r
+ case combobox.ItemIndex of\r
+ 0:pbk.SubEntries[pbk.SubEntriesCount].NumberType:=GSM_Fax;\r
+ 1:pbk.SubEntries[pbk.SubEntriesCount].NumberType:=GSM_General;\r
+ 2:pbk.SubEntries[pbk.SubEntriesCount].NumberType:=GSM_Home;\r
+ 3:pbk.SubEntries[pbk.SubEntriesCount].NumberType:=GSM_Mobile;\r
+ 4:pbk.SubEntries[pbk.SubEntriesCount].NumberType:=GSM_Work;\r
+ end;\r
+ pbk.SubEntries[pbk.SubEntriesCount].EntryType:=GSM_Number;\r
+ for i:=1 to 61 do\r
+ pbk.SubEntries[pbk.SubEntriesCount].Number[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit.text)) do\r
+ pbk.SubEntries[pbk.SubEntriesCount].Number[i]:=Edit.Text[i];\r
+ end;\r
+ end;\r
+end;\r
+\r
+procedure AddOneText(Edit: TEdit; ComboBox:TComboBox);\r
+var i:integer;\r
+begin\r
+ if Edit.Text<>'' then\r
+ begin\r
+ pbk.SubEntriesCount:=pbk.SubEntriesCount+1;\r
+ case combobox.ItemIndex of\r
+ 0:pbk.SubEntries[pbk.SubEntriesCount].EntryType:=GSM_Email;\r
+ 1:pbk.SubEntries[pbk.SubEntriesCount].EntryType:=GSM_Note;\r
+ 2:pbk.SubEntries[pbk.SubEntriesCount].EntryType:=GSM_Postal;\r
+ end;\r
+ for i:=1 to 61 do\r
+ pbk.SubEntries[pbk.SubEntriesCount].Number[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit.text)) do\r
+ pbk.SubEntries[pbk.SubEntriesCount].Number[i]:=Edit.Text[i];\r
+ end;\r
+end;\r
+\r
+procedure TPBKEditForm.Button1Click(Sender: TObject);\r
+var i:integer;\r
+begin\r
+\r
+ pbk.SubEntriesCount:=0;\r
+\r
+ for i:=1 to 51 do\r
+ pbk.Name[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit1.text)) do\r
+ pbk.Name[i]:=Edit1.Text[i];\r
+\r
+ pbk.Number[1]:=chr(0);\r
+ AddOneNumber(Edit2,ComboBox1);\r
+ AddOneNumber(Edit3,ComboBox2);\r
+ AddOneNumber(Edit4,ComboBox3);\r
+ AddOneNumber(Edit5,ComboBox4);\r
+ AddOneNumber(Edit6,ComboBox5);\r
+\r
+ AddOneText(Edit7,ComboBox6);\r
+ AddOneText(Edit8,ComboBox7);\r
+\r
+ if (ComboBox8.ItemIndex=0) then\r
+ begin\r
+ pbk.Group:=5;\r
+ end else\r
+ begin\r
+ pbk.Group:=ComboBox8.ItemIndex-1;\r
+ end;\r
+\r
+ MainForm.Timer2.Enabled:=false;\r
+ GSM_WritePhonebookLocation(@pbk);\r
+ MainForm.Timer2.Enabled:=true;\r
+\r
+ MainForm.ComboBox1Change(nil);\r
+\r
+ PBKEditForm.Close;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object SMSCEditForm: TSMSCEditForm\r
+ Left = 316\r
+ Top = 239\r
+ BorderStyle = bsDialog\r
+ Caption = 'Edit SMSC'\r
+ ClientHeight = 203\r
+ ClientWidth = 305\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Label1: TLabel\r
+ Left = 8\r
+ Top = 8\r
+ Width = 31\r
+ Height = 13\r
+ Caption = 'Name:'\r
+ end\r
+ object Label3: TLabel\r
+ Left = 8\r
+ Top = 72\r
+ Width = 36\r
+ Height = 13\r
+ Caption = 'Validity:'\r
+ end\r
+ object Label4: TLabel\r
+ Left = 8\r
+ Top = 104\r
+ Width = 35\r
+ Height = 13\r
+ Caption = 'Format:'\r
+ end\r
+ object Label5: TLabel\r
+ Left = 8\r
+ Top = 136\r
+ Width = 80\r
+ Height = 13\r
+ Caption = 'Default recipient:'\r
+ end\r
+ object Label2: TLabel\r
+ Left = 8\r
+ Top = 40\r
+ Width = 40\r
+ Height = 13\r
+ Caption = 'Number:'\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 168\r
+ Width = 81\r
+ Height = 25\r
+ Caption = '&OK'\r
+ TabOrder = 0\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 208\r
+ Top = 168\r
+ Width = 89\r
+ Height = 25\r
+ Caption = '&Cancel'\r
+ TabOrder = 1\r
+ OnClick = Button2Click\r
+ end\r
+ object Edit1: TEdit\r
+ Left = 96\r
+ Top = 8\r
+ Width = 201\r
+ Height = 21\r
+ TabOrder = 2\r
+ Text = 'Edit1'\r
+ end\r
+ object ComboBox1: TComboBox\r
+ Left = 96\r
+ Top = 72\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 3\r
+ Text = 'maximal time'\r
+ Items.Strings = (\r
+ '1 hour'\r
+ '6 hours'\r
+ '1 day (24 hours)'\r
+ '3 days (72 hours)'\r
+ '1 week'\r
+ 'maximal time')\r
+ end\r
+ object ComboBox2: TComboBox\r
+ Left = 96\r
+ Top = 104\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 4\r
+ Text = 'Text'\r
+ Items.Strings = (\r
+ 'Text'\r
+ 'Fax'\r
+ 'Email'\r
+ 'Paging')\r
+ end\r
+ object Edit3: TEdit\r
+ Left = 96\r
+ Top = 136\r
+ Width = 201\r
+ Height = 21\r
+ TabOrder = 5\r
+ Text = 'Edit3'\r
+ end\r
+ object Edit2: TEdit\r
+ Left = 96\r
+ Top = 40\r
+ Width = 201\r
+ Height = 21\r
+ TabOrder = 6\r
+ Text = 'Edit2'\r
+ end\r
+end\r
--- /dev/null
+unit smscedit;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls, GnokiiAPI,MainUnit;\r
+\r
+type\r
+ TSMSCEditForm = class(TForm)\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ Label1: TLabel;\r
+ Edit1: TEdit;\r
+ Label3: TLabel;\r
+ ComboBox1: TComboBox;\r
+ Label4: TLabel;\r
+ ComboBox2: TComboBox;\r
+ Label5: TLabel;\r
+ Edit3: TEdit;\r
+ Edit2: TEdit;\r
+ Label2: TLabel;\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure Button1Click(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ SMSCEditForm: TSMSCEditForm;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TSMSCEditForm.Button2Click(Sender: TObject);\r
+begin\r
+ SMSCEditForm.Close;\r
+end;\r
+\r
+procedure TSMSCEditForm.Button1Click(Sender: TObject);\r
+var\r
+ smsc:GSM_MessageCenter;\r
+ i:integer;\r
+begin\r
+ smsc.no:=smscselectitem;\r
+\r
+ for i:=1 to 20 do\r
+ smsc.name[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit1.text)) do\r
+ smsc.name[i]:=Edit1.Text[i];\r
+\r
+ for i:=1 to 40 do\r
+ smsc.number[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit2.text)) do\r
+ smsc.number[i]:=Edit2.Text[i];\r
+\r
+ for i:=1 to 40 do\r
+ smsc.defaultrecipient[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit3.text)) do\r
+ smsc.defaultrecipient[i]:=Edit3.Text[i];\r
+\r
+ case ComboBox1.ItemIndex of\r
+ 0:smsc.Validity:= GSMV_1_Hour ;\r
+ 1:smsc.Validity:= GSMV_6_Hours ;\r
+ 2:smsc.Validity:= GSMV_24_Hours;\r
+ 3:smsc.Validity:= GSMV_72_Hours;\r
+ 4:smsc.Validity:= GSMV_1_Week ;\r
+ 5:smsc.Validity:= GSMV_Max_Time;\r
+ end;\r
+\r
+ case combobox2.ItemIndex of\r
+ 0:smsc.Format:= GSMF_Text;\r
+ 1:smsc.Format:= GSMF_Fax ;\r
+ 3:smsc.Format:= GSMF_Paging;\r
+ else\r
+ smsc.format:=GSMF_Email;\r
+ end;\r
+\r
+ GSM_SetSMSCenter(@smsc);\r
+ MainForm.SMSCTabSheetShow(nil);\r
+ SMSCEditForm.Close;\r
+end;\r
+\r
+end.\r
--- /dev/null
+object SMSEditForm: TSMSEditForm\r
+ Left = 150\r
+ Top = 166\r
+ BorderStyle = bsDialog\r
+ Caption = 'SMS editor'\r
+ ClientHeight = 366\r
+ ClientWidth = 602\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ OnShow = FormShow\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Label1: TLabel\r
+ Left = 336\r
+ Top = 16\r
+ Width = 32\r
+ Height = 13\r
+ Caption = 'Folder:'\r
+ end\r
+ object Label3: TLabel\r
+ Left = 336\r
+ Top = 48\r
+ Width = 34\r
+ Height = 13\r
+ Caption = 'Phone:'\r
+ end\r
+ object Label14: TLabel\r
+ Left = 336\r
+ Top = 80\r
+ Width = 31\r
+ Height = 13\r
+ Caption = 'Name:'\r
+ end\r
+ object Button1: TButton\r
+ Left = 8\r
+ Top = 336\r
+ Width = 75\r
+ Height = 25\r
+ Caption = 'OK'\r
+ TabOrder = 4\r
+ OnClick = Button1Click\r
+ end\r
+ object CheckBox2: TCheckBox\r
+ Left = 336\r
+ Top = 112\r
+ Width = 249\r
+ Height = 17\r
+ Caption = 'Delivery report to the phone'\r
+ TabOrder = 1\r
+ end\r
+ object Button3: TButton\r
+ Left = 232\r
+ Top = 336\r
+ Width = 81\r
+ Height = 25\r
+ Caption = 'Cancel'\r
+ TabOrder = 2\r
+ OnClick = Button3Click\r
+ end\r
+ object GroupBox2: TGroupBox\r
+ Left = 328\r
+ Top = 160\r
+ Width = 265\r
+ Height = 169\r
+ Caption = 'SMS center'\r
+ TabOrder = 3\r
+ object Label2: TLabel\r
+ Left = 8\r
+ Top = 48\r
+ Width = 40\r
+ Height = 13\r
+ Caption = 'Number:'\r
+ end\r
+ object Label4: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 16\r
+ Height = 13\r
+ Caption = 'Set'\r
+ end\r
+ object Label5: TLabel\r
+ Left = 8\r
+ Top = 80\r
+ Width = 36\r
+ Height = 13\r
+ Caption = 'Validity:'\r
+ end\r
+ object Label6: TLabel\r
+ Left = 8\r
+ Top = 112\r
+ Width = 35\r
+ Height = 13\r
+ Caption = 'Format:'\r
+ Visible = False\r
+ end\r
+ object Edit1: TEdit\r
+ Left = 64\r
+ Top = 48\r
+ Width = 193\r
+ Height = 21\r
+ TabOrder = 0\r
+ end\r
+ object ComboBox2: TComboBox\r
+ Left = 64\r
+ Top = 16\r
+ Width = 193\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 1\r
+ Text = 'ComboBox2'\r
+ OnChange = ComboBox2Change\r
+ end\r
+ object ComboBox3: TComboBox\r
+ Left = 64\r
+ Top = 80\r
+ Width = 193\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 5\r
+ TabOrder = 2\r
+ Text = 'maximal time'\r
+ Items.Strings = (\r
+ '1 hour'\r
+ '6 hours'\r
+ '1 day (24 hours)'\r
+ '3 days (72 hours)'\r
+ '1 week'\r
+ 'maximal time')\r
+ end\r
+ object ComboBox4: TComboBox\r
+ Left = 64\r
+ Top = 112\r
+ Width = 193\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 3\r
+ Text = 'Text'\r
+ Visible = False\r
+ Items.Strings = (\r
+ 'Text'\r
+ 'Fax'\r
+ 'Email'\r
+ 'Paging')\r
+ end\r
+ object CheckBox3: TCheckBox\r
+ Left = 8\r
+ Top = 144\r
+ Width = 249\r
+ Height = 17\r
+ Caption = 'Reply via the same SMS Center'\r
+ TabOrder = 4\r
+ end\r
+ end\r
+ object CheckBox4: TCheckBox\r
+ Left = 336\r
+ Top = 136\r
+ Width = 241\r
+ Height = 17\r
+ Caption = 'Read'\r
+ TabOrder = 7\r
+ end\r
+ object ComboBox1: TComboBox\r
+ Left = 384\r
+ Top = 12\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 0\r
+ Text = 'ComboBox1'\r
+ end\r
+ object SMSEditPageControl: TPageControl\r
+ Left = 4\r
+ Top = 64\r
+ Width = 313\r
+ Height = 269\r
+ ActivePage = PBKSMSTabSheet\r
+ Style = tsFlatButtons\r
+ TabIndex = 4\r
+ TabOrder = 6\r
+ object TextSMSTabSheet: TTabSheet\r
+ Caption = 'TextSMSTabSheet'\r
+ object GroupBox1: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ BiDiMode = bdLeftToRight\r
+ Caption = ' Text '\r
+ ParentBiDiMode = False\r
+ TabOrder = 2\r
+ object Label7: TLabel\r
+ Left = 8\r
+ Top = 216\r
+ Width = 36\r
+ Height = 13\r
+ Caption = 'Coding:'\r
+ end\r
+ object Label8: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 39\r
+ Height = 13\r
+ Caption = 'Feature:'\r
+ Visible = False\r
+ end\r
+ object Memo1: TMemo\r
+ Left = 8\r
+ Top = 48\r
+ Width = 281\r
+ Height = 137\r
+ Lines.Strings = (\r
+ 'Memo1')\r
+ MaxLength = 160\r
+ TabOrder = 0\r
+ OnChange = Memo1Change\r
+ end\r
+ object ComboBox6: TComboBox\r
+ Left = 72\r
+ Top = 16\r
+ Width = 217\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 1\r
+ Text = 'None'\r
+ Visible = False\r
+ Items.Strings = (\r
+ 'None'\r
+ 'Linked'\r
+ 'Enable Voice'\r
+ 'Disable Voice'\r
+ 'Enable Fax'\r
+ 'Disable Fax'\r
+ 'Enable Email'\r
+ 'Disable Email')\r
+ end\r
+ end\r
+ object ComboBox5: TComboBox\r
+ Left = 72\r
+ Top = 216\r
+ Width = 217\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 1\r
+ Text = 'GSM Alphabet'\r
+ OnChange = ComboBox5Change\r
+ Items.Strings = (\r
+ 'GSM Alphabet'\r
+ 'Unicode')\r
+ end\r
+ object CheckBox1: TCheckBox\r
+ Left = 8\r
+ Top = 192\r
+ Width = 249\r
+ Height = 17\r
+ Caption = 'Class 0 (displayed immedietaly on the screen)'\r
+ TabOrder = 0\r
+ end\r
+ end\r
+ object BitmapSMSTabSheet: TTabSheet\r
+ Caption = 'BitmapSMSTabSheet'\r
+ ImageIndex = 1\r
+ object GroupBox3: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ Caption = 'Logo'\r
+ TabOrder = 0\r
+ object Label9: TLabel\r
+ Left = 8\r
+ Top = 176\r
+ Width = 43\r
+ Height = 13\r
+ Caption = 'Network:'\r
+ end\r
+ object Label10: TLabel\r
+ Left = 8\r
+ Top = 200\r
+ Width = 24\r
+ Height = 13\r
+ Caption = 'Text:'\r
+ end\r
+ object ComboBox7: TComboBox\r
+ Left = 64\r
+ Top = 176\r
+ Width = 153\r
+ Height = 21\r
+ ItemHeight = 0\r
+ TabOrder = 0\r
+ Text = 'ComboBox7'\r
+ end\r
+ object CheckBox5: TCheckBox\r
+ Left = 224\r
+ Top = 200\r
+ Width = 73\r
+ Height = 17\r
+ Caption = 'Unicode'\r
+ TabOrder = 1\r
+ end\r
+ object ScrollBox1: TScrollBox\r
+ Left = 8\r
+ Top = 16\r
+ Width = 161\r
+ Height = 153\r
+ HorzScrollBar.Smooth = True\r
+ HorzScrollBar.Size = 5\r
+ HorzScrollBar.Style = ssFlat\r
+ HorzScrollBar.ThumbSize = 5\r
+ HorzScrollBar.Tracking = True\r
+ VertScrollBar.ButtonSize = 1\r
+ VertScrollBar.Range = 500\r
+ VertScrollBar.Style = ssHotTrack\r
+ VertScrollBar.Tracking = True\r
+ AutoScroll = False\r
+ BevelInner = bvNone\r
+ BevelOuter = bvNone\r
+ BorderStyle = bsNone\r
+ TabOrder = 2\r
+ object Image1: TImage\r
+ Left = 0\r
+ Top = 0\r
+ Width = 142\r
+ Height = 394\r
+ Align = alCustom\r
+ AutoSize = True\r
+ Picture.Data = {\r
+ 07544269746D6170D6E10000424DD6E100000000000036040000280000008E00\r
+ 00008A0100000100080000000000A0DD0000320B0000320B0000000100000001\r
+ 000000000000000080000080000000808000800000008000800080800000C0C0\r
+ C000C0DCC000F0CAA60018080000000008000008080008000000080800000800\r
+ 0800080808000808100010080800101010001808000018100800181414002520\r
+ 080021181800212121002D211800292121003129210039292100292929003931\r
+ 2900313131003931310042392900423931004A3929004A393100526B08003942\r
+ 1000524229004A423100524231004E56310039393900424239004A4239005242\r
+ 39004A4A3900524A3900424242004A424200424A42004A4A4A004A524A005A42\r
+ 3900524A4200524A4A005A4A39005A4A4200634A4200525252005A5242005A52\r
+ 4A005A5252006352420063524A00525A52005A5A52005A5A5A00635A4200635A\r
+ 4A006B5A4A006B5A52006B5A5A00735A4A005A632900627331005A734A006B63\r
+ 520073635200736B52006B8C52005A635A0063635A0073635A00736B5A006363\r
+ 63006B6B63007B6352007B635A007B6B5A007B6B63007B73630084735A00846B\r
+ 630084736300ADAD5A00B5842900BD7B08006B736B0073736B006F6F73007B7B\r
+ 7300847B630084736B00847B6B0084847B008C7B63008C736B008C7B6B008C7B\r
+ 73008C84730094847B00848C84009C8C84008C948C0094948C00949494009C94\r
+ 8C007B9C6B0094B584009CBD8C009C9C9400A59C9400A5C694009C9C9C00ADA5\r
+ 9C00A5A5A500A5ADA500ADCEA500ADADAD00B5CEAD00B5D6AD00BDD6AD007363\r
+ B500B5B5B500C6BDB500BDC6B500BDBDBD00C6C6C600CECEC600CECECE00D6CE\r
+ D6008C5AF700C6D6BD00C6D6D600CED6CE00CED6D600CED6DE00D6D6CE00D6D6\r
+ D600D6D6DE00DED6D600DED6DE00CEDEDE00D6DECE00D6DED600D6DEDE00D6DE\r
+ E700DEDEDE00DEDEE700E7DEDE00DEE7DE00DEE7EF00E7E7DE00E7E7E700E7E7\r
+ EF00EFE7E700EFE7EF00D6EF8400E7EFE700E7EFEF00EFEFE700EFEFEF00EFEF\r
+ F700F7EFEF00F7EFF700EFF7EF00EFF7F700F7F7EF00F7F7F700F7F7FF00FFF7\r
+ F700FFF7FF00E7FFAD00F7FFF700F7FFFF00FFFFF700FFFFFF00F0FBFF00A4A0\r
+ A000808080000000FF0000FF000000FFFF00FF000000FF00FF00FFFF0000FFFF\r
+ FF00000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000000000000000000000000000000000000000000000000000000000000000\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C598C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C598C5077E6432201B1610\r
+ 13131B231F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F1F\r
+ 232323232C2C2C2C2C32323232332F3233383838383333333833323232323232\r
+ 32322C232332323232232323232332322E291B100D1316182C3DC088C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C507C01600000F0D10131613130D1E3D4444444444444444534444\r
+ 4453444453535353535353535353535353534444445344444444444444444444\r
+ 444444444444444044444444444444444444444440444444444440403D3D3D3D\r
+ 402C0016161613100D00000016728BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5987B130016191B1B1C1C1C1C\r
+ 1C1F132C64676565656565656565656565656565656565656565656565656565\r
+ 656565656567656567676767C0C0C0C0C0C0C0C0C07272727272727272727272\r
+ 7272C0C0727272C07272C0C072C0C072743D15382F2E2929292E231B10000FC0\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C598530E181B1B1C23232E2929231F2E1F38677272727474747474747474\r
+ 747676747676767676767676767B7B7B7B7E7E7E7EBFBF7E7E80808383888888\r
+ 8B8B8B8B8B07070707070707078C8C070707070707070707070707070707078C\r
+ 8C57175B5049494F505550473B1F000066C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C544151B1F1F232E383B47423B42\r
+ 3E3A1F407E838383888888888B8B888B8B8B8B8B8B8B8B8B8B8B8B8B8B8B0707\r
+ 070707078C8D8D8C8C8D8E8E8E97979D9DA0A0A0A0A0A0A2A6A6A6A6A6A6A6A6\r
+ A6A6A6A6A6A5A6A6A6A6A6A6A6A6A6AEA0531D685B5B5C5B5C5B5B565B492313\r
+ 00C098C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C56517232E2F3E48414F4950505550505B1F578C978E979797979797979797\r
+ 978F8E8E8E8E8E8E8E979797979797979797979797979DA0A0A0A0A0A0A0A5A2\r
+ A6A5A6A6A6A6A6A6A6A6ADAEADADADAEAEAEAEAEAEADAEAEAEAEAEAEAEAEAEB5\r
+ A03D37695C5C605B5B5B5B5B5B5B502910007298C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5980719233B383E474F55505050555B5C\r
+ 5C6A243F8EA8A0A0A0A0A0A0A0A0A0A0A09D9D9D9D9797979DA0A09D9DA09D9D\r
+ 9D9D9D9D9D9DA0A0A0A0A2A5A3A0A2A5A5A6A6A6A2A6A6A6A6A6A8ADADAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBD8E23506F695C5D5B5C5C5C5C5D605C50\r
+ 1F0013BFC5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5383B4948474F4F50564F555050555B5C5D461F07AEA6A6A2A2A2A0A0A0A0A0\r
+ A0A0A0A0A09DA09DA0A0A0A0A0A0A09D9DA0A09D9DA0A0A0A0A0A0A0A0A0A2A5\r
+ A2A2A6A6A6A6A6A6A6A6A6ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB0AEB5B5\r
+ 8B1F6D6A69605C5C5B5C5D605D5C5C603E180032C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C598883A6A6E555056565D494F5650565D56\r
+ 5B5B5B1780B5A8A6A5A5A6A2A0A0A0A0A0A0A0A0A0A09D9D9DA0A0A0A0A0A0A0\r
+ A0A0A09D9DA0A0A0A0A0A0A3A0A0A2A5A5A5A6A6A6A6A6A6A6A6A8A8ADAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEB1AEB5B580236E5D605D5C695F5B565B5B5D6969\r
+ 5B23001083C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 675D736A505B565B56565555565B5D565B5D691774ACAEA6A6A6A6A5A3A0A0A0\r
+ A0A0A0A09DA0A0A0A0A0A0A0A0A0A0A0A09D9DA0A0A0A0A0A0A0A0A0A0A0A0A2\r
+ A5A6A5A5A6A6A6A6A6A6ABADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEBDAE\r
+ C0236E5D5D5C5F5D5656605F5B5D60695F38160072C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5A05C7C7F69565C695B5C5C5549505B565C\r
+ 5B50601D57A0B2A6A2A5A6A5A2A0A0A0A0A0A0A0A0A0A0A09D9DA0A09D9DA0A0\r
+ A09D9DA0A0A0A0A0A0A0A0A0A0A2A2A0A2A5A5A5A5A6A6A6A6A6ADAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEB0B0B0B0B1BD9D393B605D5C5C5B5C5B5D60605D606069\r
+ 68471B003DC5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 557C835D5B565B505B5650555C5656605D565B411C07B5A6A6A6A0A2A5A3A0A2\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09DA0A0A0A0A0A0A0A0A0A0A0A3\r
+ A5A5A6A6A6A6A6A6A6A8ADADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB0B1B5B58B\r
+ 1B59605C5B5C5C5D5C5B5C5B5D605D605D501C00208CC5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C58B5C887C7056565C5B565D5B505C60695B\r
+ 555B5B5B157EB5A6A5A6A5A5A5A3A0A2A0A0A0A0A0A0A0A09DA0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A5A2A5A6A6A6A6A6A6A6A6A6AEADAEAE\r
+ AEAEAEAEAEAEAEB1B0AEAEAEAEBDB57B1B605C5B5B5B5B5C5B555B60605C5C60\r
+ 5D502300168BC5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C588\r
+ 708377695C695C5D49505B49495D605B5B5B55691767A6AEA5A6A5A3A5A5A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A09D9DA0A09D9DA0A09DA0A0A0A0A0A0A0A0A5A5\r
+ A6A5A5A6A6A6A6A6A6A6A8ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEB0B0B0BDA657\r
+ 246C5660605C5D5C5B5C605D5C5D60605F5B2E0E0080C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5807388735669505B5B5B5B504F565B4F49\r
+ 5B504F4F2A2E8CB4A6A0A5A0A2A5A2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A5A5A2A6A6A5A6A6A6A6A6A8ADAEAEAEAE\r
+ AEAEAEAEAEAEAEAEB0B0AEAEB5BD8C1C4F6960605D5C5D5C5C5D5C5C5D695D5D\r
+ 606038100074C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C577\r
+ 7C897156565B565C5D494F4749555B564F555C5555157BAEA6A6A6A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09D9DA0A0A0A0A0A0A0A0A2A0A0A0A0A2A5\r
+ A5A5A6A5A5A6A6A6A6A6A8ADAEAEAEAEAEAEAEAEAEAEB0AEAEAEAEAEB5B57615\r
+ 5B5D5D5C5B5B555B5B5D565C60605B5B6A693B160064C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5717C89715B5B5B5D505655484F55484F55\r
+ 555555486E1D65A6ADA0A0A2A5A5A3A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ 9DA0A0A0A0A0A0A0A0A0A0A0A0A0A2A5A5A0A0A6A6A6A6A6A6A6A8ADAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEB0BDA04424605C5B565B5C565B565B5D5C5A5C5B5C\r
+ 69603F160044C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C570\r
+ 88886A505B4F5B554F565B565B5B56484850565556311F07B4A0A0A5A3A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A09DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A3A2\r
+ A2A6A5A5A5A6A6A6A6A6A8ADAEAEAEAEAEAEAEB0AEAEAEAEAEAEAEB5B5881550\r
+ 5D5C60565B5B5B5D5C56565C5C5B5C5D696042180036C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5987088886F605D495A605D5B56495C564F4F\r
+ 50554F4F495B1574AEA2A0A0A0A0A0A2A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A2A2A0A2A5A5A5A5A6A6A6A6A6ABAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEBDAE67155B5B5B565B5C5C5C5B5B565B5B5B5B5D5D\r
+ 5F60481B0033C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C56F\r
+ 838369506055484F5B5149425055494F5D564F55555D1D449DAEA0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A2A5A5A5A5A6A6A6A6A6A9ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEB4BD8E1F2460\r
+ 5C5C5C5B565B565C695C5B5B5D5C5C605C5D501C0032C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C57189885C555C5B5556564948485B504F50\r
+ 565050504F56501780B5A09DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A09DA0A0A0\r
+ 9DA0A09DA0A0A0A0A0A0A0A0A0A0A0A0A2A0A0A0A2A2A6A6A6A6A6A6ADAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEB5B57415555D5B5B5C5B5B5B5C5D5C5D5C5C5C5C5B5D\r
+ 5C60501B002C8CC5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C573\r
+ 897F6A5D5056565B50474955564849505B565B55554F5C1D3897B5A0A0A09DA0\r
+ A09DA09D9D9DA0A09D9DA0A0A0A09D9D9DA0A09DA0A09DA0A0A0A0A0A0A0A0A0\r
+ A0A0A0A3A5A0A3A6A6A6A6ADAEAEAEAEAEADAEAEAEAEAEAEB0B5BD8D1B245D60\r
+ 5C5C5B5C5B565C5C5D5C5B5B5C5B5B5D5D695B1C002007C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C50777077F5F5048555556565056564F505B4F\r
+ 5C5C565C5B4F495B1558AEBDABA6A5A0A0A09DA09D9D9D9D9D9DA0A09D9D9D9D\r
+ 9D9D9DA0A0A0A0A0A0A0A3A2A5A5A6A3A0A2A2A0A0A0A2A5A6A6A6A6A8ADADAE\r
+ AEAEAEB5B5B5B5B5BDBD8E2C154F5D60565D5D5B5B5C56565C5C5C5D5C5C5C5D\r
+ 5D60561F001E8BC5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C58B77\r
+ 897C69554949504F4F5B565651695B555B4F50504F484F504F15328BA6B2B5B5\r
+ B1B1AEA6A6A6A6A0A0A0A0A0A0A0A0A2A6A6A6ADAEAEACADABADADADAEAEAEAE\r
+ AEAEAEAEAEADADA6A6AEAEAEB4B5B5B5B5B5B5B5B5AEA69D07C01517555B5C5B\r
+ 5B5C5B5B5C5D5C5B5C5C5B5C5C5B5C5B5B69562300198BC5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C58877077C695D55554F50505B4F50564F5056\r
+ 56505B5C4949555048481F10132E6474808B8D97A0A6A6A6A6A6ABABADADABA6\r
+ A09D8E0788BF7B7672C0C0C07274747E838B8D97A0A6A6A6ABA9ACA6A6A6A097\r
+ 8C8B8074653D1F1510152F555D605C5C5C5B5C5D5B5B5B5C605D5B5B5C5B5B5C\r
+ 5B605B2F001888C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5887C\r
+ 077C5B504F55555056554950554F495050555055554F505B564F49472E1F1715\r
+ 151515151B23385764C07476747264361B130000000000000D0D000D100D0000\r
+ 00000D101932576667675844381F1B171715171D1F2A3B47505C5B5B5B5B5D5C\r
+ 5B565B605B5B5C5C60605C5C5D5C5C5B5C605B2F0D1683C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5837C89775B425050554955504F504F4F4847\r
+ 555049474F50505049484F4F50504F4F48413B312A241F1D1717171515151515\r
+ 171B1C1C1F23232323292923292929292923231F1F1D1B17171D1F242A2F4150\r
+ 565B5B5D5D60605B565B5B5B565B5B555B56565D5D565C5C5B5C5C5C5B56565B\r
+ 6060502E130083C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5807C\r
+ 8977565055474F4F564F49554F5B4F46495050504F56554F504949494F505650\r
+ 504F474F4F47494F494948484F4942484F48464246414242424848484742474F\r
+ 504F4F5051565B5B51565D5B565B5D605D5B55565C5C5B5B55555D5D5B555055\r
+ 5B5B555B5C5B5B5B5B5B5B5C56565C5C60695B2F130080C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C57F7F89736050554F5150504F554F4749494F\r
+ 48494856555549505048474F4F4F4F4F4848495550494F505049494F48484F48\r
+ 49504947494948494F4F4F484F504F50504F4F505050555B56555550505B5B56\r
+ 5B5555565B565B5C5B555B565B55555B5B5B5B5B565B505B605C5C5C5C5B5C5D\r
+ 60605B2E13007BC5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57783\r
+ 07775B4F5055554F4F5650494F484955504F504F55494950484949494F4F4848\r
+ 474748484F4F50504F484850504F5549474F4F4848494F4948494F4F50554F49\r
+ 494F504F4F5050565651515050565B5655565B5B55565B5B5A565C555B5B5B5C\r
+ 5B5B5B565B5555565B5B5B565C5B565C5C5D5B38160074C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5778889735C504F49484F4F5C565055554F4F\r
+ 50484F42485050484850554850504F48424742505049494A4F48494F4F504F4F\r
+ 4850504F49494F50504F49495050505050504A4F4F50505056565B5650555656\r
+ 5656505655555B5B565B5B555B5C5C5B55555B55565B5B505B5B5B555C5D5B5C\r
+ 5B5D603B160072C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57189\r
+ 07715B4949505555485B5B4F49554F484F494948474F4F484F4F504F4F494850\r
+ 5049475056494849494950504948484F4F504F474949484F4F4F4F49494F4950\r
+ 50484F505055565050565556565050565B5B50565B565B55555B5B5656565C5B\r
+ 55555B5B56515B5B5C5B56565C5C5B5D5C5D5B38180064C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5708907735C565D5D5555505556474F504748\r
+ 4F4749554F47504F4949505049484242474F56504F4F49474850554947424850\r
+ 504948424749474247484747484748505048494F4F50555651505656515B554F\r
+ 5656555556565550565B5B565B5B5C5C5B5B56565B5C5B565B5B5B5D5B56605B\r
+ 5D5C5C3E190064C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C56A89\r
+ 8871695650504F5050494949564F4F4847474F5049484948505549474F504946\r
+ 475050494949484950564F49494848494F4F4F423E4142495651485050474147\r
+ 47494F49505550565550555555565650555B5650565B555050555550565B5B5C\r
+ 5C5B5B565D5D565B5C505B605B556056505C5D47190044C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C570897F6F6051505C564F4F5049505A494848\r
+ 484F484247484848494942414948424749494241474647505048424748474147\r
+ 4F4947485A5D68605D5D5C5B6A706E5D514241474F5650485056504F50565550\r
+ 555B50505B56555B5B555055565B55565B5656505B5C515B5C55565D565B5656\r
+ 5B5C5B481B0053C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C56F88\r
+ 88715B555C5B5655424F4947504F4141494747504849504847494F4247474747\r
+ 42484F494949494F48494F4746484747505B5E5B422E1F1B16161613161B2347\r
+ 70737150414F504F505B565555565B5555505056505055565B5B5B56565A5655\r
+ 5B5B56555556565B565B5C5B5D5B565B5C5C5D481B003DC5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C57189886A554955504F554950484149504747\r
+ 4948484F4748504842473E4148474A49484F504847494947495B55484842475B\r
+ 6E501F160E000000000B101313100000101B557C7046414F555155565B55555B\r
+ 5B5155565050565556555556505055565B565555565B5B5B5B565C5B56565B56\r
+ 565C5D501B0032C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57189\r
+ 8369504F4F4F47484F50554F48413E48473E3E41464148473B373B4748474241\r
+ 484841474847474F4F50554947506C56200F0000000F101016181E2C33363633\r
+ 20160013407C7141475550555B5B5B5B565B5650565655565B564F565B5B5B5C\r
+ 5B5C56555B5B50515B565C5D5B5C5B565B5D69501B0035C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C57089835D4849484F49485542424749493E41\r
+ 555B6D716F6A6F6F777C5A3B41473E4147424850484849484848424860602310\r
+ 000010101013161618192020323644535757441E001970775048565550565B56\r
+ 555055565655555B555168706C6E6F6E6E736E6C5D565B565B5B5B5C5056565B\r
+ 5D5D5D551B002C07C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57007\r
+ 88504F494F504F424248424141506E71715C381C1818181619588373413E4949\r
+ 47484F4F4F49494848474960501800000F1010100F0010161819191E2C333644\r
+ 53575865531800387C6E4F50505656565655505556555B505D6E551B00000F00\r
+ 101B385B70716A5D5C5C5C605C565B565B605C501B0032C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5077389835B554842424947464742486E6F3F18\r
+ 0C000000000000000B0016C07148424F4948494F4949504F484F603B10000B10\r
+ 101010001E582000161819202C32363D44535358656532002C776D47555B5650\r
+ 5B5B565B5C56556E6E2300001020202020180B00001F5C73705D565B5D605C60\r
+ 5C5C5D4F1B00208BC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C57707\r
+ 7F55554948484248414F6E70291000000B0B0F1010101010161E1300577C503B\r
+ 4842424F504F4F47476E4916000C1010101000208EBD97330016131618192033\r
+ 445353575865C03D002C735D505B5C5C5C5D5C5C56506C5C16000F2057656565\r
+ 676765572C1000185C736F5B5C5D5B5D5D6060501C00208BC5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C58873077F5C49484947424250683810000B1010\r
+ 101010101313131310163220004073504747474F5B5050505C601C0000101010\r
+ 13100066A0BFA680101333443D3D534436445353586467C02C0D427155555C60\r
+ 5C5C5C565B6E5613000F2C5758646464656567C0C0C04410001B71735B5B5B5D\r
+ 605C5D5B1F002007C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5077789\r
+ 7C51423E483B3F5D4816000C101010101010101313131316161313332C004073\r
+ 56474955565656506A482C3216000F101610107E97648E881058BDA08E8E9DAE\r
+ 7B324457586465C044001C6A5B5B5B5D5D5B5B5C6E5B1600102C443D36535867\r
+ 676565676767C0C0440F004077685D5D5C5D605B23001883C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C58B7389775D4241474260381000101313161613\r
+ 101316161810101616161616392C00447048475050505050713B38C020001316\r
+ 130C007B9D648C88163566130F10197672364458586467724400195A5C5C5C5D\r
+ 5D5B5B6E5C19000F1E363665807E76646767676767676767C0671E002C7C6E56\r
+ 5D5D695B23002007C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5837307\r
+ 7C565A47415E231010161616161916101016161610442C131618181616441E10\r
+ 556E4F56554F5B4F5C4F1F676410101616100064A683A38316001016191E1E1E\r
+ 323644575864677232001B565C565B605D5B5B5B1F00001832393274A0A08C58\r
+ 656767676767676767C0C033001873715B5B5D5B29001988C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5887C8D7C493E425D1F0016181816161E005776\r
+ 1E10161300077B1813161619131E57161F5D5050565B564F506E1C2C83721800\r
+ 1016001E07BDA036001618181B1B202C3233353D536474641010385C5D5D5C60\r
+ 5D5C6F420000162033333688BDB5AE8853C067C0767674676767C0C036001377\r
+ 6E5B695D2300167EC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5BF7C07\r
+ 735547501F001618191B1E19107EA6B5AB4400208BB5BD8319101818160F3D20\r
+ 164A60554F565C5B50605B132007AB8BC03D2C101853200016181819191E202C\r
+ 3236445867725818001B506A695D5D605B6069230B16162C323636678EA69783\r
+ 57C067808E8B8C7B58C067C0723D0016776A5D5B29001883C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5BF7C07714F464210181E19202020200074B5BD\r
+ A0321616168B7419181B191816003D2013385650565B5C5B504F604716001653\r
+ 7272C0663D1B1E2C20202020202C333D443D363320130000163B5B5C5C5B5B5D\r
+ 605C5B233D66131932363672ABB5AE9764657B8EBF34BF8E7267C0C072743D00\r
+ 2373605D2E00167EC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C57C7F07\r
+ 71485B1B2C64191920202C2C1E7E9DA6A0571E1E16443219191E201B16205316\r
+ 16415B5C5D5C5C5656554F514F1F10000000001013161616161616161616130F\r
+ 000000000000131C3B495B5C5B5C5B5C605D68291EBF67132C44443683A08C07\r
+ 53C0C0808C078C88C067C0C0C074C010005060602E100C72C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5777F8D703E4F1720883D363644444444135374\r
+ 1E192C2C2C161E2C2C2C2C2C324419001B4255564F5055504F50504748494842\r
+ 381F1B1610101000000B0000000B000E10161B1C233E4850505656565B5B5D5D\r
+ 565B6A56101876441E36575767767B7B67C0C065C0BF7258C0727272747B6510\r
+ 002F606A2E1000BFC5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5777F07\r
+ 734F423B0032768E978E8C8B83837BC07472C0666664645857443320160F0016\r
+ 293E47504F4F565B555B5D5B5B5D5D5C5D605F5A505050474142423E41474748\r
+ 50515B5B5D5B5B6A605B5D605B565C5D5D55506850130013191B325358586567\r
+ 74727274726772747474747272581600164860602F0F007BC5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5707F0770483842230E0020587B888C9DA6A6A3\r
+ A09D978E8B7EC0442010000000101C38505B5C696F7071706F6F6F70706E6F6F\r
+ 6A695D5B554F505048464249505048505B5B5B606A6A6E6F6E6C6F6F6E6E6060\r
+ 60605D5C685D29100000000B1932446465676767C0C067655844321E10000013\r
+ 385B685D38130067C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5708389\r
+ 6F42423E3B2E1B0E000000000000001316181813000000000010181C2F496871\r
+ 71716E69695C4A3F3B381F1B1B16161610100F0B10100B0B000000000B0B0B0F\r
+ 100F101616181B1C1F2E3B475555555C606F6F685D6C6E6E4F23161000000000\r
+ 00000B1010000000000000001018234F5D5C605D38100074C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C57088896A47473838292E382F23231C18161310\r
+ 000D0D0D13161C232E42565B4F504F3E291C1810100000000000000010101013\r
+ 161618181618191B1B1C1C1C1B19191919191916161310100B0B000010131316\r
+ 1C1F293B485556686F6E6E5B47381F1B1919151516161B1F233847505B60605E\r
+ 5B5C5D5F3B1000C0C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C56F8889\r
+ 5D4848413E2F23231F1F2329232E2E382E2E2F292E2E3B38291F1C1B16100F00\r
+ 0000101316191B1F23232E38383B3B41413B3B47484F4F494F4F4F5056505B5B\r
+ 504F474850504F4F48423E382E231F1B181610161616181B232E3E47565C5D5B\r
+ 565C5B565B5B60605B565B504F47424F5B5C5C5D3B160058C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5A06A89896A41474847423B2F2E231F1C1B191616\r
+ 1616161616101613100F1010181B1C1F232E312F3B3E4247414147423E3E3B3B\r
+ 3E474F484138231B191818191B1F38424F5B5B5046474F5555505056515B5D56\r
+ 5155504F412F231C1B16161918191C1C1F1F231F2323232323232F3B474F515D\r
+ 605B5B693F160066C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5986A8989\r
+ 6E42494946413F3E413B2F2E382E231F1F1C1C1F1F1C1C1F232E382F3B3E413B\r
+ 383E3E3E3E3E3E3E3E4748473E38415056472319100000000000101013131010\r
+ 161F425D69554647484F4F504F50505050555B5B5B60605B5D5B4F47423E382E\r
+ 2F3838383E414249555B565D5D605D5C5B5B60683B160058C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C56F8988694249494F483E4742413E473B3E4242\r
+ 3E2F2A3E47474747483B3138383B3E3B3B3E3E41423E383B3B3E47413E495B47\r
+ 1F100000000B1010161E2C32363D3D3320160B194A7160474850504F50565055\r
+ 5B505050515655555C5B5B606E6E6E6E6E6E696068685C6060605D5C5B5C5B5B\r
+ 5C5B5D603E160044C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5986F8988\r
+ 563E474F50474948483E3E423B2F3B41495655555D6F6A6F7170482F2F3B3E3E\r
+ 3E3B42423B413E3B383B3E41565B2910000010100B000F161619202C33364457\r
+ 6464441E101E5D7155424F504F5550565B56505150505055565C6E706A5D6969\r
+ 606E70706D5D565B605B5C5B5B5C5B5B5C5C5C5C41180057C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5987007885B3E494847474147423E3B2F3E485B55\r
+ 504738201B1E1E20204473603B3B3B3E3E3B3E423E424741413B486047160000\r
+ 0B1010000F0F001016161E202032363D44576467441610397150415050504F56\r
+ 565B5650555555566070501F131013131319234260706E605C5B5C5D5B5B5C5D\r
+ 5D60605D3B180053C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C598710783\r
+ 5646414841473E473E4242495B563819160C0000000000000000196970473B42\r
+ 42414747424747473E496E3F13000B10100B002007B57B160F19161E322C2C32\r
+ 3653535765652C002C7768475656505556555656504F5B6E6023000013202020\r
+ 2018130F101B426E71695B605D5C5D5D5B5D60693B160033C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C571897F494141474147474241505B471C160000\r
+ 00000B1010101010101613105771483B4247484847424242475D3E1000101010\r
+ 10001888A088AD66207657BF97663D8BC03257535765C0360B38735B505B565B\r
+ 5B55555650516E5516000F2C575865656565585332180013387073605C5B5B5B\r
+ 5B5D696042190036C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C598708C7F\r
+ 4F4949463E413B3E5B491F1000000B100B1010100B0F10100F10201E0B40714F\r
+ 3E424847424747384F5B1B0000101010130016809D88A6572088748388747EAE\r
+ 88343D5857586772320F4068505B50565B5655565B6F50100010324453585864\r
+ 646567C0C067531900135C776D5B5D5B5C5C5D6049190036C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C58C738C7F4F474942383848603B16000B00001000\r
+ 000010100B000010100B102C2C0B40734F424850504F4F425D3B3235160B1313\r
+ 16100036AEBD071844A0888074888D8B8DC034575864657244001C5D5555555B\r
+ 565B5B5B6F56130000103644535864656465656565C072C0531600296E6E5B5D\r
+ 5B565D6D4F18002C07C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C58C73077F\r
+ 473B3B473B485B1F1000001020100020C01800003653160000000010322C0B55\r
+ 734F4750504F504F6E2433722000161616100E769D83975357BD7B3653747453\r
+ 74C036536464657244001B5A50565B55515B5B6E5D190013677B2C3353444453\r
+ 585358656565576472C03200167373505C5C5C60501B002C8CC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C573897F503B423E495B1B000F10000097071619\r
+ 8E8E18328C077216588B530F103D1E166A715048484F55495D4119C067100013\r
+ 19160058B5BDA23619722C00161E2C2C323D5353586467722C001F5B50555656\r
+ 565B606A230000137EB5801964C0727272747483806583BFC0C0724400167073\r
+ 5D5C5D5B47190032C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C58B77077C\r
+ 49413B41511800101010100080BD202088808BBF83078818329D72160F1E5316\r
+ 1F695D4F4F554F47556E1C1E7E7E32130D131010537B3610101016191919202C\r
+ 32333D4457C07B5700103B5655565C5C565D6F3E00001613198DB25764A0A08B\r
+ 74A0807E9D7497886467C07258000D5C716069604819002C07C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C50777077C48473B5E1B0010131016160019AE582C\r
+ 07078D88078BA674078E331016103D2016425B50565549505060551516728B83\r
+ 7464362018131016191616192020323644576467C0C04413001B505F5D5B5B5D\r
+ 565D6D2E1819002C8CBDB58BC0ABB5077EA0887EAEBF7E0758C0C0C07458000E\r
+ 506E5D604F1B00208BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C58B7C8D71\r
+ 3E3B473B101613161618191600839D20729735678B677B7480BF2C13130F3320\r
+ 102E5555554F555B50485B421600101E323D5865573633322C2C202C32333644\r
+ 443D321E160B00001638505B5B5D5B565B685B1F66C000C0B5BF7BAE76880788\r
+ 078C8C8B8B078DA5746772C072723D00195B5C6D561900208CC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5837F0773483E51153558100D16191620C08EBDC0\r
+ 100013101013101310131816163344161638555656554F4F4F47424F47241910\r
+ 00000000001013131310101010100F00000000000010161C3B5055565D605B56\r
+ 515B6A2919806644B5A397A6443D6465C065C0C067727474727272727274C010\r
+ 00426060551B002007C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5887F0773\r
+ 46414F1F138344322C1E101888979DC01913161916191919202C2C2C33331600\r
+ 1F4247505555565556504F554F47413E38291F1B181310000000000000001013\r
+ 191C1F23314850505B5B565B56565B5C56515D5B161064587EB5A06536646565\r
+ 676767C0C0C0C0C072727274767B530F003B5C685B1B001983C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5807F077146423841100B57838EA3A08D80726565\r
+ 655864646458656553341E161000001931565650504F5555555B56505660605C\r
+ 6A706E68605B5B5A5049484848505A5B68685F5D6A6F605D605C5B5C5C5C5B56\r
+ 5B5655605516000010181B2C5867C07272747474747676767676767465320000\r
+ 1B505C5D5B1C001E8BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C57C7F896F\r
+ 473E383E2310000000194472BF8807078C8C8B887E6735180F0000000F191F38\r
+ 4950555C696A68717371717070716F695D5C55493E3B42473B2F3B3E3E414750\r
+ 5B5C5D5D5D606E6E6E6E70706E6A6A5D606A5C505D5E411B0000000B16192C3D\r
+ 576465656458574433201600000000133E56696A5B1C00198BC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C57C7F076F3B3B413F38291F191300000000000000\r
+ 0000000000000000001019233B485D707171706E5C55493E2E231C1813100000\r
+ 000000000000000000000000000000000000000000101316191C233842505C60\r
+ 6C6E6E6E6F6A686D5B3E1B0E0000000000000000000000000000001016233850\r
+ 5B5C606A5B1C0016BFC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5777F076E\r
+ 413E382E23232E2F2E383829291C1C1C1B1B1B1B1C1F2E3E46505D6E705C472E\r
+ 1C1913000000000000000010131616191B1C1C1B1B1B1C1F1C1F2323231F1C1C\r
+ 1C1C1C1C1B181616100B00000000001016181C2E474F5B6E6E6E6C604F3E2E1F\r
+ 1C1C1C1B1C1C23293B48565E5F5C5B50515B5B5D5D1F0016BFC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C57188076A3B4842413823231F1C1C1F1F1C292E38\r
+ 3831383E3E41382E231C1B160F000000001016181B1C1F2329232E38382F3B3E\r
+ 38383B3B424F504849505A5A5B5E5E50484F5050505050504F4F48423E382F29\r
+ 1F1B1613101010161B1F3842505660605E68605E5D5B565B4F423E383B3B4749\r
+ 555B565D5B1C001883C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C57088896E\r
+ 3B3B423B41383B2F2329231C191B18161010101000000B0B0F101616181B2329\r
+ 2E2F2F38383138382F383B3E3B3838383B424950412E1B130B0B0000101E233B\r
+ 4F565047474849484850504F5051515B5D5B565150483B231C19161613101316\r
+ 16161618181B1B1C1F2E3E42555B56565B565B60551F00137BC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C56F88896A494850413E3F383B3B3B3B382F383B2F\r
+ 2E292338292323232E3E3B3838383B3838383838383B3E3E3B42473E38312F48\r
+ 5B421B10000000000B10161616100B000F1B405C5B484241484948484F4F4949\r
+ 484F50554F505B5B5D5B5151554F48484241474950565B5B5D5D5C565B5B565B\r
+ 5B5B565B5B1F001074C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C57089896A\r
+ 3A3E483E38423E3B3E3E383E3838382F2E383E3B3E383B3E3E3B383B3E3E383B\r
+ 383841413B42424147473F3B3B425047190000000B101013161B2C3336445744\r
+ 32160013396A5B474747484F504F4F504F49484F4F4F4F4F4F4F565B5D5D6060\r
+ 60605D5D5C5D5B565B5B55555655555B5B5B5C5D5529000080C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C56F89885B3B4247413B38423B3B3B2F383B383B41\r
+ 424950505C555B5C6A5D473B383B3B3F3E383E4241424241413B3841504F2000\r
+ 000B1000000010131618202C32333D44586457200B195B6A5047485056504F49\r
+ 494F5050494F494F555B695D5B5550505B5D5C69695D565C5B5656555B5B5056\r
+ 55565B5D50230F007BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C56F078960\r
+ 3F3B48423B3B3B3E3E3E3B2F3E484F5B422F2C1810100B00165773693E383B3B\r
+ 3B3B3E414241423F3B3B48603B13000B100000327EC0161033321618202C3239\r
+ 444457655819002C6F5B4248504F49494F51555050504F506970421600000B10\r
+ 16181C3F555D68695C51565C5B555B5B565B555B5B230000C0C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C56F07895B313B3F3B3B383B38383B3B4F503F1C13\r
+ 00000000000000000000195D6A423B3B3E414242413E424241475B2300000F10\r
+ 10001E88BDBD7420807B322C646458443D444453646736001C6A5D4850555049\r
+ 50564F494F48566C501B000019333635321E160B0016385D6A605B5B5B565B5B\r
+ 5B55565B5B230E0072C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C56F078356\r
+ 3B473E383B3B3B2F424F493B180000000B10101010101010131E130053735D42\r
+ 4247474749554F41475B23000010101010001618007BA066747E8B97837B8B64\r
+ 2C5353575758C0530C1F6E514F55565B56505050505B6E491000163964646567\r
+ 67C0C065441900102E5D6E605B555B5B5B55505B5B23100074C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5700783483B4641422F382F42553E1800000C0010\r
+ 100000101010131610102C20104073503E4749483E4850425647180B10101010\r
+ 16101020C0AE883D76748CB5C044076420535357585865723400295D505B5050\r
+ 5C565050566E4800000E203D5357585858646567C07264200010386E6F5B515B\r
+ 5B5D5C5B5B2E100066C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C571898350\r
+ 3B3E3B3B382F48481C100010131000101016160D000F00000F10102C2C103870\r
+ 5548593F1B1B38425D2F2C33160F131316100F74BD071919C072070774768B57\r
+ 20445357585864C0530C1B5B5C56231B475B5050684700001366743D36535758\r
+ 58575758585864726519001B5D715B50505655565B2E0F0057C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C50773897F512F3B38382F484816000C1310000E7B20\r
+ 10C08B44332020331E13101032320C406A473B7071201C426E23206720001316\r
+ 16160058BD0732194466BF3616C08844204444575864657236001B50565C5C2C\r
+ 1B495F604710001680AEA68B575767646567676765C07465C0724400105D7150\r
+ 565B505B5B29100064C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58C71078350\r
+ 3B3B3831483E1300101310161867BD672083BD8B8C58C08E7216101310362C16\r
+ 425B4271713B3B4F60471866C016000F1618002007BD831E192C2018101B3332\r
+ 32363D445364C0C01E001F4F506071402356605518000033B58E76B5BF728876\r
+ BF07887E8888077657C074641000446D5C5B565B5D2F100058C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C571077F483E3E2F473E100B101316004497A0BD74\r
+ 74BF88888E7680AB7B180F16101953181C564F474755564F49601C187480642C\r
+ 19181610001618130D0E00161E16131E3233365364C0743600133E5C5B564F48\r
+ 565B602E00000032ABA58BA674BF978B07978C88970788075367677265130038\r
+ 5D5B505B5C2F100035C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58B73077C46\r
+ 2F3B3E48100B161616190036A6BFB544748C97888DAE8B8B67161016160D3D32\r
+ 18384741565C494842564F1618C07E74726553331B101018181818191E202C33\r
+ 3D57575864572C000E1C4F5655565D5D5555561F2C20001680BDA0654488A38E\r
+ 8E078E9788078E7E57C0676772641300385D5B565138100036C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C50771077C4838384F1B1E191316191E1E007407BD58\r
+ 1672835707072072C01910160F16531E132F4948495055554F47504216001019\r
+ 2C323533322C20201E191E1E1E20202020201E16100000101C3B4F4F50565550\r
+ 4F565A1C53720D0032A0AE532CC074747472747E6774BF6567C0C067C072570F\r
+ 1350515B5B3810004498C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58B73077C3E\r
+ 3B385A0D537E1600001319131097BD7618161616531B00323218161620533610\r
+ 1831474948555C504F4842483E1F19130000000000000B0B0B0B00000B000000\r
+ 0000000010161C2E42505050555550504F50602E10C07E201066A68834445357\r
+ 5864646467656467C0C0C0C0C074C010002F505D512F100032C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5837C07773B3B2F471B137276BF7667534416538B3D\r
+ 1613161613182019202C2C2C321E100D1F3E474848494F494F49424242474841\r
+ 38291F1C1B191916161616161616191B1C1F232E3B4248484748495551555650\r
+ 4F505B561B0C35362C2C4464586567676767C0C0C0C0C0727274767B7B743500\r
+ 0B38505B5B381300208CC5C5C5C5C5C50000C5C5C5C5C5C5C5C5C58B7707773B\r
+ 2F382E3B1000326474838B070788838883808076726657352C1E18100000101C\r
+ 3B4748485050494F555B5B5B5D606060605E5E5E5B5B5050504F484F4F505B5B\r
+ 5D686E6E6E6F6E696A605C5D5C56504F50554F56551F00000B13161E39576772\r
+ 7474767676767B7674726653321800001B47565B5B31130032C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5807C8C7C313B382F38231000000B16192035535766\r
+ 676666573320181000000000131B2E424F505D6F6A6E6E6060605B5048414242\r
+ 3E382E2E29231F1F23231F23232323292E38383E414749505B5C606E6E6E6C6C\r
+ 6A5D56555B56421F16000000001018202C3233343332201E1610000000000F1C\r
+ 414F5B565B3E160032C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C57F7C07772F\r
+ 3B42382E382F231F1B130E00000000000000000000000010161B233E4F5B6060\r
+ 5B4F473F2E291F191613100C00000B00000000000000000000000000000B0B00\r
+ 0000000000000B0F0F1016191C232E3B47505E68686E6E685B47291B13000000\r
+ 0000000000000000000F161F2E3B47504F5056495B4216001E07C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5837F07732F3841382E1F23232329292F2929231F1F\r
+ 2329232E2E38383E3E484F483E2E1F1913100B000B0B0B0F10131316191B1B1C\r
+ 1C1F1F1C1C23232E382F2E2F2F241F1F232E291F1F1F1C1B1B19161310100F00\r
+ 000F13181B233E505D685E5E605B4F4242423B3B3E3E48505050565649414148\r
+ 484F50515C4116001E07C5C5C5C5C5C50000C5C5C5C5C5C5C5C5987C7F07713E\r
+ 4149382F2329231C1C1B1B161B1B1B1B1C1F1C1C1F1B1B19161613100B101010\r
+ 1316191C232323292F2E383B382F383B382E2F414F50473E3E3E382F495C5B51\r
+ 4F413B3B4748474847474747423E3B2F2F291C1B1613100F1013191F2E2E383B\r
+ 3F47413E3B382F2E2E291F232E3B474F565051565B3B130020C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5737F8C71313B383E472F2E382E2323231F1C1C1918\r
+ 161613101313131316181B1B1F292E2E382F2E2F38383B2F2F3838383B3B382F\r
+ 3B50503E1F1610100B0000000F10161F47565B48463E474747494F4847484949\r
+ 504F4F4F484241382E231F19181616161816161B1B1C2329383E414850504F50\r
+ 4F505556504118001E07C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5777F076F3E\r
+ 423B2F38382F3E3B2E312E38382E382E232E2E2323231F232F2E2E2E292F3B38\r
+ 2E2F382F383B383E3B382F2F382F425B4F1F1300000B0B0B1013161919191813\r
+ 0B0B1B5569473B414741424848494848494847484850555050504F484F504F48\r
+ 474851565550505050565055555050504F4F5050564216001883C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C57188897031383B3B382E2F383B3B382F29232F312E\r
+ 29232E3B474949492F2423232E2F38382E383B3B3B383B3B3E3B382F3E50471B\r
+ 0000000000000010181E202C333644445336190B1E5D5B3E4147484848484748\r
+ 494848484848494F4947485B686E6E685B5651554F4F55554F4F504F50504F4F\r
+ 4F4F56565B411300198BC5C5C5C5C5C50000C5C5C5C5C5C5C5C5C570838C713B\r
+ 41383B2F382F3B3E3E38312329293B3E495B5B4940404044717147292F383B38\r
+ 38383838383B3B41473E3842562310000B001320333635191010161E1E2C3644\r
+ 364458531910396A463E49494947484847474748484848424960705B42383B3B\r
+ 49606068605655554F4F504F4F504F4F504F48485B3E16001907C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5708807603E423E383B3838382E2E2E2E2E38424738\r
+ 1F1610000000000000206F6A3B2E2E383E3B383E383B3E41413B4F551C00000B\r
+ 10001074BDBDAB531366643D66C0333472C0535365360B20705A3A424949484F\r
+ 4F4F504F4847474F6E5D1C0000000B000000101B385D605B554955554F4F5050\r
+ 504F504F504116001683C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56983896942\r
+ 38424138292F382E2F2F3848381B0E00000B0B0F1010100F130F005769382E2F\r
+ 383E4147423E3B3E38505619000B10101010002CA08E1919838E978E978DBF83\r
+ 9783573D576557161E6F5B3E4847484F50504F4F4947506E3F00001636575757\r
+ 584433190B001949605B55554F4F494F4F504F50503E160013BFC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56F8989552F3E3E382F382E29233147381600000B10\r
+ 101010100F10100B101B20003260472F3B38383B4142412F46561B000B101010\r
+ 1016100044BDC02C80587E9474578B97571B3D585757656416165648474F4F4F\r
+ 4F4948494750682E000019445753575858646567654418001047685C56504F4F\r
+ 505050504F3B1900188BC5C5C5C5C5C50000C5C5C5C5C5C5C5C5986E88895031\r
+ 2F3838383B38294148190B000000001000000000000000000F0B1B33132C553B\r
+ 2F383E47423E413E5B381816100C1010130F191E0D76A54466AE9788A0A0747B\r
+ A607583D585758C036001F56484F555148494F4750602300001936333D535357\r
+ 575757585865675718001B6060504F5556555055564116001683C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56A89885F38292E38292929472F130010003D7E2000\r
+ 13363533353D351300100B1E3D161C56473B3E3E3B4148475B1F325716001013\r
+ 160033A68C83A657001619748835102065C05353585864C03D0B194F494F4F50\r
+ 494848506029001058A6AE80363657585757585758586465C03D000B4A68554F\r
+ 56514F4756421B00107BC5C5C5C5C5C50000C5C5C5C5C5C5C5C5986F89835631\r
+ 3E382F2E38502310001010007EBD2C137B8BA6BF8D8C8C7E1900100F2C3D132C\r
+ 554741413E474F3B561F20C032000F1016100065BDBD88190F16162C2C182032\r
+ 2C3244575858656720001B474F4F48495049505D3800001897AB8BB2BF578E8C\r
+ 83BF07747E8044646467641600396A5048494F4950411800107EC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56F8988483B3838292F501E0010100F100074B519C0\r
+ 660066207220007B53001010103632162E473B3E4241473E4F41135774190010\r
+ 131613002033101016181816161E202C333644535764C0571010234848474F49\r
+ 49495D49100016201E187EA680BF8B7BA68D8B7E8B8B36656464C0671E002C60\r
+ 50494F50504219001683C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56F8988483E\r
+ 382E29481B0010101013130074B520207EC08B20667B80BF2000101310164019\r
+ 162F41413E424942415E1F00588B743D2C1919180F00101616131316191E1E20\r
+ 2C333D5364676419001641514F4849494F50561F0013161E1357B5A0447E8E8B\r
+ 97079D8E8E97576465656567C02C002C5F4F5050554219000F76C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5986E897F48382F293B230E1010131616160076BD3500\r
+ 327B350B005372190010101310103D201329423E4148423E414F551B001E66C0\r
+ 7274643D3632201E191818191E202C32333D443632190F00102F47474F50504F\r
+ 484F481C5353001672747BAE7B2C83A08B6780728DA064646767656567C03200\r
+ 1C48505055471B000072C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56E897C462E\r
+ 382F480E3632100010160033A6BD3500000000100B0000001010100B00204416\r
+ 152F3B3E47474747423847481B0000000B1319202C2020201B19191819191818\r
+ 181000000000001629484948484F4F49484F501B35762C10BFBDB59D672C34C0\r
+ 7E3D4457748867666767676767C0C010003B4F5055491B000080C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C560887F412E2E234200587B321E191900448C801800\r
+ 00000B00000B0B1010101316205320001B3B474242474849423E3B4142381F1B\r
+ 1300000000000000000000000000000000001016191F2E3E474848554F474849\r
+ 484F5B2E003D7E3218C083583464585353676567585767C067C0C07274746510\r
+ 00234850483E180000BFC5C5C5C5C5C50000C5C5C5C5C5C5C5C5985F897C3E2F\r
+ 2E29381B005772747472C053201920201E1918181818161618181E2C20130016\r
+ 2338414141424742474F48424749484F48473E382E231F1C1C1C1C1C1B1C232E\r
+ 2F383E4948494F484847484847474747484850551C0010322000002044586567\r
+ 67C0C0C07272727272747272C0571600102F495050421B0F0072C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C56A897C41382F2F23381300163264C0747E8083807B\r
+ 76746764533320191816100000001623414742494F4F565D5C696A606E6E6060\r
+ 605C5B5B5B51565B5950504F505B5B5B5B5B5D6060605C505B5C555050504F48\r
+ 474742485029100000101016192C3653646566656565645844362C1913000000\r
+ 1F48504F50411C0F0072C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C56E077C4F38\r
+ 382F232E2E1B00000000000010182C333535322016100000000000161C38485B\r
+ 695D5D5D5C5B5C5D55473F3B3B3829231C1C1B1B1B1B1B19191B19181B1C1B1C\r
+ 1C1C1F232E2E2E3B4247474F5B5B5B5B5B5B51565C5B50381B16000000000000\r
+ 10131616131000000000000000131B2342494F504F411B0F007BC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C569897C412E292E2E23232E29231C1C1916100D0000\r
+ 0000000D1010161B1F29384850565555482F231F1C1B16161000000000000000\r
+ 000000000B0F0F10100B0B100F0F0B0B0B0000000000000B0F0F1016181B1C23\r
+ 2E3842505B565C605E503E231C1B160E0000000000101316191C232E3F484748\r
+ 4847484F50471C100072C5C5C5C5C5C50000C5C5C5C5C5C5C5C58C7089773E38\r
+ 382E2E231F1F1F1F1F292E23232E2E292E292E2F2F38383B3B38382E1F191610\r
+ 1000000B0B0F101316181B1B1C1C1F232323232E2E2E2F382F2E2F2F2F383838\r
+ 2E2E2E292323231C1C1B1916161010100F101616181B1C293E485051565B5047\r
+ 4747474242484747474742423E3E38384747484849471B0F0066C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5077089773E38382F382F29231C1C1C1C1C1B191B1C1C\r
+ 1B1B1918191B19181616100F0F101316191C1F1F23292F2F2E2F383B382F2F3B\r
+ 382F313E3E3B38383E3E3B3E3E3B3E3E3E3E42423E3E4242414147413E413E38\r
+ 2E291F1C1B181616161618191B1C1F232323232323231F23231F23292E38423E\r
+ 4248484848471B0B0066C5C5C5C5C5C50000C5C5C5C5C5C5C5C58C7189773B2E\r
+ 382E2F382E232E292E231F1F1C1B1B1816161618161616161919161B1C23231F\r
+ 292E2E383B2E2F3838382F2E2E2E2F2F2F382F383B382F38383B3B383B3B3838\r
+ 3B3E413E3B3B3B41413E424742424848474742474847413B2923231F1C1B1B1C\r
+ 1B1B1C1C1F1F232E383E4242494F48474849474249471B100067C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5077107732F2E2F2E29382E2E2E292F38232E2E232329\r
+ 1F1F23231C1C1F232E383B38383B3B38383B2F2323292E2F2F38382F2E38382F\r
+ 383E3B382F2F383E3E3B3B383B3E3E3F3E3B3E3E3E3E3F3E3E3E413E41413E3B\r
+ 41484F505B5B5B5D5D5D5D5B5656504742474847484F4F484949484749484747\r
+ 4847474850421C100064C5C5C5C5C5C50000C5C5C5C5C5C5C5C58B7107732A2E\r
+ 2F382E292E38382E38382E2E2F2F23231F23293B474947493F3F493F3B3F4449\r
+ 4A4A697047292E2E2E382E2F2F292F3B3E3838383838383B3B3B3E3B3B3B3E3E\r
+ 3E3E3E3E413E3E3E3B3B3E3E3E3B425B5D5149473E3B3F3E3E3F424F5B60605D\r
+ 5D514F4F4848494746414247474748494747474750471C100057C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5887389732F2338382F2E2E2E382F2923232E2323232F\r
+ 3E3B312E231E19181613131310131313131016326F5629292E2E2F38383B3B38\r
+ 383B3B383838382F313B3B3B3F3B3B3E3E3B3E3E3E3E3B3B413E3E3B3B425B47\r
+ 1B13100F00000F0F0F0F10101616191C2E3F566A5B4647484747424747484748\r
+ 484747484F481C0F0036C5C5C5C5C5C50000C5C5C5C5C5C5C5C58B7789702E1F\r
+ 2E2E2E292F292E2E2F29232323383B2F1C1610100B0000000000000000000000\r
+ 000B1616193F482F2E2E38383838382F2F382F2E3838383B383838383E3E3B3B\r
+ 3E3E3E3B3B3E3E3E3E3E38383E503800001019202C2C2C32323232322C2C2019\r
+ 1613131C485D5D48414648474748484747484847484F1F100044C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5887789702E23232E3838292E2E2923231F3848231610\r
+ 000B0B0B0B0B0F1010100B000010101316162044201938382E2F383B38383838\r
+ 38383838383B3B2F2F38383B3E3E3B3B3B3E3E3E3B3E423E3B3B3B3848421600\r
+ 1018203236443D444444534453535344443D32180F162F60603E3E4948484242\r
+ 424846414F481C10005398C5C5C5C5C50000C5C5C5C5C5C5C5C5837789713B2E\r
+ 232E29382E2929231F3E421F160B0B0B0F10101010101010100B002606171013\r
+ 161919443D181F2F292E38383B3E38383B3B3838383838383B3E3B3B3B3E3E3E\r
+ 3B3B3E3E3B3B3E3E3B3B383E4F2E201E001018203238363D4444445353535357\r
+ 53575757442C10104770503E424142424747474747481C13003DC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5BF77896E2923232E232E2E2E1F1F483B16000B0B1010\r
+ 10101010101010100B0006AAAA61151018191E58361319292F2E2E2E383B3B38\r
+ 3838382F2F2F2F2F383E3B3838383B3B383B3B3E3E3E3E3B4241383B481F2C66\r
+ 1E001618203233363D445757534E4E4E44535353535857200019696A41494842\r
+ 4247484848471C100033C5C5C5C5C5C50000C5C5C5C5C5C5C5C5837C89692A23\r
+ 2E232E2E241F1F422310000C1010101010101010101010100B0052AAB9611713\r
+ 191936651E001B292E383838382F2E38382F383838382F38383838383E423E3E\r
+ 3E3B3B3E3E3E3E3B3E413B3B4923106458000F16192C32302B4C4E5358668766\r
+ 57474E4C4E4E5864571600566847483E4148484147471F1000208CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5807C885D29232E2E232329233E2F10000F1010101010\r
+ 0C10100B101010100B0052B9AA271019192C64330013232E2E2E2F2F38383838\r
+ 3B382E38383838383E3B38383B3E3B3B3E413E3B3E3B3E3E38383E3E41471B13\r
+ 6432001016191C879087874E66909090874E878787874E586565200038464147\r
+ 46413E4748422310003598C5C5C5C5C50000C5C5C5C5C5C5C5C5BF77895D2323\r
+ 38232E2E231C41101916100F10101010100B0000000B0B002761B9AA2B001619\r
+ 1E574413101C2E2F2F2E292E2F38383838383838383B38383B38383E3B38383B\r
+ 3E3E3B3B3B3E3B3E3E3B3B3B3E483E1016723200101519879090904E4C878787\r
+ 4E4E90909090585758675800103B47414242414947471F10003398C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C598777C895D2E2E29232E232E233F00C035100B10101010\r
+ 002761AA61102761B9B961170B1619163D5818001B2E2E232E2E2E38382E2E38\r
+ 3838382F2E2F2F292E3838383E3E3B3E3E3B3E3E3E3B3E3E3E3E413E3E3B482F\r
+ 00207B33000E1890909090878766666687879090909058576467640C002E4241\r
+ 4248484847471F130032C5C5C5C5C5C50000C5C5C5C5C5C5C5C57C7F88692F29\r
+ 231F2E29231C3B0E32BF1900101010100052B9B9AAAAB9B9AA4C0E0B16181636\r
+ 58190019232E29292E2E382F2E2E3838382E292E38382E2E2F383838383E3838\r
+ 3B3B3B3E3E3E3B3E3E3B3B3E3B3E3E4F290033883D0000208790909090909090\r
+ 909090908766575865C03600133841414742474147482313002CC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C57C7C885C2E292E2E232E291F291C0072761600101010\r
+ 00177DB9B9AA614D100B131616163658180018232E2E383829232E2E2E2E3838\r
+ 2F2E2F2F2F2E2E2E313838383B3B3838383B383B3B3B383B3E3E3E3E3E3E413E\r
+ 4723002C076700001720668787879087878787644E4F5865C0580000183E4742\r
+ 3E42413B46482313002007C5C5C5C5C50000C5C5C5C5C5C5C5C5737F885D2F23\r
+ 2329232E2E23232F150067C0160010131000274C170E000B1016161016444416\r
+ 00192E2E2929232E2E2E2E2E2E2E2E2E292E2E2E2F29232E2E2E2E38382E383B\r
+ 382F3B3B3B3B3B3B3B3B383B3E3E3F3E414F23001888801600191D272B4E4E4E\r
+ 4E4D4E57585864C0580C00132E473B4141423B3E48421F10002C98C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5707F89562E232E2E29232323231F29130035581E0B00\r
+ 131610000B10131616101332582C0B101B1F23382E23292F2E2E2E2323292E2E\r
+ 2E2E2E2F383B3E3B3F413B3E3E4142413B3B3B3B3E383E3E2F383B3B3E3B3E42\r
+ 3E3E482F001067074410182C35445357575858585865C05300001023463E3E3E\r
+ 3E3E3B42493E1F160020C5C5C5C5C5C50000C5C5C5C5C5C5C5C5717C8355382E\r
+ 23232F2E2329231F232313001867C01E0F1010131616161616203D361600131C\r
+ 2E29232323292E2E2929292E3E3E3B3B3E3B382929231C1C1F1F1F1F1F232E23\r
+ 2E3E4241474F423E3E3E3E3E3E3E3B3B3E3E414841190016747432182C364457\r
+ 57585864676734000010234847423E423E3E4241474723160020C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C56F7F7F5C29232E382E382F2329232323231800004483\r
+ 74533220191E20202C201300001B2323232329292E2E2F3B42423E291C1C1B19\r
+ 16181E203235363D44444436333232321E161316191B1C233842424248484141\r
+ 3E3E3E3E414F381000103334202C3657646567675316000013294842423E3E3E\r
+ 47413E3E41412316001E07C5C5C5C5C50000C5C5C5C5C5C5C5C56F8883552323\r
+ 2E2E292F2E2E3829292323291C100000538880582C19160F00001019232E2923\r
+ 292E3B3B383F291816130019576774BF88078D8E8E8D07078C8D8D07078C8C8C\r
+ 8C07888074654432160013191B294248555549423E414847291300001013161E\r
+ 3244361600000B1B3B483E3E3E3B3E3B3E41414747421F1600188BC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5986E7F834F23231F292F2F2E312F232929292923231B10\r
+ 0000000000000010161B2329292F3E3E3B3B231B16162C36190044A0A097938D\r
+ 8D8D8C07078B8B88838883888B8B8B8B07078B078C8D8D8E8B3D00102C181016\r
+ 1C38474F565048474F4F381C16000000000000000F1B2947463E3B41413B4241\r
+ 3B3B424241472316001883C5C5C5C5C50000C5C5C5C5C5C5C5C56A887F47292E\r
+ 2F2E38312E232E292E2E29232923231F1B16161616191C23232E2E313B3B3B2E\r
+ 1B192C577280889D64198BBD8E078C8C0707078B8B8888888388888383838388\r
+ 8B88888B0707078EA38018388E8C83C032161016294755504948464841382E1F\r
+ 1B19181B2E41423E3B3B3E3E3F413E413E41424747422316001E8CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C569887F412323292E2E2E2F2E2E2E29232E292E292323\r
+ 2929292E23292E232E3B3B2A1F1B2C4472838B078B8B838E76368BB5978C8D8C\r
+ 8C8C078B078B8B8B07078B078B888888888B8B8B07078C8EA083205397979DA0\r
+ 9D8D80642016161F47564841414748474747423E413F3E3B3E3E3E3B3E423E38\r
+ 3B3E414241462916001EC5C5C5C5C5C50000C5C5C5C5C5C5C5C55D887F412923\r
+ 23232F382E292E2E2E232E2F2E2E292E23292E2923232E3B2F231C20577B8B07\r
+ 078B8B888388838C83357EB5A08E8E8E8C8C8C8C8C07078E076744768D8C8B8B\r
+ 07070707078C8D97A07616679D8D8D8D8E97A0A097886720161C3F504F3E3B3E\r
+ 42473F3B3E3B3E3E383E42413E3E3E3E3E3E413E42472316001907C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C55D887F3E232E2323383B382E2E2E292E2F382E2E2329\r
+ 2E292E231F3846231B35748B8C8C8B8888888888888B888C073267BDA5979797\r
+ 978E8E8E8E8EA38C32000013C0A3978D8D8E8E8E8E8E8E97A0C0137BA08E8E8E\r
+ 8E8E8E8E97A0A097805719193B55483F424242413E3B3B413E3E3E3E3E413E3E\r
+ 3E423E3E413B2E1600198BC5C5C5C5C50000C5C5C5C5C5C5C5C569887F3F2323\r
+ 232929382E3831292F292E2E2E2323292F2E23233E2F172C748C8E8C8B88888B\r
+ 8B8B88888B8B88079D3344B5AD9D9D9D9D97979D97A6A053002044131E8BAEA0\r
+ 97979797979797A0A0581688A08E8E8E8E8E8E8E8E8E8E97A5A08853161F5648\r
+ 3B3E3E3F413F3E3E3E413E3E3E47413E3B3B3E3E3E3E2918001683C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5A069837F4223232323292E2E2E292E2E292E2E2E2E2E23\r
+ 23292347232C748E8E078B8B8B8B8B8B8B8B8B8B8B8B8B8BA05336A6B5A0A0A0\r
+ A0A0A0A0A0B5BF19C0AEB5882C65ADA8A0A0A0A0A0A09DA69739198EA08E8E97\r
+ 979797979797978E9797A0A0BF2C1C505046413B3B3E41413B3B383E4747413E\r
+ 3B3E413E414723160013BFC5C5C5C5C50000C5C5C5C5C5C5C5985D887F42232E\r
+ 2E232E2E2923292E2E2E2F2F232929291F1F481F0058A9BDA68D8B8B07078B8B\r
+ 8B078B8B8B8B8B8BA3663397BDA6A0A0A5A6A6A5A6A68B8BB4B5B4B58E839DAE\r
+ A5A6A2A0A0A0A0AE072033A09D9797979797979797979797978E97A9BD07100E\r
+ 474F41413B3E42413B3B3B413E3E3F3B3B3B3E3B3B462F1600137EC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C560887C3E1F29292929232F29312F2E2E2E2E29232E23\r
+ 1F501D1966767BBF8CA8A68E8B8B07070707078B0707078BA07B3288BDA6A0A6\r
+ A6A6A6A6A8A6AEB5AEABA6ADB0A8A5A6A6A6A6A5A6A5A6B5831B66A697979797\r
+ 97979797979D9D979DA6AE9788723D19131F50413B3E413E3B3B3E3B3B3B3B3E\r
+ 3E3B3B3B3B463816001688C5C5C5C5C50000C5C5C5C5C5C5C5C56E837F472323\r
+ 29292323292E2929292923292929231C501D1080B5A60776657207A9A08C0707\r
+ 070707070707078B97073272BDADA0A6A6A6A6A8ADAEAEAEAEAEAEAEAEAEAEA6\r
+ A6A6A6A6A6A6ADB5741B80A5979797979D9D9D9D9D9D9DA6AE9DBF6558748C8C\r
+ 64001F4F413E3E3B3B3E3E3B3B3B3B3E3B3E383B3E462F1600188BC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C59860887C41292323292323292F29292323292E23231F4F\r
+ 2F00BFB5A8A6A6A68D7B647297AE9707078C070707078C078DA03357BDAEA0A2\r
+ A6A6A6A6A8AEAEADADADAEAEAEADADA8A6A6A6A6A6A6AEA6642C8DA097979D9D\r
+ 9D9D9D9D9DA0B2A0806767808E9D9D9D8D5700294F413E3E3B3E3B3E3B3B3B3B\r
+ 3E3B383B41412F18001683C5C5C5C5C50000C5C5C5C5C5C5C5C55B887C2F232E\r
+ 232929232929292E23232929291C3B4B007BBDAEA6A09DA0A0A08C7257BFA9A6\r
+ 8C078C8C8C8C8C8C8CAD663DA0B5A0A0A5A5A6A6A6A6A6A6A6A6A6A6A8ADADA6\r
+ A6A6A6A5A2A6B1973657A09D979D9DA0A0A0A0A0ADAE07C0C08397A0978E8D8D\r
+ 978B320038413E3B3B3B3B3B3B3E3E3B3B3E3E3B3E472F16001680C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5076D887C3B232E232323232E232323292F292323235E13\r
+ 53A6B5A6A0A0A09D978E979783586797AB8E078C8C8C8C8C07A6803280BDA29D\r
+ A0A0A3A2A3A0A2A5A5A5A6A2A0A5A6A6A3A0A0A0A0A5B4882C7BA6979DA0A0A0\r
+ A09DA0B0A27E67BF8C978E8E8D8C8D8E8E8E8019103E3E3E3B3B3B3B3B3B3E3E\r
+ 3B3B3E3B3E41291800107EC5C5C5C5C50000C5C5C5C5C5C5C58B6E887C3B232E\r
+ 2923232E2E2E2929232E2F291C501F008CBDADA6A0A0A3A0978E8D8C8E076744\r
+ 8BAE978C8C8D8D8D8C9D972C58BDA697A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A09DA0A0A6AE722C07A59DA0A0A0A0A0A2B48EC0748B8C8C8C8C8C8D8C8D8D\r
+ 8D8E8DC0001C3E3B3B3B3B3B3B3B383B38383B3E3E3B2F18001074C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C58C59887C3B232E292929232929292E2E29291F235B0D74\r
+ B5AEA6A6A6A5A2A09D978E8E8C0707763DBFA6978C8D8D8D8C8EAB3D32AEB09D\r
+ 9D9D9D9D9D9D9797979797979D9D97979D9D97979DAEA04444A0A09DA0A0A0A0\r
+ A5B58C67BF8D8C07078C8E8E8E8D8D8D8D8D8E883800383B3E3B3B3E383B3831\r
+ 3B3B3B3B3B412F16000072C5C5C5C5C50000C5C5C5C5C5C5C5075F89773E2923\r
+ 2323292323232E29292E291D5D151897BDA8A6A6A6A6A2A0A0A1978E8C8C8C8E\r
+ BF3DBFA6978D8D8D8D8CA6741E83BDA0979D9797978E8E8E8E8E8E8E8E8E8E8E\r
+ 97979797A0B5881E74AB9DA0A0A0A0A6B5076688978C078D8E8E9797978E8E8E\r
+ 8E8E8E8C761317413B3B3B3B383E3E383B3B3B3B3B412E180B00C0C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C58B6A83733B292E232923232323232E29231F2E5B00BFBD\r
+ AEA8A6A6A6A6A2A7A7A09F97978E8D8DA08344BFA6978D8D8D8CA0972C44BDA6\r
+ 979797978E8D8E8E8D078C8C8E978D8D8E8E9797A6AE67208EA59DA0A0A0A0AE\r
+ 8BC007A08E8D8E8E9797A0A09FA097978E8E8E8E8B4400313E3B3B383B3B3B3B\r
+ 3B3E383E41412F160000C0C5C5C5C5C50000C5C5C5C5C5C5C5806A88732E1F29\r
+ 23232923232329292E231B5B1520A0B5ABADA6A6A6A6BEA47F636197A097978E\r
+ 97AB805788A08E8D8D8D8EB457198EB59D8E8E8E8E8C88078E8C8C978D888B8E\r
+ 8D8E97A0B08C2C53A6A09DA0A0A0AE8C7207A88E8E97979D9DA09D897F94A197\r
+ 8E978E8E8D7416173E3B383B2F3B3B2F3B3B3B383B472F16000E74C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C58B6088732F23232929232E2E292929231F2E5B0083BDB4\r
+ A9ADA6A6AEBEA1616363628EA6A09D9D9DA0AE76728C978E8E8D8CA6881866BD\r
+ A697978D8E97661974A0A08832448D978D9797A5B4721888A69DA0A0A0A69D74\r
+ 88B59D9D9DA0A0A0A0A6896363618B9FA097978E8E8B53002F3E3B3B3B38382F\r
+ 3B2F3B3B3B3B2F19000E74C5C5C5C5C50000C5C5C5C5C5C5C58B6F8877232323\r
+ 2E382E2E2323292E231C5B151EA0BDAEA8ADA8AEBE976263636389A7A6A0A0A0\r
+ A0A0B58EC0BF978E8D8E8C97A8442CA6B59D97978EA0881E00323D13187EA08E\r
+ 9797A0B58E2C36A5A09DA0A0A5AE88C0A6B59DA0A0A0A0A0A0A68D626362627F\r
+ 9FA08E97978C7416173B3B3B31383B3E3B3B3B383E462F18000E74C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5886F88772F23232329292A292929231F235E0DBFB5B5AE\r
+ A6A6AEBE8D62636361A0AFABA6A2A0A0A5A2B5A067748E8E8D8D8D8DA68316C0\r
+ BDA6979D979DA5720000000057A09D979797A6B5721380A69D9DA0A0A5A67E67\r
+ B5B5A0A2A2A5A2A5A2A6A797616362627F9FA08E97978832002E3E3B2F3B3838\r
+ 3B3B3E3B3B3E3816000D72C5C5C5C5C50000C5C5C5C5C5C5C5BF6E88772A2E23\r
+ 292929231F2929231C501F0F97BDAEADA8AFBE896363628DBEB5A9A6A6A6A6A6\r
+ A6A6BD8C5876978E8E8E8D8C97AE441E97BDA3A0A097A0A574161066A2A09797\r
+ 9DA2B58D2036A2A09DA0A0A0A5AE7E32AEBDA2A6A6A6A6A6A6A5A6AC9F7F6263\r
+ 627C9FA097978EC0001B3E3B2F3B3B313B383B38383E2F180B0072C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5837088732923292323232E29292923235E0D74B5B5ADA8\r
+ B5B57F63637FAEBEAEAEAEADADA6A6A6A6B5BD393207978E8E8E8E8D8CA38C19\r
+ 44BDB5A5A0A0A0A3A6A0A0ABA3A0A0A0A0AEB0641607A6A0A0A0A0A0A0AE8C19\r
+ 58BDB5A5A5A6A6A6A6A6A6A6A6A48E7763637C98A69797832C0D3B31313B2F3B\r
+ 382F3B3B3B413119000072C5C5C5C5C50000C5C5C5C5C5C5C5886A8973292323\r
+ 232E2E292323291C422A008EBDAEA8BEAF626361A6BEB5AEAEAEAEAEAEADA8B5\r
+ BDB535107BA08E8E8E8E8E8E8E8EAEC0107EBDB5A6A5A5A3A2A6A6A0A2A0A0A2\r
+ AEBD7B00C0A69D9DA0A0A0A0A0A6AE7B0044BDBDB5A6A6A6A8A8A6A6A6A6ACA4\r
+ 8C61636198A69D8EC000293B3B3B3B3B3B3B3B3B3B3E2F18000072C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5807183702E1F2929232F2E2329231F5D1057AEB5A8B5A1\r
+ 62628DBEB5AEAEAEAEAEAEAEAEB5BDBDBF161680A08E8D8E8E8E8E8E8E8D9DAB\r
+ 53198DBDB4A6A8A6A6A5A6A6A6A6A6AEBD881020A0A29DA0A0A0A0A0A0A0A6AE\r
+ 74001688BDBDB4A6A6ADADA6A6A6A6A6AFA488626207A19D831615383E2F383E\r
+ 3B2F38383B3E38180B00C0C5C5C5C5C50000C5C5C5C5C5C5987C7388732E1F23\r
+ 2323292E2F2E2338590088BDB0ADBE7F7FA4BEAEA8AEAEAEAEAEAEB5BDBD8B1E\r
+ 00448EA0978E8E8E8E8E8E8E8E8E8EA69D322CA0BDB5A8A6A6A6A6A6A6A6AEBD\r
+ 8E1B198CA69DA0A0A0A0A0A0A0A0A0A6B58C2000188CBDBDAEA8A6A6A6A6A6A5\r
+ A2A6A7987C6E8CA18C36002F3B38382F2F2F3B3B3E413B190000C0C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5767188712E1F23292E232929291F471F1697BDAEA8AEAF\r
+ B5AEADA9ADADAEAEB5BDBDBD8B1E003D8CA59D8E8E8E8E8E8E8E8E8E8E8E8E8E\r
+ A6071E2097BDB5ADA6A6A6A6A6B4BD8E1E198BA69D9DA0A0A0A0A0A0A0A0A0A0\r
+ A3B5AEBF1600168CBDBDB5AEA6A6A6A6A2A0A3A6A6948EA09772001F3B3B2F2F\r
+ 38313B3B3B3B3818000067C5C5C5C5C50000C5C5C5C5C5C5C57F7188712E2323\r
+ 292329292923295B0072B5B5ACA6A6AEAEA9ADADAEB5BDBDBDA6C01600448CA6\r
+ A08E8E8E8E8E8E8E8E8E8E8E8E8E8E8E8EA68D3210BFBDBDBDB5B0B5BDBD7E00\r
+ 1E07AD9D97A0A0A0A0A0A0A0A0A0A0A0A0A0A6B5AE8019001067A2BDB5AEADA6\r
+ A6A5A5A3A2A6A2A0A088191538383B383B3B383B41413119000067C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5987E7788712E232323292923291F2F480080BDB4A8A9ADAE\r
+ B0B4B5BDBDBDA67E190016678EA6A08E8E8E8E8E8E97978E8E8E8E8E8E979797\r
+ 8E8EA5A057002088B1BDB5A98320002C9DA69D9DA0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A6B5ADBF1900001983A6B5B5B5AEAEADA6A5A0A0A28D33003B3B4138\r
+ 313B383B3B423B19000066C5C5C5C5C50000C5C5C5C5C5C5C577738970232929\r
+ 29232323291F472F0058AEBDBDBDBDBDBDB5AE8D671800003383A0A5A0978E8E\r
+ 9797978E8E97978E978E8E97978E8E97978E8EA0AD832000000000000019BFA6\r
+ A597979DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A6B5AE8C581000001974\r
+ 8CA6B5B5BDB5AEAEAE8C160038383B2F2F31383E3E41311B000066C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C57177886F29292329232E292F23501B0000C0A8B5A68EBF\r
+ 581600000044839DA6A39D8E8E8E979797979797979797978E97979797979797\r
+ 9797979797A5A28B725757728BA5ADA0979D9DA0A0A0A0A0A0A0A0A0A0A0A0A0\r
+ A0A0A0A0A0A0A0A0A6B5B5A383440000000020657E07A5B4A05700102338383A\r
+ 3B3B2F383B3E38190B0066C5C5C5C5C50000C5C5C5C5C5C5C5737C07702F2323\r
+ 29233838232E4713000000000000000019577E07A0A6A3A09797979797979797\r
+ 979797979797979797979797979797979797979797979DA5A8ADAEADA6A09D97\r
+ 9DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A2A5A5A2A2A2A3A0A0A6AEB5B5A58B\r
+ 7432100000000000000000001F41383B3B3B383B3B3E3B1B0B0064C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5777789712323232E29232E1F461766806766C074808C9D\r
+ A6A6A6A3A09D979797979797979797979797979797979797979797979797979D\r
+ 979797979797979D9D9D9D9D979DA0A0A0A0A0A0A0A0A0A0A0A0A0A0A2A3A3A0\r
+ A5A5A5A5A6A6A5A5A6A6A2A0A2A6AEB5B5AEA08C8374572C1919160C163B3B3B\r
+ 313838383E463B1B0B0064C5C5C5C5C50000C5C5C5C5C5C5C5737C896F232923\r
+ 2F2E232323480D97BDB5AEAEAEAEA6A0A09D9D97979D9D97979D979797979797\r
+ 97979797979797979797979797979797979D9D9D9D9D9D9DA09D9D9D9DA0A0A0\r
+ A0A0A0A0A0A0A0A0A0A0A2A2A5A5A5A5A5A5A6A5A5A6A5A6A6A6A6A6A5A2A2A0\r
+ A6A8AEB5B5B5B5AEA08E076616293E3B3B3B3E383E41381B0B0064C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5707C896F23292E2E2F2F23382A2CA0BDA6A09D9D9D9D9D\r
+ 9D9D9D9D9D9D979D9D97979D979D9D979D979797979797979797979797979DA0\r
+ A0A0A0A5A6A6A6A6A6A6A6A6A6A6A6A5A2A0A0A0A0A0A0A0A0A0A0A2A3A3A5A2\r
+ A2A5A6A5A5A5A6A6A6A6A6A6A5A6A6A6A5A2A2A0A6A6A6A9AEB5B288201F423E\r
+ 3B3B3B3E3B3B2F1B0B0058C5C5C5C5C50000C5C5C5C5C5C5C55D7C076F1F232F\r
+ 2E292923471566AEB5A2A0A09D9D9D9D9DA09D9D9D9D9D9D9D979D97979D9D97\r
+ 979797979797979D9DA0A0A0A5A5A6AEAEAEB0B4B5B5B5B5B5B5B5B5B5B5B5B5\r
+ B1AEAEADA6A6A6A0A0A0A0A0A0A3A5A3A3A5A6A6A5A6A6A6A6A6A6A6A6A6A6A6\r
+ A6A6A6A6A6A6A2A3A0A2A60733153B383B3B383B3E3B311B0B0057C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5697F896929232929232E23471083B5AEA0A0A0A0A09DA0\r
+ A09D9D9D9D9D9D9D9797979797979D9D9D9DA0A0A0A2A6A6AEAEAEB4B5B5B5B5\r
+ B4B2AEAEAEAEAEAEAEAEB0B1B4B5B5B5B5B5B5B5B5B5B5B1AEAEA9A6A6A6A6A6\r
+ A6A5A5A2A2A5A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A6A68E58133E3B\r
+ 3B383B3B3B3E38190B0057C5C5C5C5C50000C5C5C5C5C5C5C56A7F88682A2923\r
+ 2E23291F4615A0BDAEA0A0A0A0A0A0A09D9D9D9D9DA0A0A0A0A0A0A2A5A6A6AD\r
+ AEAEAEB5B5B5B5B5B5B0AEAEA8A6A6A6A6A5A6A6A6A6A6A6A6A6ABA8A8ADADAE\r
+ AEAEAEAEAEB4B5B5B5B5B5B5B5B0AEAEAEAEADA8A6A6A6A6A6A6A6A6A6A6A6A6\r
+ A6A6A6A6A6A6A6A6A6A6A6A074182F3E38383E3E3B3B2F1B100053C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56A7F89692323232E2923293C1BA2BDA6A0A0A0A0A0A0A2\r
+ A5A6A8AEAEAEAEB0B4B5B5B5B5B5B5B5B5B5B4B2AEAEA6A6A6A3A0A0A0A0A5A2\r
+ A0A2A6A6A6A6A6A8A8A8ADADAEAEAEAEAEAEAEADADADABADAEAEAEAEAEAEAEB0\r
+ B0B4B5B5B4B0AEAEAEAEAEAEAEA8A8A6A6A6A6A6A6A6A6A6A6A6A6A080201F3B\r
+ 3E3B383B3E412F19100044C5C5C5C5C50000C5C5C5C5C5C5C56A7F896A232323\r
+ 2E2A233B1F39A6BDA6A0A0A0A0A6AEB5B5BDBDBDBDB5B5B5B5B5B5B4AEAEA9A6\r
+ A6A2A2A0A0A0A0A0A0A0A0A2A6A6A6A6ADAEADAEAEAEAEB0B0B0B0B1B1B4B4B1\r
+ B0B0B0AEAEAEAEADADA6A6A6A6A6A6A6A6A6ABADADADAEAEAEAEAEAEAEAEB0B0\r
+ AEAEAEAEAEA6A6A6A6A6A6A68B2C1C413B3B3B3B3E412F1B100044C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5985D7F885D2929292E2F233E1767B1B5A5A0A0A0A8B4B0B0\r
+ B4B5B1AEAEAEADA8ABA6A6A6A2A0A0A0A0A0A0A0A0A5A6A6A6A6A6ACAEAEAEB5\r
+ B5B5B5B5B5BDBDBDBDBDBDBDBDBDBDBDBDB5B5B5B5B5B4AEAEAEAEADA8A6A6A6\r
+ A6A5A5A3A0A0A0A0A0A6A6A5A0A6A6A6A6A8AEAEB1B1AEA6A6A6A6A68C3D1B3B\r
+ 38383E3B3B413B1B0F003DC5C5C5C5C50000C5C5C5C5C5C5C56083895C232923\r
+ 292E233E1580B5B5A0A0A5AEAEA6A5A6A6A9AEAEAEADA9ACA9A8ABA6A8ADA9A9\r
+ ADAEAEAEB2B4B5B5B5BDBDBDBDBDBDBDBDB5B5B5B5B1B1AEAEAEAEB1B1B1B1B5\r
+ B5B5BDBDBDBDBDBDBDBDB5B5B5B5AEAEAEAEA8A6A6A6A5A3A0A0A2A0A0A0A0A0\r
+ A0A0A6A8AEB5BDB5A6A2A6A69766132F3B3B38383B3B3B190C0036C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56988896F232F2E2E2F2E47158EBDAEA0A0AEAEA5A0A2A6\r
+ AEB1B5B5B5B5B5B5B5B5B5B5B5BDBDBDBDBDBDBDBDBDBDBDB5AEA6A09D978E07\r
+ 8B88838383807A7A7A7A7A7A80808083888B8A8C8E97A0A2A6AEB5B5BDBDBDBD\r
+ BDBDB5B5B5B5B4AEAEAEABA6A6A6A6A6A6A6A6ADB2B5BDBDB5A6A5A6A0721B3B\r
+ 3E3E383B3E3B3B1B100035C5C5C5C5C50000C5C5C5C5C5C5C56983896E29292E\r
+ 2E2E234117A0BDAE9DADA59797A6B5BDBDBDBDBDBDBDBDBDBDBDBDBDBDBDB5AE\r
+ A6A6A09D8E8C8A837D7D7D7D7A7A7A7A7A7A7D7D7D7D7D7D7D7D7D7D7D7D7D82\r
+ 82828282828282848484848A8A8D979DA0A0A6A9AEB5B5B5B5BDB5BDB5B5B5B5\r
+ B5B5B5B5B5B5BDBDBDB5A0A6A07B202A3B3B3B3B3B3E311B100033C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5A05D88895B292E2E3829292A23A6BDA6A0A68883A0BDAEA0\r
+ A0A3A0A09D938E8C918A84827D7D7D7A7A7A7A7A7A7A7A7A7A7D7D7D7D7D7D7D\r
+ 7D7D7D7D7D828282828282828282828484848484848484868486868484848484\r
+ 84848484848491918D9393939797979DA0A0A5A6AEBDBDBDBDB5A6A6A583201F\r
+ 3E382F3A3B3B2F19100032C5C5C5C5C50000C5C5C5C5C5C5985588895C232E29\r
+ 292F3E1F57AEBDA0A98E6783B107797A7D828282828282828484848484848484\r
+ 8484848686868686868686868686868686868686868686848486848484848484\r
+ 8484848484848484848486868686848686868686868484868686868686848484\r
+ 84848686848DBDBDBDBDAEA3A68B2C1C3B3B382F3B3B2E18100032C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5985B8889562F292E2E293E1772B5B5A0AE80588E8B787A84\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848291B5BDBDB1A0A68C3D1B\r
+ 413838383B3B3B1B0B0032C5C5C5C5C50000C5C5C5C5C5C5C55B88895D292E2F\r
+ 2F293F15BFB5B1A0AE74678F7479848684848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848497BDBDB5A0A68E58153B3B3B3B383B2F1B100032C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C555888855292E2E232347158BBDAEA2A9657407797D8684\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848DBDBDB5A0A69DC010\r
+ 383B3838383E38190F0032C5C5C5C5C50000C5C5C5C5C5C5A05C89895B2F2329\r
+ 2F2947158FBDA8A6A358BF8B7982868484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848491BDBDBDA6A6A07410243B3B3B3B3B3B1B100032C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5985C8989552F2F2E2F294115A0BDA6A69753888379828684\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848491B5BDBDA6A6A2BF20\r
+ 243B3E38383B3B1B10002CC5C5C5C5C50000C5C5C5C5C5C5C56989895C23232E\r
+ 2E382A32A6BDA5AE075307807984848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848491B1BDBDAEA2A6882C1F3B3B383B413B1B10002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56E89895529382F23381F58AEBDA0AE88588D7E7A848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484AEBDBDAEA0A68B2C\r
+ 1B413B3B3B3E3B1B0B002CC5C5C5C5C50000C5C5C5C5C5C5C55C8989692F2F38\r
+ 2E3B1774B5B5A0AE806497767A84848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484A5BDBDAEA0AB8D3D1B3C3B38383C381B0F002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5A05C89886F2938382E421783B5B4A0AE74C09A747A848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484849DBDBDB5A0A89758\r
+ 153E3B3B383B2F1B0B002CC5C5C5C5C50000C5C5C5C5C5C5985C89885C2F383E\r
+ 293E1B07BDB0A0AE72769A747D84848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848497BDBDB5A0A89D67153B3B2F383B381910002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C598600789562E2F2E293E1B9DBDAEA5AE65808C787D868484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848493BDBDB5A2A6A074\r
+ 162F3B3B383B3B1B0B002CC5C5C5C5C50000C5C5C5C5C5C5C5690789552F3838\r
+ 383C1BA0BDA8A6A5588B07787D86848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848DBDBDBDA6A6A27B193B3B3B3B3E38190B002CC5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C56A898856383B3E2E3723A6BDA6A8A0578C8B7882868484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848CBDBDBDA6A6A680\r
+ 1B2F3E3B383B3B1B0B0020C5C5C5C5C50000C5C5C5C5C5C5C5708C894F2F3B38\r
+ 382A57AEBDA6AE8E588E88798284848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691B5BDBDA6A6A68B1C23383B3B413E190B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58C6F07885C2F38383B1D72AEBDA6AE076497807984848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848491B5BDBDAEA6AD07\r
+ 1F1F3E3B3B3E3B1B100020C5C5C5C5C50000C5C5C5C5C5C58B6A0789502F3B3B\r
+ 3E177EB5BDA5B48865A0BF798484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691B5BDBDAEA5AE8C2C1B473B3B3B3B1B100020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58B6A0789552F3E383E1788B5B5A2B58067A6767A84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848691B1BDBDAEA2AE8E\r
+ 39153F382F3B2F1B100020C5C5C5C5C50000C5C5C5C5C5C5C55D07835B3B382E\r
+ 3E1507BDB5A5B57B72A6767A8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691A9BDBDB4A2AD975315412F383E381B100020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C55F0788563E2F2E41158EBDB5A5B5747BA6797D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848491A6BDBDB5A0AEA0\r
+ 6415413B3B3B3B1B0C0020C5C5C5C5C50000C5C5C5C5C5C5C5698D8955383B2F\r
+ 3B15A0BDAEA6B272809A797D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484A0BDBDB5A2AEA06713423B3B3B2F190F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58D6E8C89552F3B2F4117A6BDAEA6AEC08B8F797D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848497BDBDB5A5ADA5\r
+ 74153C3B383B311B100020C5C5C5C5C50000C5C5C5C5C5C58C718D89552F3B2F\r
+ 2F1CA6BDAEA6A6678C8E787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848497BDBDB5A6ADA67B153B3B3B3B3B1B100020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5076F8D89562F3B382A39AEBDAEAEA5658D8C787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848EBDBDBDA6ADA8\r
+ BF18383B3B3B38190B0020C5C5C5C5C50000C5C5C5C5C5C5076A8D894F382F2F\r
+ 2458AEBDA8AEA0659707787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848DBDBDBDA6A6AD83192A3E3B3B2F1B0F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5075D8C07563B3B381DC0B5BDA6AE9767A007787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848DBDBDBDA6A6AE\r
+ 881B293B383B3B1B0B0020C5C5C5C5C50000C5C5C5C5C5C58B698D88503B383E\r
+ 1776B5BDA6AE8DC0A088787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B5BDBDA8A6AE07201F3B38423B180B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58B698D885B2F2F3F17BFB5BDA6B207C0A688788286848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B5BDBDADA6AE\r
+ 07201F3B3B3E2F1B100020C5C5C5C5C50000C5C5C5C5C5C58B708D89493B3E3E\r
+ 1788B5B5A6B58B72A98379828484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B5BDBDAEA6AE8C321C413B3E2F1B0F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C58B6F8E895041423E178BBDB5A6B58876AE80788284848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B5BDBDAEA6AE\r
+ 8E3D1B413B4238180B0020C5C5C5C5C50000C5C5C5C5C5C588708E895C47413B\r
+ 178CBDB5A6B5837BB1BF78828684848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AB1BDBDAEA6AE97441741383E311B0B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5886F8D895B3E3B3B1597BDB5A6B5807EB17B787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AB1BDBDB0A6AE\r
+ 9D57163B3B3B38190B0020C5C5C5C5C50000C5C5C5C5C5C588708E895D2F3841\r
+ 17A0BDB5A6B5BF80B576787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AB0BDBDB0A6AE9D64163B3B4131180B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C588718D895D423B3B1BA6BDB5A6B57B83B576787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AB1BDBDB4A6AE\r
+ A0661538383B3B180F0020C5C5C5C5C50000C5C5C5C5C59888708D076A483B3B\r
+ 1BA6BDB5A8B17E88BD74787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AB0BDBDB4A6AEA0C0153B3B3E3B160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5C5C520738E894F4141311BA6BDB5A6B07E88BD72787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484AEBDBDB5A6AE\r
+ A072163B3B3B3819100020C5C5C5C5C50000C5C5C5C5987620778E895D3B3B24\r
+ 1FA8BDB5ADB27B8BB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AAEBDBDB5A6AEA674162F3B4138160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5987233778C895C473E2439AEBDB5AEAE7B8BBD72787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AAEBDBDB5A6AE\r
+ A57B183B3E482F180F0020C5C5C5C5C50000C5C5C5C5986739778E076A473E1F\r
+ 40AEBDB5ADAE7B07B5C0787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848AAEBDBDB5A6AEA67E192F3B413B190F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C56644738D896A4F3E1F58AEBDB5AEAE7B07B5C0787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484AEBDBDB5A6AE\r
+ A6BF19383B3E2F19100020C5C5C5C5C50000C5C5C5C5C56653718D896950481F\r
+ 65AEBDB5AEAB7B8CB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484A9BDBDB5A6AEA6801B2F3B3E2F190F0020C5C5C5C5C5\r
+ 0000C5C5C5C5076653738E896041421D67B1BDB5AEAD7B8CB572787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491AEBDBDB5A6AE\r
+ A6831B2A3B3B2E180B0020C5C5C5C5C50000C5C5C5C58B6453738D896F493B1D\r
+ 72B5BDB0AEAB7E8DB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491AEBDBDB5A6AEA6831B2A3B3B2E160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5886453718D896F4F421774B5BDB1AEA67E8EB572787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484848AAEBDBDB5A6AE\r
+ A8831B2F413E29160B0020C5C5C5C5C50000C5C5C5C5836453718D89694F4717\r
+ 7BB5BDB0AEA6BF8EB572787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491AEBDBDB5A6AEAD881C2F3E3B23180F0020C5C5C5C5C5\r
+ 0000C5C5C5C5836657738D896F4742177EB5BDB0AEA67E8DBD72788284848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B0BDBDB5A6AD\r
+ AE881C293B382E160B0020C5C5C5C5C50000C5C5C5C5726657778D8971413F17\r
+ 7EB5BDB4AEA67E8EBD7278828484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B1BDBDB5A6AEAD8820233B3C29160B0020C5C5C5C5C5\r
+ 0000C5C5C5C5446653718C8B71503817BFB5BDB5AEA6BF8EBD72788286848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848491B1BDBDB5ABAE\r
+ AD8820233E422E160C0020C5C5C5C5C50000C5C5C5A0646657708E075D494717\r
+ 80B5BDB5AEA6808EBD74787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848491B5BDBDB5A8AEAD8820233B422E160F0020C5C5C5C5C5\r
+ 0000C5C5C5C5C06657718D076F42421D83B5BDB1AEA8808EBD74787D84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484868DB5BDBDB5A6AE\r
+ AE8B20233E3E29130F0020C5C5C5C5C50000C5C5C5C5836453708C896A49421D\r
+ 83B5BDB5AEA6808EBD76787D8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484868DB5BDBDB5A6AEAE8B20233B3E2916100020C5C5C5C5C5\r
+ 0000C5C5C5C5836653718E076E47421783B5B5B5AEA6838EBD76787A84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848693B5BDBDB5A6AE\r
+ AE8B1F243B3B23160B0020C5C5C5C5C50000C5C5C5987E6653718E8971504215\r
+ 83B5BDB5AEA8838EBD7E787A8484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848693B5BDBDB5A8AEAD8B1F2F3E3B23130B0020C5C5C5C5C5\r
+ 0000C5C5C598766653708E896E49421783B5BDB5AEAD888EBDBF787A84848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848693BDBDBDB5ADAE\r
+ A98B1F2E3E3E29160B0020C5C5C5C5C50000C5C5C5C57666446E070771554917\r
+ 80B5BDB5AEAE888EBD8078798484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848697BDBDBDB5ADAEA6881F2F3E3B23160B0020C5C5C5C5C5\r
+ 0000C5C5C5C57466446F07077755491780B5BDB5AEAE8B8EBD83787984848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848484919DBDBDBDB5ADAE\r
+ A6881C2A413823130B002CC5C5C5C5C50000C5C5C5C5766444708C07734F4917\r
+ 80B5BDB5AEAE8B8DBD8878798484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484919DBDBDBDB5ADAEA6881C29413B23100B002CC5C5C5C5C5\r
+ 0000C5C5C5987B643D6F8D077155471780B5BDB5AEAE078EBD8B527984848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848484848484848484848484848484848486919DBDBDBDB5ADAE\r
+ A888202E413B23130B002CC5C5C5C5C50000C5C5C5987E583D6A8D07735C4A17\r
+ BFB5BDB5AEAE078DBD0752798284848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691A0BDBDBDB5ADAEA6831C2F3E3B1F160B002CC5C5C5C5C5\r
+ 0000C5C5C598BF64446F8C0773694F17BFB5BDB5AEAE8C8DBD0752787D848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848691A6BDBDBDB5ADAE\r
+ A6831B313E3B1F160B002CC5C5C5C5C50000C5C5C59874644460070773565B17\r
+ 7EB5BDB5AEAE8D8EBD8E52787D84848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691A9BDBDBDB1ADAEA6801B313E3B1F100B0032C5C5C5C5C5\r
+ 0000C5C5C5987B583D6E8C077769561D7BB5BDBDAEAE8E8EBD9A65787A848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484848691B1BDBDBDB5AEAE\r
+ A5BF192F41381F100B0032C5C5C5C5C50000C5C5C598BF5853698C07775B471D\r
+ 76B5BDB5AEAE9797B5A665787A82848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 848484848484848691B1B5BDBDB4ADAEA2BF1B3B413B1F100B0039C5C5C5C5C5\r
+ 0000C5C5C5C58857445D8D89776F5D1D74B5BDB5AEAE9D97B5A6657879828484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848484848484848484848484848484848484849191B1B5BDBDB1ADAE\r
+ A37B1B423E3E1F13000053C5C5C5C5C50000C5C5C5C58B58575D0707775D501D\r
+ C0B5BDBDAEAEA097B2B16778797D848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 84848484848491918DB5B5BDBDB1ADAEA0761C483B3B1F130B0058C5C5C5C5C5\r
+ 0000C5C5C5C5885864550707776A552467B1BDBDB0AEA09DAEBDC05279797A82\r
+ 8284848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848484848484848484848484848484848484\r
+ 8484848484848484848484848484848486868484869191848CB5B5BDB5AEADAE\r
+ A07416383B3B1F13000067C5C5C5C5C50000C5C5C5C50757645C07077C694F1F\r
+ 65B0BDBDB5AEA5A0ADBD724E78797979797A7A7A7A7A7A7A7A7A7D7D7D7D7D7D\r
+ 7D7D7D7D7D7D7D7D828282828282828282828282828282828282828282828282\r
+ 8282848282828282848484848484848484848484848486848484848686869191\r
+ 919191919191917D8CBDB5BDB5B0AEAEA072163B3B381C10000072C5C5C5C5C5\r
+ 0000C5C5C5C507585850078C7C705B1F65B0BDBDB5AEA6A0A6BD8F362B527878\r
+ 7979797979797979797979797979797979797979797979797A7A7A7A7A7A7A7A\r
+ 7A7A7A7A7A7A7A7A7A7A7A7A7A7A7D7A7A7A7A7A7A7A7A7A7A7D7D7D7D7D7D82\r
+ 7D8284848484848484848484848484848484849184847A76A0BDB5BDB5AEAEAE\r
+ A0C0153B3B3B1C100000C0C5C5C5C5C50000C5C5C5C5C558664F898C7C6F5B24\r
+ 64AEBDBDB5AEA6A5A6AEB58E674E4E4E4E4E4E4E525252525252527878787878\r
+ 7878797979797979797979797979797979797979797979797A797979797A7A7A\r
+ 7A79797979797979797A7A797A7A7A7A7D7D7D7D7D7D7D7A7A7A7A7A7A7A7A7A\r
+ 797979797478C08BB5B5B5BDB5AEAEAE9D67163B3B381B10001074C5C5C5C5C5\r
+ 0000C5C5C5C5C564665589077C705C2A57AEBDBDB5AEABA6A6AEAEBDB1A0978D\r
+ 078B83BF7E7674C0676565644E4E4E4E2B4E2B2B2B2B2B2B2B4E4E4E4E4E4E4E\r
+ 4E524E4E5252525252525252525252525252525252524E525252525252525252\r
+ 52655252787878787878747474767E8080808388888B97B1B5B5B5B5B5AEAEAE\r
+ 9D6417473B311B10001680C5C5C5C5C50000C5C5C5C5C564644A89077C6F5D3B\r
+ 38AEBDBDB5AEADA6A6AEA6AEB5BDBDBDBDBDBDBDB5B5B5B1AEAEA9A6A09D9A97\r
+ 8F8C07078B888380BF7B767472C0676767656464646464585858646464645858\r
+ 64656565676767C07274747B7E8083888B07078C8D8E8E979DA0A0A6A6A8A9A9\r
+ AEAEB1B5B5B5B5AEADB5B5BDB5AEAEAE975719423B381B1000167EC5C5C5C5C5\r
+ 0000C5C5C5C5C5646647898C7F705D372EADBDBDB5AEADA6A8AEA6AEAEAEB0B1\r
+ B5B5B5B5B5B5B5BDBDBDBDBDBDBDBDBDBDBDBDB5B5B5B5B5B5B5B1B1B1AEAEAE\r
+ AEA9A9A9A9A8A8A9A8A6A6A8A8A8A8A9A8A6A9A9A9A9A9AEAEAEAEAEAEB1B4B5\r
+ B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B4B1AEAEAEAEA6AEB5BDBDB5AEAEAE\r
+ 8E441B473B381B10001680C5C5C5C5C50000C5C5C5C50757663E880783716F3B\r
+ 2EADBDBDB5AEAEA6A8AEA8AEAEB0B5B5B5B4B5B4B0AEB0B0AEAEAEAEAEAEAEAE\r
+ B0AEAEAEAEAEAEAEB0B4B2B0B0B4B4B0B4B4B4B4B4B4B4B4B4B4B0B0B4B0B0B4\r
+ B5B4B0B0B0B0B4B4AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEADAEB5BDBDB5AEAEAE8E3D1D483B2E1B10001688C5C5C5C5C5\r
+ 0000C5C5C5C58B3D664788077F716A471FA6BDBDB5AEAEABA8AEADAEAEB5B5B1\r
+ B1B4B5B5B5B5B1B1B1B0B0B0B0AEAEAEAEAEAEAEAEAEAEAEAEAEAEADADADADA9\r
+ A8ADA9A6ABA8A8A8ADA8A8A8A8A8A8A6A6A8A8A6A8A6A6A6A9ABA6A6A8ADA9AD\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEB5BDBDB5AEAEAD\r
+ 8C381F3E412E1910001680C5C5C5C5C50000C5C5C5C507446649898C7C715D47\r
+ 17A0BDBDBDAEAEADA6AEADAEAEB5B5B5B5B5B5B5B5B5B4B1B1B1B0B0B0B1B1AE\r
+ AEAEAEAEAEAEB0AEAEAEAEAEB4B0AEAEAEB2B4B4B0AEADA8AEAEAEADA8AEAEAE\r
+ AEAEAEAEAEADABADA8ADAEAEADADADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEADAEB5BDB5B5AEAEA88C321F423B2F1910001888C5C5C5C5C5\r
+ 0000C5C5C5C5C5C0663F838C83716A491797BDBDBDB1AEAEADAEAEAEAEB5B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B1B0AEB0AEAEAEAEAEAEAEB5BDB5AEAEB5BDBDBDB5B5\r
+ BDBDB5B5BDBDB5B4B5BDAEADB4BDB5AEAEB5B5B5BDB5AEAEAEB5BDB5ADADADAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEB5BDB5B1AEAEAD\r
+ 072C233E3B2E181000198BC5C5C5C5C50000C5C5C5C5C572663F7F8C7F73694F\r
+ 1D8DBDBDBDB5AEAEAEAEADADAEB1B5B5B5B5B5B5B5B5B5B5B5B5B1B1B1B0AEB0\r
+ B0AEAEAEBDAB2C44AEBDA23D001680A63D000000000067B558188EBDA03600C0\r
+ 803364571907BDBDBD831653AEB5ABAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEADB0B5B5B5B0AEAEA68B2C2A3B3B29180C00188BC5C5C5C5C5\r
+ 0000C5C5C5C5987B57497F077F73705B178BB5BDBDB5AEAEAEAEAEADAEB1B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B4B1B0B1AEAEAEAEAEAEBDA62044B5BD58000018BF72\r
+ 1044838080321983571EA6A02C00C0BD8313748E20000B0B10001807BDAEADAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADB1B5BDB5B1AEAEA6\r
+ 831C3B423829161000208CC5C5C5C5C50000C5C5C5C598BF53407F8C83736F5D\r
+ 1788B5BDBDB5AEAEADAEAEAEB1B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B1B1B0B0\r
+ B0B0B0AEBDAE2066BD7200677E197B6420A0BDBDBDBF207B671E6419198CBDBD\r
+ 801067BD74003588360F72BDB5A6AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEB5B5BDB5AEAEAEA6831C423B3B291610001E07C5C5C5C5C5\r
+ 0000C5C5C5C5C5883D407C8C7F776E5D1780B5BDBDB5AEAEADAEAEA9B2B5B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B5B4B1B1B4B4B0B0B0AEBDA620647B1033AE88197466\r
+ 1E8DBDBDBD7B1E7EC0162C1033BDBDBD801064BD971933B55719A6BDA6ADAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB5B5B5B5AEAEADA6\r
+ BF193E3B3829160B002CC5C5C5C5C5C50000C5C5C5C5C5073D407C07837C7069\r
+ 2464AEBDBDBDB4AEA8ADAEAEB1B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B4B4B4\r
+ B0B0B0AEBDA03200001E07BD760E727B0020C0727220208B5720B58E181683BD\r
+ 800057BDBD7600001888BDB2A6ADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEB5B5B5B5AEB0B5AE7E153B3B3823160B0032C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5443977078377716F47155883A6BDBDBDB5B5AEAEAEB5B5B5\r
+ B5B5B5B5B5B5B5B5B5B5B5B5B5B4B1B1B1B0B0AEBDA6722C3288BDBD883683A6\r
+ 661610100F1672AEC033A0BD8E201E8E073674B5BDA66413C0B5BDA6AEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEB5B5BDBDBDB5AE07\r
+ 441D483B382316100032C5C5C5C5C5C50000C5C5C5C5C5C5362E778C83777C6F\r
+ 4123381F1B577E8EA6BDBDBDBDB5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B5B4\r
+ B1B1B1B1B5B5B5B5BDBDB5AEAEAEB0BDB5AEAEAEAEAEB5B5AEADADB0BDB5A2A0\r
+ A6A8AEAEAEB5B0ADAEAEAEADAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEBDBDBDBDAE8D7E57101038473B3B23160B003DC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5A05320738D887773704A1B73075B17101532668098B5BDBDBD\r
+ BDB5B5B5B5B5B5B5B5B5B5B5B5B5B5B1B1B4B1B1AEB5B5BDB5B5AEAEB4B5B5AE\r
+ B5BDBDB5BDBDB1AEB5B5AEADAEB5B5B5B4B5B4ADA8ADB4B5B4A9A8AEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB5B5BDBDBDB5A08B74401B171710\r
+ 16383B2F3B23130B0057C5C5C5C5C5C50000C5C5C5C5C598832071078877716F\r
+ 501B5D897F7349231F17171F577B8CA6BDBDBDBDBDB5B5B5B1B5B5B5B5B5B5B5\r
+ B5B5B1B1B1B2AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEADAEAEAEADADAD\r
+ ADAEAEAEAEAEA8A8AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEB5BD\r
+ BDBDBDB5A0887444231F1F1F2F3B2E1616383B38381F16000066C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5072C6E07887C77705B1D497F7C775C483B3E3B2A1F1D171B\r
+ 39C088A0B5BDBDBDBDBDB5B5B1B0AEAEB5B5B5B4B1B1B1B0B0AEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEB4BDBDBDBDBDAE8E83C0441F1B1F2F474F4941382F2313\r
+ 18383B38311F130000C0C5C5C5C5C5C50000C5C5C5C5C5C5C5325C89897F776F\r
+ 5C1C387F7F735C483B3B3B3E2F42483B2A1F17192C647B07A6BDBDBDBDBDBDBD\r
+ B5B5B1AEAEAEAEAEAEB0AEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAEAE\r
+ AEAEAEAEAEADADAEAEAEAEADAEAEAEAEAEAEAEB5B5BDBDBDBDBDB3978372532C\r
+ 1B1D1F23292E425C5650473E2F2F1F131B423E382E1F13000072C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5335C88897F77715D23297F7F7C70473838383B2F3E565D\r
+ 5C55473E2F1F1B15192C44748B98AEB5BDBDBDBDBDBDBDB5B5B0AEAEAEAEAEAE\r
+ AEAEAEAEAEAEAEAEAEAEAEAEADAEAEADADADADABADA8A6A8ADADAEB0B5BDBDBD\r
+ BDBDBDBDAE9D077E663D1F19191C1F232F2F38382F38474F4F55483B2F2E1C13\r
+ 1F423B382F1C10000F72C5C5C5C5C5C50000C5C5C5C5C5C5C5584F89897C7773\r
+ 5D2F1F777F7C73553E38383B2F3B5656555D5655505556483B291F1D150D1516\r
+ 1E3D72888EA0AFBDBDBDBDBDBDBDBDBDBDBDBDB5B5B5B5B5B5B5B4B4B5B5B5B5\r
+ B5B5BDBDBDBDBDBDBDBDBDBDB5A69707BF66331B161015171F232F2F383B382F\r
+ 2E38382F2F3E4147494847382F291B101F4938382F1C1000107BC5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5674983897F77776F2F1C777F737155473B3838383B4250\r
+ 5D5C55505C5556564F4F4A4F483E3B3B291D15100D0D1013193258727E838B8C\r
+ 97A0A3A6AEAEB5B5B5B5B5B5B5B2AEA6A09D978C8B88BF74663D201610101010\r
+ 15171F2A31383B3B382F3838382F38382F2F2F38383B424948493B3B38291B10\r
+ 2347382E2E1C1000137EC5C5C5C5C5C50000C5C5C5C5C5C5C5763E7F077C7773\r
+ 70411F73837C7C5B4738382F382E47565C6969555550505B5B5650494948484F\r
+ 473E3E494F412F2E231F17151000000000000000000000000000000000000000\r
+ 000000000D000D10151D1F292F3B3B41413B38382E383B3B382F382F382F2E38\r
+ 2E2E2F2E2E3B47494F413E382F2316102F47382F2E1B10001680C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5BF387F077F777169471C6F7F7C7769423B383B3B293E5C\r
+ 5556695C56565650504F494749504A474848473F3B414742413E3E4249484848\r
+ 3E3B3E3B312F38312F2F382F29382F2F3B3B3B3B3B3E423E3B3B3838382F2F38\r
+ 382F2F2F2F38383838382F382F38382F2E2E2E2E2F3E423E48473F3B2E291616\r
+ 2F3E2F3838190C001888C5C5C5C5C5C50000C5C5C5C5C5C5C58B2E7C897F7773\r
+ 70471B5C837C776F493F3B382F233B505B5C5B5C5C5B56554F4F50565C4F4748\r
+ 49484947424749473E3F47423E3B3B3B3B3B3B38383B383841423B3838382E38\r
+ 383838382E2E38413E38383B3B38382F2F38382F2E2E2F382F2F2F2E292F2F2E\r
+ 2F383838383B4748493E3E382E23161638472F2F291810001E07C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C53977897F7F77715B17497F7C7C735647382F38382E47\r
+ 69695D69695B5C56554F4A554F49494F49424F55494747474847424747424742\r
+ 3F413B38383B3E3B383838383B3838383838382F2F2F38383E3B2F2F382F2F2F\r
+ 2F382F2E2F38382F2E2E2F382F2F2F2E2F2E38382F3E493B3B3F3B2F2F1F1619\r
+ 3B472F312318100020C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5447389837F77\r
+ 6F5D1F2E7C7C7C715D493F382F2F2E3F5C5D5D5B5D6A5D555D5C4947474F5049\r
+ 4F4949494847474748423E3E4147413E3B3E3E3E38383B3E382F2F3838382F3B\r
+ 3B2F2E383838383B38382F2E2E38383838382F2F382F2F2F382F2F2F2F2E2E2E\r
+ 2E2E2E3138384142423F38382F1F131B3E3E2E3823160B0032C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5646E89887F737160231F7C7F7C776A50473838382E3B\r
+ 555C5D5C696A5D5D555556554A504F505649484F424749494947423E3B3E413F\r
+ 3B383B3E3E3E413B38383838382F2E2F3B2E2E2F2F38382F3838382E2E2F2F2E\r
+ 2F2F2F382F2F382F3838382E2E2E2F2E2E2F2F2F2E383E3F423B382F291B101C\r
+ 42382F2F2316000036C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5745588887C77\r
+ 736A381F737C7C7C5D5549383B3B2E3850565C6969695C5C555556555D56494F\r
+ 50494948484F4947474248423B3B3B3B3B3B3E3E3B3B3B3B3838383B3B38382F\r
+ 2F38382E2E3838383838382F2F38382F383838382F382E2F2E2F382F2F2F2E2E\r
+ 3838382E2E3B3F3E423E2F2E291B101F47382F2E1F160B0058C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5BF5583887C7C7170421C717F7F7F705D4F423838382F\r
+ 475D6A5D5D5C5B5D5C504950564F50554F4F42425055483E3F494F48413E473E\r
+ 383B3B3B3E3E3B383838383B3B38382E2E31382F2F383838382F2F383B382F38\r
+ 3B3B382F38382E2F2E2E2F2E382F2E2E2F2F2F2F3B3F423F423B2F2E291B1023\r
+ 423838311C130000C0C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C58B4A88887C7C\r
+ 7773421D6A7C7F7F73695C49383E382F495B5D5C56696F695B554A5549495656\r
+ 494748484849474248473E424741413F3E3B383B413E3F423E383B3B382F382F\r
+ 38382F2F382F2F3838382F2E38382F2F2F2F3838382F2E2E2E2E2E3838382F2F\r
+ 2E2E2E383838423E3838382F23161638423838381C1000167EC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5073F7F837C7C77734F175D7C7C7F776F5B47383E3B3B\r
+ 49555C5D5C5D5D555C695C555B504950484F554949474749473E3B3B3E3E3B3E\r
+ 4748423E3E3E3E3E3B3838383B3E3838382F38382F382F2F383838382E2E2E38\r
+ 2E2E382F2E2E3831382E2E2E2F2F2F2E2F2F38383838383B3838382E1F13183E\r
+ 3B2E382F1B10001B83C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C598387C837F7C\r
+ 77705A1B567F7C7C77705C56483B3842495C5D5C5D696A5B49555B4F5655504F\r
+ 484948474F4F4847413B3E3E42473E3B3E4247413B3B3E3E3E3B2F2F38383838\r
+ 2E2E3838383838382F312F2F382E232F382F2E2E2F2E2E2F382F2E2E2E2E2E2E\r
+ 2F3B2F2F3E3B3B3E3E3838291C13193B3B38382F1B10001983C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C53F77887C7F7373691F42777F7C77705C504A3F3E3E\r
+ 38555D69695B555C6A6A565556555655494950494749504F4742484F47413F3F\r
+ 3E383B3F3E2F3B473E3B3B38382F382F38382E2E2E292F382F2E292E2F382F29\r
+ 2E292E38292E2F2E2E2F2E2E382E2E292E2E383B3838382F3B382E231B101C3F\r
+ 3E2E382F191000208BC5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5656E887F7F\r
+ 7C716F29237C7C7C7C776F5D4942473F3E485B5D695D5C69695D5D5B55505556\r
+ 4F47474955554F41424742413F3F3B3B3B3B383E49423B3B3B3B3E3E3B38382E\r
+ 2F383838382F2F2F2E38382F38382E2E382F2F382F2F2F2F2F2E2F2F2E2F2F2E\r
+ 2F3B383B38383B3B2F2E2E231B101C3E3E2E2F23160F00398CC5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5805D7F7F7F7C736A411C717F7F7C71695D554F473E\r
+ 3B415D6F5C5C6A696A695D5C555656505556555050504847473E3B4242424742\r
+ 3B413E3B3E3E3F3E3B3838383B382E2F38383838382F383838382F2F2E38382F\r
+ 2F38382F2F383838382E292E38382E2F2F383B383B3838382E2F2F2319132347\r
+ 2F2E2F23160F1558C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C541837F7F\r
+ 7C7C71491C697C7F7C73716F5655493B4241505C695C5D6A56565D5C5C554F55\r
+ 5647495B554749504747423B42474742423F3B3B3E413E3B3B38383E3B3B3838\r
+ 382F2E2E382F38382F2F383838382E2E2E2E2E2E38382E2E2E2E2F2E2E382E29\r
+ 2E2E38383B382F382F2E2E1F161638492E2F2F1F16000057C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C53E7F7F777C7773481C567F7C7773776F5B565049\r
+ 473E4955696F6969696A5D555B5D565B5B554F4F4F494F49424749423E47423F\r
+ 42423E3F3E3B3B3E3B3B38424738383B3B383B2F292E382F2F2E29292F382F2F\r
+ 2F2F2E2E2F38382F2E2E2F2F2F2E2F2F2E31382F2F382F2F3838231F13164249\r
+ 38382F1F130000C0C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C53B737F7C\r
+ 7F7777601F427C7F777773716A56494F48474F69695D5C5D695C565D695C5556\r
+ 5B554F4F484F504847484F4F484842474F483B3B3E3E3F3E3B3B38383E413E3B\r
+ 38383E382E38382F2F38382F382E2E382F3838382F2E2E292F382E2F2F2E2E38\r
+ 2F38382F2E38382F382E231B101B473F2A382E1C1000107EC5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C53E717C7C7F7C7769232F7C7F7C7C7C736E5C5555\r
+ 565550566969696A695B5D5D5D5D5D5B5549564F474F55484742414747413E41\r
+ 4242413E383B3E3B383B38383838383B38383838383E382F382F2E382F292E38\r
+ 38382F2E2F2F2F2E2E2F382F2E2F2E2F383838382E383B2F2F2E2419101F3E3B\r
+ 2E2F231910002388C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5586A7F7C\r
+ 7F7777692F29777C7C7F777170705C555B5B4F505D696A695C6F706969695C56\r
+ 5B5550554A5B5C49474747423F42494942414742383B3E3B3B3E382F382E383B\r
+ 38383838382F2F2F383838312E2E2E382F2E2E382E2E3838382E292E292E382E\r
+ 2F382F2E382F38382F2E1F16102E50382F38231610002C07C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C574557F7F7F7C7371421C5D7C7F7C7777716F6A69\r
+ 5550564F5C6A6A695C5D695C695C565B5D5D554F4F56554748504F4942414847\r
+ 3E4242423F3E3B3B423B38383B3B3B383B383838382F3838382F2F382F382E38\r
+ 38292E31382E3838383838292E3838292E2E382F382F2E382E291F131338492E\r
+ 38381F160B0033C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C580417777\r
+ 7F7F7C73561B48777F777773736F6F6A5D495555555C69696A696F5B5B696F5C\r
+ 565D5C4F505B50484F48424747474142473F3E42423B3B3B3F3F3B3838413E3B\r
+ 3B3E382E38382F2F382E2E3838382F2F38382F2F2E2E382E2E2F2F2E2E2E2F2F\r
+ 2E2F383838382F2E2E291C13183B422E38381F130B0057C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5073E737C7C7C7F77691F38737F7F7C737371716F\r
+ 5D5C5C555B566A6F6969706A5C696F5D5C5B5556565556564F48494949494948\r
+ 41413E3B3E413B3B3B3E3B383B3E38383B3E3B383B38382F2F38383B2F2E382E\r
+ 2F38383B2F38382E2E2E2E2F2F292E2E2E2E2F382F292F2E29231B101F473E2E\r
+ 38291B13000074C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C52F707C\r
+ 777F7C7C7029236F7C7F7F777173736F5D705D564F696F696A706F695D5D5D69\r
+ 5B5C5C5555484F5B4F47424147424249484847413E3B3B3E3B424138383B3B38\r
+ 3838383838383B38383838382E383B382F2F2F3838382F2F382E2E382E2E2F2F\r
+ 2F2E2E2E292E2E2E2E23181023483B2F2F291610001688C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C54A5B7C777F7F7C71491F55777F7C737071716F\r
+ 69695B5D55566F70706F695D6A6F5D565B5B5D5B5B5B504F4947505549484848\r
+ 47424749473E3B3F423E3838383838383B383E3B383838382F2F382F2F2F2F2F\r
+ 38382F292F2F2E2F2E232E2E2E2E382E38382F382E2F2923231F16132942383B\r
+ 38231610002007C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5BF3F73\r
+ 777F7F7373691F47737F7F7F7773776A695B5B696F565D706F695D6F6F69695D\r
+ 5B5C5C5D5D5B50565C5655504F4742423F3F41424249483B3B3F3B3B38383B41\r
+ 3B413B383B3B3B383838382F3838382F383838382F2E2E2E292E2F2E2E2F2F2F\r
+ 2E382E2E38382E29231C101942422E382F1F130B0033C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5073B707C7C7C7C7C69233871777C7F7C777171\r
+ 736F5C69696A6F5D696F6F69555B706A5D695D5C5D55565C5049485556474755\r
+ 4F47423E3B474F473B3B3E3B383E423E38383B3B38382F383838383B3B382F38\r
+ 382F2E382F2E2E2E2F2F2E2F2F2E2E2E2E2F2F2E382F2F291F1B101F473B292F\r
+ 311C100B0058C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5983E6F\r
+ 7C7C7F7F7F702F1F5D7C7F7C7C7371717173706A696A6F70716A706F5D6F695C\r
+ 695D5B5C5C5C5C55504F4F5B5649494942474748483B3B414242423B3B3B3B38\r
+ 383B3E3B383B3B3838382F38383838382E2E2F2F383838382E292E2F382F2E38\r
+ 2F2F2F292E2E23291F16102F472F2F2F2E190F00007BC5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5585B77737F837C73501C3F717C777C737173\r
+ 705D7071716A6A6F7070716F6A695D696A695C5B5C696A5C56554F50554F4247\r
+ 494F49414142423F47504F473B3B3B383E3F413B2F383B38383B382F3838382F\r
+ 3838382F2E2F38382F382F2E383E2F2E382E2E2E382F29231C1318474F383838\r
+ 231610001883C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5833B\r
+ 73777F7F7C776F2338717C77777C73737371706F70716A69706F696F6F6A6F6A\r
+ 6F6A695D565D5D5B5D5C4F494F5055564F4949423E49492316193F5C4738383E\r
+ 3E3B3B3E3E3B38383B38382F3838382F383B382E2F382F38382F2F382E2A3838\r
+ 2E2F2F2E2E2E231F1B101C4747382F381F130F0032C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C53869717C837F7C71311F55737C7F7C7777\r
+ 73736F6A6F707170706A6A706F696F70706A6969695D5C5B565B5D5B4F565C55\r
+ 49423E484F492E1610103871562F3B3E38383E3B383B3B38383B382F3838382F\r
+ 38382F2F2F2F38382F2E2E383838382E2F38382E2E23231F16133849382F382A\r
+ 1C13000066C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C549\r
+ 5070777C7C7773551F3E717C7C7C777171707171716A6F707070716F706F6A71\r
+ 6F696A695D5D5D5C555669471B1623565C4747504F4823161000327F6E383B42\r
+ 3E3B381B131B3F42383B3838383B3B38382F383838382E2E382E2E38382E2E2E\r
+ 2F292E2F2E29231C131942482E38382E19100010BFC5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5744871707C77777C6D232F6A7C77777771\r
+ 7177717173716F7173736E6F706A6F706F695C5D6A5D5C5D5C6E5C1F10001355\r
+ 7356484849492F191013557F5C383E3B42411C0F00164F703E23383B38383838\r
+ 3B383838382E2938382E292E2E292F382E2E2E2E2E23231B101F4F3E29383829\r
+ 160B00208CC5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C507\r
+ 2E6E70777F7F7C712F2355737C777C7777736F71737171717771706F706F6A69\r
+ 6A6F6A696F695D6A6969491C1000186F775548485050381B1F4F7C7C4F3B413B\r
+ 3E38191000134A7C42243838382F2E2F383838382F2E2F38382E2E2E2F2E2E29\r
+ 2E2E2F2E29231F16132F49382E2F381C100B005898C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C538566F717F7F7F7C5B1F38707C7C7C71\r
+ 777370717173716F7071706F706F6A5D606F6F69696969605C5D4F1F16103F7F\r
+ 774F484F4F4F381B1F507773483B3B3B47381913161F6F6F382E3B383B3B3838\r
+ 3B382F382F2F2E382F2E2E382E2E2F2E2E2E2F2923231C131B42422E2E2F381B\r
+ 1000107EC5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C03E69717F7F7C7F772F1F50777C777773777C77737773707171707171707070\r
+ 6F6F695D69695D5D5C5D56231B31707C775D494955563B1B1C477370423B4142\r
+ 493E19163871774A29383E3B383838383B382E38382E2E382F2E2E2E2E2F382F\r
+ 2E2E2E231F1F19162E503B2E383823161000208BC5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C58B235C697788777C7C4F1C3B707C7C7C\r
+ 73707373717171717173717071716F70707071706A69696A6A706E2F1B2E6F7C\r
+ 77695648474F42231C487370423B4742423B1616477071492F3B3B3B38383E3B\r
+ 383838382F382E38383838292E2E2E2F2E2329241F1C161B3B4F3B38382E1C13\r
+ 0B006498C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 982E4F5D6A7F837C7C6F23295D777C7773737373737170707371707173717073\r
+ 6F69706F6E696A6F6A6A6F471C1F5D7C735B5555474847231C5B7769423F413E\r
+ 3E38161847716F3E2E383B41383E3E383E3B383838382E2F38382E2F2E2E2E2E\r
+ 2E2E2E231C1B101F423F2F3838291910001380C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C572385D6E7C837C7C77421C49717773\r
+ 777771717073737773737371706A707370696A6F706A5D695C5D69501F1F5D7F\r
+ 775C5055554A4723235D715B484242414138191B4F706947383B3F3E383B3838\r
+ 3E3E382F38382F2E2E2F2E2E29292E2E2E29231F1C161641502E2E2F3823160F\r
+ 0033C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C58B234F6A777F7F7C7F6023295D777C73737C73717773717171717073717071\r
+ 71707071695D695C5B5B5D5D291B557C735D5C565655482E1F50735B3C3E4142\r
+ 503E161B5C7355293B42413B3B3B3B382F38383838292F2F2E2E2E2E2E382E2E\r
+ 2E29231F1B161F3E4138382F291C13000074C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C544415D6F88837C7C77471F427377\r
+ 7777736F77777071777773716F717171717171706F70716A5D5D5D5D3B1B3F73\r
+ 71695C5047475642295C70483E3F4848472F161B5D73492E38383B3B3838383B\r
+ 383B3B3838382E382E232F2E2E2E2E2E2E29231C19192E483E38383129181000\r
+ 1E07C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C58023415D7C7F7C7C7F5C1F235D7777777C777371777C716F717171717371\r
+ 70706F6F71736A5B565C5D69481C3877775C555B554955422E555D4247474142\r
+ 4938191F69693E38383B473E383E3B383838382F2F2F38382E292E2E23292E2E\r
+ 2E231F1B16233F47383838381F16000066C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5393B49707F7F777C7C3F1B3F70\r
+ 71737777777777777173777373716F7173706F6F6F695C5D6969696A5C293871\r
+ 735D5C50494949473E485C4F4248473B4738192E6F5638383B3E413E3838383B\r
+ 3B38382F382F2E2E3B38292E2E2929231F1F1C16193847382E2F312319130013\r
+ 8BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5BF29415B77837C7F7C5C23295D77737377777373737777737373717071\r
+ 7171717171706F6F6A6A695D603823707756495B554F4F4F5556473E42424742\r
+ 48381B3871552E2E383E3B3B423B383838382F2F3838382F2F2E2E2E2E292323\r
+ 1F231B162942492F2F382F1F160B003DC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5393856717F7C777C773B1F42\r
+ 707C777C7373777777777170707373716A696F737170706E5D6A6A5D6947236A\r
+ 7C5C4F5555504A504F4848424747474947381C496E42383E3E31383E3E3B3838\r
+ 382F2F383B382E2F2E2E292323292323231C161B384238382F2F2919100000BF\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C583234A5B7C7F7C7F7C5D2323507377737377777773737373706F7171\r
+ 706F6F7070706A5C6A69696A6F5D3E5C735D4F4A4F4F50492E234F483E474748\r
+ 483823555D3B383F3E3838383B3B3838383B3B3B382E2E38382E2E2F29292923\r
+ 1F1916233B3B3838382F2316100035C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5AE29384270837C777F77471F\r
+ 38697773737777777373737773706F7377716A6F69696A696969695D6A6A475C\r
+ 735C4F504F4F5B3810002C69473B4142483E2F555038383E3B383B3838383838\r
+ 38383838383838382F2E2F2E2929231F1C18193849382E38382E1B1600007BC5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5801F3B5D7C7F7F7F7C702E1F4A7373777C73717377777171737170\r
+ 706E6E6F6A6A6A6A6A6F69565D69565C6F5C4F55565C5B2300002F6F483E4948\r
+ 423B3B4842383B3B3F3E38383B383838382F3838382F2E2F2F2E2E2E2E23231F\r
+ 1916233F423838382F1F16100036C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C52323486F7F7F7C70735B\r
+ 1F386A737173737371737373707071716F6E71716A5D6A6A69695C5C5D6A6A6A\r
+ 706E5555565C5C2E00165671423847423E4148423838383E4138383B38383838\r
+ 3838382E2E2E2E2E2E2E292E2E29231C1619424829383838291B1000007EC5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5881F2950777F7C737773381F3F70737370717371707377717071\r
+ 737171706E6969695D5D5D695C695C231F4A5B555550563B1019707042423B3B\r
+ 3E231B233B3B3B3E3B383B382F38382F2F2F2F38382E2E2E2E29292923232319\r
+ 162E4F3B2F3B382E1F160B003D98C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5401D3B697C837C7C7C\r
+ 6923235573737377777770707073717071706A706A5D696A695D695D696F2E00\r
+ 001F6F5D564941421F1F694F3B48473E2310001642412E3B3B3B3838383B382E\r
+ 2F38383838292E2E2F2E2323231F1C161C42472F2F2F38231910000083C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5981C2349737F7F7C7C73481F2E5D717373717071737073706E\r
+ 71706F7070696A6A5D695D5C69601F000032735D474747474F554F423E3B3B3B\r
+ 1F0F0F326A3E293838382F3838382E2E2E2E2E3829232E2F2E232323231F1618\r
+ 3B4F3E3838382E1C130B0058A0C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C01D2456777C7C7C\r
+ 77682F29386973706F6F6A71705D5B5D6A6A5D696A6A695D5C695C5C5D604216\r
+ 0038715649504F423B3F4742423F3F421F001664692E38382F2F2F2E2F2E383E\r
+ 3823292F2E2323292923232323191323423E2E2F383129191000138BC5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5391D386A7F7F7C7C7C5C232F496A716F696E695B5C6A70\r
+ 6A5B5B5B565C695C505B5C5C565C5C1B105770474956502E10001B423B2F3847\r
+ 2300207350232F2E3838382F2E2E2E2E292E2E2323232923232923231B161C48\r
+ 563838382F291B10000074A0C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5881F1F3B717F7C\r
+ 7C777148232E496A6A6A695C505D695D5B5C5C5C5D5C50555B5D5C5650495B3E\r
+ 3B705C474847471C00001B49412F383B381F3F492F2938382E292E2F2E2E2E23\r
+ 2329232323232323231F231C161B3B4F47382F38381F1610003397C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5671B234F777C737C7C71381F2F3B3F4F505C69505556\r
+ 495055495055564F484F49505549424F5B4F423E3F4742230F10386A3F383F3B\r
+ 383E3E2E29292E2E2E2E23232E292929232329232323231F1C1C19161F2E3E41\r
+ 38383B3823161000008BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5A6391B3B507C\r
+ 7F777777703B1C233838383F49494949504F505B555049474249554948484747\r
+ 3F3F42423B3B422E101649562E2E3838382E23232E2E23232E2E232323232323\r
+ 23232323231C1C1C1B1B1F23232F3E3B383B38231B130000C0C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C58E1C1F3E5D7C7C777377735C2E1B1F2E38382F2E2E\r
+ 2F3B3E47473F424748423E413B3B3F3E3E3E3E3B3B3B3E3819206949232E3829\r
+ 292E2E23232923231F1F2323231F1F1C1C1B1C1F1B191C1F23231C1F3838383B\r
+ 3B38291C160B0044C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C58B1B1D2F\r
+ 60777C7C777377715B3B23231F1F3838232E38382E23383838383B383838383B\r
+ 3B38382E29292F2F3B5041232329292E232323231F1F1F1F1C1C1C1B1B1B1B1C\r
+ 19181C231F1F1F1F1F1F2E3E4138383B382E1B130F001E8BC5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C576151C3B55737C7F7773737773735D4F42231C\r
+ 1C232E292E2E2E29232329232329231F23231F1F1F231F1C1F1F1C1C1F1C1C1F\r
+ 1C1B1B1B1B1B1B1B1B1B1B1C1C1C1C1F1F1C1F1F232329383B3B3B2F383B3838\r
+ 2E1C160C001088C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C57413\r
+ 162E3E55737C777773777C737377705D50423823231F1F1F1F1F1F1F1F2E2E23\r
+ 232323232323231F1C1B1C1F1C1F1F1C1C1C1C1C1C1C1F1C1C1C1F23231F1F29\r
+ 2E2E2F3B3E3E3E3E3E38383838382E231C160B001683C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C58819001923384F5C6F6F71737773717173\r
+ 7171716F5549473E382923231F1F1F23231F1F1F1F1C232E231F1F231F1F231F\r
+ 1F1F1C1F1F1F1F23232E2E292E3838383B3B3E3E3E3B3B383B3B382F231F1C18\r
+ 130B00198BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 98441000131B292F384755696E707170707173716F7171706E60605D55554F3B\r
+ 383838382E2E292E2E29292E2E38383838382F2E2E3B413B3E42424242423B3B\r
+ 3B3B3E423B2E2F231F1C1B1918161300000F58C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C55810000010181C1F232E3B4248\r
+ 555B69706F7071716E605D6969696E5D5655565D5B4F494F5049474747474742\r
+ 4242424242484742413E3F473E383B3B382E292E231F1C1B1816131000000000\r
+ 208B98C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5A007441000000010181B1B1C29383841484F5C5C50505C695D5D6A69\r
+ 5C5D5D5D5C565B5C564F4849494948473F3F4249423E3E3E413B2F2F2E292E23\r
+ 1F1B1B19161613130F0000000016C00798C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C58335100000000B\r
+ 1016191B1B1C1C1C2329383E4147484247484850504947474847474747483E38\r
+ 3B3838382F2E2323231F1B1B1C1B18161310100B0B00000000105783C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5A08BC01E00000000000F13161616191B1B1B1C1C\r
+ 1B1C23231F1F232323231F1F1F231F1C1C1B1B1B1B1916161616131313100000\r
+ 000000000019C0889DC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C58874571900000000000000000F1010101313101013131010161610101313\r
+ 100F0B0B0B0B00000000000000000018537E07C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50780C03D20161310\r
+ 000000000000000000000000000000000000000B101016182C577688C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C58C8B88807E7266643D3233323232363D4458\r
+ 6772767E808BC5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C50000C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5C5\r
+ 0000}\r
+ Transparent = True\r
+ end\r
+ end\r
+ object Memo2: TMemo\r
+ Left = 40\r
+ Top = 200\r
+ Width = 177\r
+ Height = 41\r
+ Lines.Strings = (\r
+ 'Memo2')\r
+ TabOrder = 3\r
+ end\r
+ object CheckBox6: TCheckBox\r
+ Left = 176\r
+ Top = 88\r
+ Width = 129\r
+ Height = 17\r
+ Caption = 'Send as screen saver'\r
+ TabOrder = 4\r
+ end\r
+ end\r
+ end\r
+ object CalendarSMSTabSheet: TTabSheet\r
+ Caption = 'CalendarSMSTabSheet'\r
+ ImageIndex = 2\r
+ object GroupBox5: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ Caption = 'Calendar entry'\r
+ TabOrder = 0\r
+ object Label13: TLabel\r
+ Left = 56\r
+ Top = 48\r
+ Width = 87\r
+ Height = 13\r
+ Caption = 'TODO:Description'\r
+ end\r
+ end\r
+ end\r
+ object RingtoneSMSTabSheet: TTabSheet\r
+ Caption = 'RingtoneSMSTabSheet'\r
+ ImageIndex = 3\r
+ object GroupBox4: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ Caption = 'Ringtone'\r
+ TabOrder = 0\r
+ object Label12: TLabel\r
+ Left = 48\r
+ Top = 56\r
+ Width = 87\r
+ Height = 13\r
+ Caption = 'TODO:Description'\r
+ end\r
+ end\r
+ end\r
+ object PBKSMSTabSheet: TTabSheet\r
+ Caption = 'PBKSMSTabSheet'\r
+ ImageIndex = 4\r
+ object GroupBox6: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ Caption = 'Phonebook entry'\r
+ TabOrder = 0\r
+ object Label11: TLabel\r
+ Left = 48\r
+ Top = 64\r
+ Width = 87\r
+ Height = 13\r
+ Caption = 'TODO:Description'\r
+ end\r
+ object ComboBox8: TComboBox\r
+ Left = 40\r
+ Top = 24\r
+ Width = 161\r
+ Height = 21\r
+ ItemHeight = 13\r
+ ItemIndex = 0\r
+ TabOrder = 0\r
+ Text = 'Version 1.0'\r
+ Items.Strings = (\r
+ 'Version 1.0'\r
+ 'Version 2.1')\r
+ end\r
+ end\r
+ end\r
+ object WAPBookTabSheet: TTabSheet\r
+ Caption = 'WAPBookTabSheet'\r
+ ImageIndex = 5\r
+ object GroupBox7: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ Caption = 'WAP Bookmark'\r
+ TabOrder = 0\r
+ end\r
+ end\r
+ object WAPSettTabSheet: TTabSheet\r
+ Caption = 'WAPSettTabSheet'\r
+ ImageIndex = 6\r
+ object GroupBox8: TGroupBox\r
+ Left = 0\r
+ Top = 0\r
+ Width = 305\r
+ Height = 238\r
+ Align = alClient\r
+ Caption = 'WAP Settings'\r
+ TabOrder = 0\r
+ end\r
+ end\r
+ end\r
+ object RadioGroup1: TRadioGroup\r
+ Left = 8\r
+ Top = 8\r
+ Width = 305\r
+ Height = 57\r
+ Caption = ' What do you want to do ? '\r
+ ItemIndex = 0\r
+ Items.Strings = (\r
+ 'Save SMS'\r
+ 'Send SMS')\r
+ TabOrder = 5\r
+ OnClick = RadioGroup1Click\r
+ end\r
+ object Edit3: TEdit\r
+ Left = 384\r
+ Top = 80\r
+ Width = 201\r
+ Height = 21\r
+ TabOrder = 8\r
+ end\r
+ object ComboBox9: TComboBox\r
+ Left = 384\r
+ Top = 48\r
+ Width = 201\r
+ Height = 21\r
+ ItemHeight = 13\r
+ TabOrder = 9\r
+ end\r
+end\r
--- /dev/null
+unit SMSEdit;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls,MainUnit,GnokiiAPI, ExtCtrls, ComCtrls;\r
+\r
+type\r
+ TSMSEditForm = class(TForm)\r
+ GroupBox1: TGroupBox;\r
+ ComboBox1: TComboBox;\r
+ Label1: TLabel;\r
+ Memo1: TMemo;\r
+ Label2: TLabel;\r
+ Label3: TLabel;\r
+ CheckBox1: TCheckBox;\r
+ Button1: TButton;\r
+ CheckBox2: TCheckBox;\r
+ Button3: TButton;\r
+ Edit1: TEdit;\r
+ GroupBox2: TGroupBox;\r
+ ComboBox2: TComboBox;\r
+ Label4: TLabel;\r
+ ComboBox3: TComboBox;\r
+ Label5: TLabel;\r
+ Label6: TLabel;\r
+ ComboBox4: TComboBox;\r
+ RadioGroup1: TRadioGroup;\r
+ CheckBox3: TCheckBox;\r
+ CheckBox4: TCheckBox;\r
+ ComboBox5: TComboBox;\r
+ SMSEditPageControl: TPageControl;\r
+ TextSMSTabSheet: TTabSheet;\r
+ Label7: TLabel;\r
+ BitmapSMSTabSheet: TTabSheet;\r
+ CalendarSMSTabSheet: TTabSheet;\r
+ RingtoneSMSTabSheet: TTabSheet;\r
+ Label8: TLabel;\r
+ ComboBox6: TComboBox;\r
+ GroupBox3: TGroupBox;\r
+ Label9: TLabel;\r
+ ComboBox7: TComboBox;\r
+ Label10: TLabel;\r
+ CheckBox5: TCheckBox;\r
+ ScrollBox1: TScrollBox;\r
+ Image1: TImage;\r
+ GroupBox4: TGroupBox;\r
+ Memo2: TMemo;\r
+ CheckBox6: TCheckBox;\r
+ GroupBox5: TGroupBox;\r
+ PBKSMSTabSheet: TTabSheet;\r
+ GroupBox6: TGroupBox;\r
+ Label11: TLabel;\r
+ Label12: TLabel;\r
+ Label13: TLabel;\r
+ ComboBox8: TComboBox;\r
+ Label14: TLabel;\r
+ Edit3: TEdit;\r
+ WAPBookTabSheet: TTabSheet;\r
+ WAPSettTabSheet: TTabSheet;\r
+ GroupBox7: TGroupBox;\r
+ GroupBox8: TGroupBox;\r
+ ComboBox9: TComboBox;\r
+ procedure Button3Click(Sender: TObject);\r
+ procedure Memo1Change(Sender: TObject);\r
+ procedure Button1Click(Sender: TObject);\r
+ procedure RadioGroup1Click(Sender: TObject);\r
+ procedure FormShow(Sender: TObject);\r
+ procedure ComboBox2Change(Sender: TObject);\r
+ procedure ComboBox5Change(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ SMSEditForm: TSMSEditForm;\r
+ maxlength:integer;\r
+\r
+implementation\r
+\r
+{$R *.dfm}\r
+\r
+procedure TSMSEditForm.Button3Click(Sender: TObject);\r
+begin\r
+ SMSEditForm.Close;\r
+end;\r
+\r
+procedure TSMSEditForm.Memo1Change(Sender: TObject);\r
+begin\r
+ GroupBox1.Caption:='Text ' + inttostr(Memo1.GetTextLen)+'/'+inttostr(maxlength);\r
+end;\r
+\r
+procedure TSMSEditForm.Button1Click(Sender: TObject);\r
+var\r
+ p,i,j:integer;\r
+ z:integer;\r
+ w:word;\r
+ unicode,screensaver:integer;\r
+ smstext:array[1..500] of char;\r
+begin\r
+ if (SMSEditPageControl.ActivePage=TextSMSTabSheet) then\r
+ begin\r
+ z:=GSM_Coding_Default;\r
+ case combobox5.ItemIndex of\r
+ 0: z:=GSM_Coding_Default;\r
+ 1: z:=GSM_Coding_Unicode;\r
+ end;\r
+\r
+ for i:=1 to 500 do\r
+ smstext[i]:=chr(0);\r
+ w:=strlen(pchar(SMSEditForm.Memo1.Text));\r
+ for i:=1 to w do\r
+ smstext[i]:=SMSEditForm.Memo1.Text[i];\r
+\r
+ GSM_MakeMultiPartSMS2(@setsms,@smstext,w,GSM_NoUDH,z);\r
+\r
+ for i:=1 to setsms.number do\r
+ begin\r
+ if CheckBox1.Checked then\r
+ setsms.sms[i].Class2 := 0\r
+ else\r
+ setsms.sms[i].Class2 := -1;\r
+ end;\r
+\r
+ setsms.sms[1].location:=setsmslocation;\r
+ end;\r
+ if (SMSEditPageControl.ActivePage=BitmapSMSTabSheet) then\r
+ begin\r
+ unicode:=0;\r
+ screensaver:=0;\r
+ if bitma.type2=GSM_PictureImage then\r
+ begin\r
+ for i:=1 to 256 do\r
+ bitma.text[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Memo2.text)) do\r
+ bitma.text[i]:=Memo2.Text[i];\r
+ end;\r
+ GSM_SaveBitmapToSMS(@setsms,@bitma,unicode,screensaver);\r
+ end;\r
+ if (SMSEditPageControl.ActivePage=RingtoneSMSTabSheet) then\r
+ begin\r
+ GSM_SaveRingtoneToSMS(@setsms,@rington,1);\r
+ end;\r
+ if (SMSEditPageControl.ActivePage=WAPBookTabSheet) then\r
+ begin\r
+ GSM_SaveWAPBookmarkToSMS(@setsms,@bookma);\r
+ end;\r
+ if (SMSEditPageControl.ActivePage=WAPSettTabSheet) then\r
+ begin\r
+ GSM_SaveWAPSettingsToSMS(@setsms,@wapset);\r
+ end;\r
+ if (SMSEditPageControl.ActivePage=CalendarSMSTabSheet) then\r
+ begin\r
+ GSM_SaveCalendarNoteToSMS(@setsms,@calenda);\r
+ end;\r
+ if (SMSEditPageControl.ActivePage=PBKSMSTabSheet) then\r
+ begin\r
+ i:=10;\r
+ case ComboBox8.ItemIndex of\r
+ 0:i:=10;\r
+ 1:i:=21;\r
+ end;\r
+ GSM_SavePhonebookEntryToSMS(@setsms,@pbk,i);\r
+ end;\r
+\r
+ for z:=1 to setsms.number do\r
+ begin\r
+ for i:=1 to 40 do\r
+ setsms.sms[z].MessageCenter.number[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(Edit1.text)) do\r
+ setsms.sms[z].MessageCenter.number[i]:=Edit1.Text[i];\r
+ setsms.sms[z].MessageCenter.No := ComboBox2.ItemIndex;\r
+ setsms.sms[z].Validity := 4320; //do it\r
+\r
+ for i:=1 to 41 do\r
+ setsms.sms[z].destination[i]:=chr(0);\r
+ if (ComboBox9.ItemIndex=-1) then\r
+ begin\r
+ for i:=1 to strlen(pchar(ComboBox9.text)) do\r
+ setsms.sms[z].destination[i]:=ComboBox9.Text[i];\r
+ end else\r
+ begin\r
+ ReadPBKOffline;\r
+ for p:=1 to PBKOfflineNumber do\r
+ begin\r
+ MainForm.Label16.Caption:=PhoneBackup.PhonePhonebook[p].Name;\r
+ if (MainForm.Label16.Caption=ComboBox9.Text) then\r
+ begin\r
+ if (PhoneBackup.PhonePhonebook[p].Number[1]<>chr(0)) then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[p].Number;\r
+ for i:=1 to strlen(pchar(MainForm.Label14.Caption)) do\r
+ setsms.sms[z].destination[i]:=PhoneBackup.PhonePhonebook[p].Number[i];\r
+ end else\r
+ begin\r
+ for j:=1 to PhoneBackup.PhonePhonebook[p].SubEntriesCount do\r
+ begin\r
+ if PhoneBackup.PhonePhonebook[p].SubEntries[j].EntryType=GSM_Number then\r
+ begin\r
+ MainForm.Label14.Caption:=PhoneBackup.PhonePhonebook[p].SubEntries[j].Number;\r
+ for i:=1 to strlen(pchar(MainForm.Label14.Caption)) do\r
+ setsms.sms[z].destination[i]:=PhoneBackup.PhonePhonebook[p].SubEntries[j].Number[i];\r
+ break;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ setsms.sms[z].folder:=combobox1.ItemIndex;\r
+\r
+ setsms.sms[z].Type2 := GST_SMS;\r
+ //delivery report\r
+ if CheckBox2.Checked then\r
+ begin\r
+ if RadioGroup1.ItemIndex=1 then setsms.sms[z].Type2:= GST_DR;\r
+ end;\r
+\r
+ for i:=1 to 26 do\r
+ setsms.sms[z].name[i]:=chr(0);\r
+ for i:=1 to strlen(pchar(SMSEditForm.edit3.Text)) do\r
+ setsms.sms[z].name[i]:=SMSEditForm.edit3.Text[i];\r
+\r
+ //read/unread\r
+ if Checkbox4.Checked then\r
+ setsms.sms[z].status:=GSS_SENTREAD\r
+ else\r
+ setsms.sms[z].status:=GSS_NOTSENTREAD;\r
+\r
+ if CheckBox3.Checked then\r
+ setsms.sms[z].ReplyViaSameSMSC := 1\r
+ else\r
+ setsms.sms[z].ReplyViaSameSMSC := 0;\r
+ end;\r
+\r
+ if Application.MessageBox(pchar('Do you want to save/send '+inttostr(setsms.number)+' sms ?'),'question',MB_YESNO)=IDYES then\r
+ begin\r
+ if (RadioGroup1.itemindex=0) then\r
+ begin\r
+ for z:=1 to setsms.number do\r
+ begin\r
+ GSM_SaveSMSMessage(@setsms.sms[z]);\r
+ end;\r
+ end else\r
+ begin\r
+ for z:=1 to setsms.number do\r
+ begin\r
+ GSM_SendSMSMessage(@setsms.sms[z]);\r
+ end;\r
+ end;\r
+ end;\r
+\r
+ MainForm.SMSTabSheetShow(nil);\r
+\r
+ SMSEditForm.Close;\r
+end;\r
+\r
+procedure TSMSEditForm.RadioGroup1Click(Sender: TObject);\r
+begin\r
+ case RadioGroup1.ItemIndex of\r
+ 0:begin\r
+ ComboBox1.Enabled:=true;\r
+ CheckBox2.Enabled:=false;\r
+ CheckBox4.Enabled:=true;\r
+ ComboBox3.Enabled:=false;\r
+ ComboBox4.Enabled:=false;\r
+ Label14.Enabled:=true;\r
+ edit3.Enabled:=true;\r
+ end;\r
+ 1:begin\r
+ ComboBox1.Enabled:=false;\r
+ CheckBox2.Enabled:=true;\r
+ CheckBox4.Enabled:=false;\r
+ Label14.Enabled:=false;\r
+ edit3.Enabled:=false;\r
+ if ComboBox2.ItemIndex<>0 then\r
+ begin\r
+ ComboBox3.Enabled:=false;\r
+ ComboBox4.Enabled:=false;\r
+ end else\r
+ begin\r
+ ComboBox3.Enabled:=true;\r
+ ComboBox4.Enabled:=true;\r
+ end;\r
+ end;\r
+ end;\r
+ if ComboBox2.ItemIndex<>0 then\r
+ begin\r
+ Edit1.Enabled:=false;\r
+ end else\r
+ begin\r
+ Edit1.Enabled:=true;\r
+ end;\r
+end;\r
+\r
+procedure TSMSEditForm.FormShow(Sender: TObject);\r
+begin\r
+ RadioGroup1Click(nil);\r
+ ComboBox5Change(nil);\r
+// ScrollBox1.VertScrollBar.Visible:=true;\r
+ ScrollBox1.VertScrollBar.Position:=80;\r
+// ScrollBox1.VertScrollBar.Visible:=false;\r
+end;\r
+\r
+procedure TSMSEditForm.ComboBox2Change(Sender: TObject);\r
+begin\r
+ if ComboBox2.ItemIndex<>0 then\r
+ begin\r
+ SetSMSC(ComboBox2.ItemIndex);\r
+ end;\r
+ RadioGroup1Click(nil);\r
+end;\r
+\r
+procedure TSMSEditForm.ComboBox5Change(Sender: TObject);\r
+begin\r
+ case ComboBox5.ItemIndex of\r
+ 0:maxlength:=160;\r
+ 1:maxlength:=70;\r
+ end;\r
+ Memo1.MaxLength:=maxlength;\r
+ Memo1Change(nil);\r
+end;\r
+\r
+end.\r
--- /dev/null
+object WAPBookForm: TWAPBookForm\r
+ Left = 215\r
+ Top = 152\r
+ BorderIcons = [biSystemMenu]\r
+ BorderStyle = bsSingle\r
+ Caption = 'Edit WAP Bookmark'\r
+ ClientHeight = 78\r
+ ClientWidth = 369\r
+ Color = clBtnFace\r
+ Font.Charset = DEFAULT_CHARSET\r
+ Font.Color = clWindowText\r
+ Font.Height = -11\r
+ Font.Name = 'MS Sans Serif'\r
+ Font.Style = []\r
+ OldCreateOrder = False\r
+ PixelsPerInch = 96\r
+ TextHeight = 13\r
+ object Label1: TLabel\r
+ Left = 8\r
+ Top = 16\r
+ Width = 31\r
+ Height = 13\r
+ Caption = 'Name:'\r
+ end\r
+ object Label2: TLabel\r
+ Left = 8\r
+ Top = 48\r
+ Width = 25\r
+ Height = 13\r
+ Caption = 'URL:'\r
+ end\r
+ object Button1: TButton\r
+ Left = 280\r
+ Top = 8\r
+ Width = 81\r
+ Height = 25\r
+ Caption = '&OK'\r
+ TabOrder = 0\r
+ OnClick = Button1Click\r
+ end\r
+ object Button2: TButton\r
+ Left = 280\r
+ Top = 40\r
+ Width = 81\r
+ Height = 25\r
+ Caption = '&Cancel'\r
+ TabOrder = 1\r
+ OnClick = Button2Click\r
+ end\r
+ object Edit1: TEdit\r
+ Left = 56\r
+ Top = 8\r
+ Width = 193\r
+ Height = 21\r
+ TabOrder = 2\r
+ end\r
+ object Edit2: TEdit\r
+ Left = 56\r
+ Top = 40\r
+ Width = 193\r
+ Height = 21\r
+ TabOrder = 3\r
+ end\r
+end\r
--- /dev/null
+unit wapbook;\r
+\r
+interface\r
+\r
+uses\r
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,\r
+ Dialogs, StdCtrls, GnokiiAPI;\r
+\r
+type\r
+ TWAPBookForm = class(TForm)\r
+ Button1: TButton;\r
+ Button2: TButton;\r
+ Label1: TLabel;\r
+ Edit1: TEdit;\r
+ Label2: TLabel;\r
+ Edit2: TEdit;\r
+ procedure Button2Click(Sender: TObject);\r
+ procedure Button1Click(Sender: TObject);\r
+ private\r
+ { Private declarations }\r
+ public\r
+ { Public declarations }\r
+ end;\r
+\r
+var\r
+ WAPBookForm: TWAPBookForm;\r
+\r
+implementation\r
+\r
+uses MainUnit;\r
+\r
+{$R *.dfm}\r
+\r
+procedure TWAPBookForm.Button2Click(Sender: TObject);\r
+begin\r
+ WAPBookForm.Close;\r
+end;\r
+\r
+procedure TWAPBookForm.Button1Click(Sender: TObject);\r
+var i:integer;\r
+ book:GSM_WAPBookmark;\r
+begin\r
+ for i:=1 to 256 do book.adress[i]:=chr(0);\r
+ for i:=1 to 51 do book.title[i]:=chr(0);\r
+\r
+ for i:=1 to strlen(pchar(Edit1.text)) do\r
+ book.title[i]:=Edit1.Text[i];\r
+ for i:=1 to strlen(pchar(Edit2.text)) do\r
+ book.adress[i]:=Edit2.Text[i];\r
+\r
+ book.location:=bookmarknum2;\r
+ \r
+ MainForm.Timer2.enabled:=false;\r
+ GSM_SetWAPBookmark(@book);\r
+ MainForm.Timer2.enabled:=true;\r
+\r
+ MainForm.WAPBookTabSheetShow(nil);\r
+\r
+ WAPBookForm.Close;\r
+end;\r
+\r
+end.\r
--- /dev/null
+var WSHShell = WScript.CreateObject("WScript.Shell");\r
+var strArguments = WScript.Arguments;\r
+\r
+if (strArguments.length==1)\r
+{\r
+ var fs=WScript.CreateObject("Scripting.FileSystemObject");\r
+\r
+ var readline='';\r
+\r
+ var f=fs.GetFile("../../version");\r
+ var fs2=f.OpenAsTextStream(1,0);\r
+ readline=fs2.ReadLine();\r
+ fs2.close();\r
+\r
+ fs.CreateTextFile("mversion.h");\r
+\r
+ var f=fs.GetFile("mversion.h");\r
+ var fs2=f.OpenAsTextStream(2,0);\r
+ fs2.WriteLine('#ifndef __mversion_h');\r
+ fs2.WriteLine('#define __mversion_h');\r
+ fs2.WriteLine('#define VERSION \"'+readline+'\"');\r
+ fs2.WriteLine('#endif');\r
+ fs2.close();\r
+} else\r
+{\r
+ WScript.Echo("Do not use this file !");\r
+}\r
+\r
--- /dev/null
+#include <stdlib.h>
+#include <fcntl.h>
+#include <signal.h>
+#include <sys/types.h>
+#include <string.h>
+#include <gtk/gtk.h>
+#include <stdio.h>
+#include <assert.h>
+
+#include "misc.h"
+#include "gsm-common.h"
+#include "gsm-api.h"
+#include "gsm-ringtones.h"
+
+#include "xgnokii_xring.h"
+#include "xgnokii_common.h"
+#include "xgnokii_lowlevel.h"
+#include "xgnokii.h"
+
+#include "xpm/Send.xpm"
+
+static GtkWidget *GUI_RingtonesWindow;
+
+GtkWidget * blacks[WHITE_COUNT - 1];
+GtkWidget * whites[WHITE_COUNT];
+
+int pressed;
+
+PixmapAndMask pam[KIE_COUNT];
+
+GSM_Ringtone ringtone;
+
+char xwhi[] = { 6, 4, 2, 6, 4, 4, 2 };
+
+/* Bitmaps for keyboard */
+static
+ char * blackparts[] = {
+ ".+@@@@@@@@@@@@+.",
+ "+.+@@@@@@@@@@+.+",
+ "@+.+@@@@@@@@+.+@",
+ "@@+.+@@@@@@+.+@@",
+ "@@@+........+@@@",
+ "@@@@........@@@@"
+ };
+
+static
+ char * whitestarts[][3] = {
+ { " ++++++++++++++++",
+ " +..............+",
+ "+++++++++..............+" },
+ {
+ " ++++++++ ",
+ " +......+ ",
+ "+++++++++......+++++++++" },
+ {
+ "++++++++++++++++ ",
+ "+..............+ ",
+ "+..............+++++++++" }};
+
+
+static
+ char * whiteend[] = {
+ "+......................+",
+ "+@....................@+",
+ "+@@..................@@+",
+ "++@@@..............@@@++",
+ "++++++++++++++++++++++++"
+ };
+
+static inline void CloseRingtonesWindow (void) {
+ gtk_widget_hide(GUI_RingtonesWindow);
+}
+
+static GtkItemFactoryEntry ringtonesMenuItems[] = {
+ { NULL, NULL, NULL, 0, "<Branch>"},
+ { NULL, "<control>O", NULL, 0, NULL},
+ { NULL, "<control>S", NULL, 0, NULL},
+ { NULL, NULL, NULL, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>T", NULL, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Separator>"},
+ { NULL, "<control>C", CloseRingtonesWindow, 0, NULL},
+ { NULL, NULL, NULL, 0, "<Branch>"},
+ { NULL, "<control>S", NULL, 0, NULL},
+ { NULL, "<control>H", NULL, 0, NULL},
+};
+
+static void InitRingtonesMenu (void) {
+ ringtonesMenuItems[0].path = g_strdup(_("/_File"));
+ ringtonesMenuItems[1].path = g_strdup(_("/File/_Open"));
+ ringtonesMenuItems[2].path = g_strdup(_("/File/_Save"));
+ ringtonesMenuItems[3].path = g_strdup(_("/File/Save _as ..."));
+ ringtonesMenuItems[4].path = g_strdup(_("/File/Sep1"));
+ ringtonesMenuItems[5].path = g_strdup(_("/File/Se_t ringtone"));
+ ringtonesMenuItems[6].path = g_strdup(_("/File/Sep2"));
+ ringtonesMenuItems[7].path = g_strdup(_("/File/_Close"));
+ ringtonesMenuItems[8].path = g_strdup(_("/_Edit"));
+ ringtonesMenuItems[9].path = g_strdup(_("/Edit/_Set ringtone name"));
+ ringtonesMenuItems[10].path = g_strdup(_("/Edit/S_how in Composer"));
+}
+
+/* Add created pixmap to widget */
+static int createpixmap(GtkWidget * widget, PixmapAndMask * pam, char ** a)
+{
+ GtkStyle * style = gtk_widget_get_default_style();
+ pam->pixmap = gdk_pixmap_create_from_xpm_d(widget->window,
+ &pam->mask,
+ &style->bg[GTK_STATE_NORMAL],
+ a);
+ return (int)pam->pixmap; /* (to) NULL or not (to) NULL */
+}
+
+static void writecolors(char * buf0, char * col0,
+ char * buf1, char * col1,
+ char * buf2, char * col2)
+{
+ sprintf(buf0, ". c #%s", col0);
+ sprintf(buf1, "+ c #%s", col1);
+ sprintf(buf2, "@ c #%s", col2);
+}
+
+/* Creates white pixmap in the keyboard */
+int KeyboardCreateWhitePixmap(GtkWidget * window, PixmapAndMask * pam,
+ char * start[], char * color0, char * color1, char * color2)
+{
+ int i = 0, j = 0;
+ char * a[160 + 5];
+ char col0[20];
+ char col1[20];
+ char col2[20];
+
+ a[i++] = "24 160 4 1";
+ a[i++] = " c None";
+ writecolors(col0, color0, col1, color1, col2, color2);
+ a[i++] = col0;
+ a[i++] = col1;
+ a[i++] = col2;
+
+ a[i++] = start[0];
+ for (j = 0; j < 99; j++)
+ a[i++] = start[1];
+ a[i++] = start[2];
+
+ for (j = 0; j < 54; j++)
+ a[i++] = whiteend[0];
+
+ a[i++] = whiteend[1];
+ a[i++] = whiteend[1];
+ a[i++] = whiteend[2];
+ a[i++] = whiteend[3];
+ a[i++] = whiteend[4];
+
+ assert(i == 165);
+
+ return createpixmap(window, pam, a);
+
+}
+
+/* Creates black pixmap in the keyboard */
+int KeyboardCreateBlackPixmap(GtkWidget * window, PixmapAndMask * pam,
+ char * color0, char * color1, char * color2)
+{
+ int i = 0, j = 0;
+ char * a[160 + 4];
+ char col0[20];
+ char col1[20];
+ char col2[20];
+
+ a[i++] = "16 100 3 1";
+ writecolors(col0, color0, col1, color1, col2, color2);
+ a[i++] = col0;
+ a[i++] = col1;
+ a[i++] = col2;
+
+ for (j = 0; j < 5; j++) a[i++] = blackparts[j];
+ for (j = 0; j < 90; j++) a[i++] = blackparts[5];
+ for (j = 4; j >= 0; j--) a[i++] = blackparts[j];
+
+ assert(i == 104);
+
+ return createpixmap(window, pam, a);
+}
+
+static void KeyboardSetPixmap(int flag)
+{
+ int i = pressed & ~(BLACK_PRESSED|WHITE_PRESSED);
+ int j;
+
+ if (pressed & BLACK_PRESSED)
+ {
+ j = flag? KIE_BLACKSEL: KIE_BLACK;
+ gtk_pixmap_set(GTK_PIXMAP(blacks[i]),pam[j].pixmap, pam[j].mask);
+ }
+ else
+ {
+ j = xwhi[i % 7] + (flag? 1: 0);
+ gtk_pixmap_set(GTK_PIXMAP(whites[i]),pam[j].pixmap, pam[j].mask);
+ }
+}
+
+static void KeyboardSendTune()
+{
+ /* frequencies generated with:
+ perl -e 'print int(4400 * (2 **($_/12)) + .5)/10, "\n" for(3..14)'
+ */
+ struct {
+ float wf;
+ float bf;
+ } notefreq[7] = {
+ { 523.3, 554.4 }, //C
+ { 587.3, 622.3 }, //D
+ { 659.3, 0 }, //E
+ { 698.5, 740 }, //F
+ { 784 , 830.6 }, //G
+ { 880 , 932.3 }, //A
+ { 987.8, 0 } //H
+ };
+
+ int i=pressed;
+
+ int j, r;
+ float freq;
+
+ if (i) {
+ j = (i & BLACK_PRESSED)? 1: 0;
+
+ i &= ~(BLACK_PRESSED|WHITE_PRESSED);
+
+ freq = j? notefreq[i % 7].bf: notefreq[i % 7].wf;
+
+ switch (i / 7)
+ {
+ case 0: r = (int)(freq / 2.0); break;
+ case 2: r = (int)(freq * 2.0); break;
+ default: r = (int)(freq); break;
+ }
+
+ GSM->PlayTone(r,100);
+
+ } else {
+
+ GSM->PlayTone(0,0);
+
+ }
+}
+
+/* One drawn key was released */
+static gint KeyboardButtonRelease(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ KeyboardSetPixmap(FALSE);
+
+ pressed = 0;
+
+ KeyboardSendTune();
+
+ return TRUE;
+}
+
+/* One drawn key was pressed */
+static gint KeyboardButtonPress(GtkWidget *widget, GdkEvent *event, gpointer data)
+{
+ GdkEventButton * e = (GdkEventButton *)event;
+ int i;
+
+ if (!pressed)
+ {
+ guint x = e->x;
+ guint y = e->y;
+
+ if (y < 100) /* possible black pressed... */
+ for ( i = 0; i < WHITE_COUNT - 1; i++)
+ if (blacks[i] && x - 16 - 24 * i < 16)
+ {
+ pressed = i | BLACK_PRESSED;
+ KeyboardSetPixmap(TRUE);
+ KeyboardSendTune();
+ return TRUE;
+ }
+ for ( i = 0; i < WHITE_COUNT; i++) /* whites ? */
+ if (x - 24 * i < 24)
+ {
+ pressed = i | WHITE_PRESSED;
+ KeyboardSetPixmap(TRUE);
+ KeyboardSendTune();
+ return TRUE;
+ }
+ }
+ return TRUE;
+}
+
+void GUI_CreateRingtonesWindow (void)
+{
+ int nMenuItems = sizeof (ringtonesMenuItems) / sizeof (ringtonesMenuItems[0]);
+ GtkAccelGroup *accelGroup;
+ GtkItemFactory *itemFactory;
+ GtkWidget *menuBar;
+ GtkWidget *vbox;
+ GtkWidget *hbox, *hbox2;
+ GtkWidget *melody;
+ GtkWidget *buttons, *buttons2;
+ GtkWidget *separator;
+ GtkWidget *toolBar;
+ GtkWidget *label, *note1, *note2, *note3, *note4, *note5;
+ GtkWidget *label2, *button, *button2, *button3, *button4, *button5,
+ *button6, *button7, *button8, *button9, *button10, *button11, *button12;
+
+ GtkWidget *keyboard;
+
+ int i;
+
+ InitRingtonesMenu();
+
+ /* realize top level window for logos */
+ GUI_RingtonesWindow = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_policy(GTK_WINDOW(GUI_RingtonesWindow),1,1,1);
+ gtk_window_set_title(GTK_WINDOW(GUI_RingtonesWindow),_("Ringtones"));
+ gtk_signal_connect(GTK_OBJECT(GUI_RingtonesWindow),"delete_event",
+ GTK_SIGNAL_FUNC(DeleteEvent),NULL);
+ gtk_widget_set_usize(GUI_RingtonesWindow,630,320);
+ gtk_widget_realize(GUI_RingtonesWindow);
+
+ accelGroup = gtk_accel_group_new();
+ gtk_accel_group_attach(accelGroup,GTK_OBJECT(GUI_RingtonesWindow));
+
+ /* create main vbox */
+ vbox = gtk_vbox_new(FALSE,1);
+ gtk_container_add(GTK_CONTAINER(GUI_RingtonesWindow),vbox);
+ gtk_widget_show(vbox);
+
+ itemFactory = gtk_item_factory_new(GTK_TYPE_MENU_BAR,"<main>",accelGroup);
+ gtk_item_factory_create_items(itemFactory,nMenuItems,ringtonesMenuItems,NULL);
+ menuBar = gtk_item_factory_get_widget(itemFactory,"<main>");
+
+ gtk_box_pack_start(GTK_BOX(vbox),menuBar,FALSE,FALSE,0);
+ gtk_widget_show(menuBar);
+
+ /* toolbar */
+ toolBar = gtk_toolbar_new(GTK_ORIENTATION_HORIZONTAL,GTK_TOOLBAR_ICONS);
+ gtk_toolbar_set_button_relief(GTK_TOOLBAR(toolBar),GTK_RELIEF_NORMAL);
+ gtk_toolbar_set_style(GTK_TOOLBAR(toolBar),GTK_TOOLBAR_ICONS);
+
+ gtk_toolbar_append_item(GTK_TOOLBAR(toolBar),NULL,"Set ringtone",NULL,
+ NewPixmap(Send_xpm,GUI_RingtonesWindow->window,
+ &GUI_RingtonesWindow->style->bg[GTK_STATE_NORMAL]),
+ (GtkSignalFunc)NULL,toolBar);
+
+ gtk_box_pack_start(GTK_BOX(vbox),toolBar,FALSE,FALSE,0);
+ gtk_widget_show(toolBar);
+
+ /* vertical separator */
+ separator = gtk_hseparator_new();
+ gtk_box_pack_start(GTK_BOX(vbox),GTK_WIDGET(separator),FALSE,FALSE,0);
+
+ /* Melody drawing area */
+ melody = gtk_drawing_area_new();
+ gtk_drawing_area_size(GTK_DRAWING_AREA(melody), 20,100);
+
+ gtk_box_pack_start(GTK_BOX(vbox),melody,FALSE,FALSE,0);
+ gtk_widget_show(melody);
+
+ /* create horizontal box for keyboard and buttons area */
+ hbox = gtk_hbox_new(FALSE,5);
+ gtk_box_pack_start(GTK_BOX(vbox),hbox,FALSE,FALSE,0);
+ gtk_widget_show(hbox);
+
+ /* Box for buttons */
+ hbox2 = gtk_hbox_new(FALSE,5);
+ gtk_box_pack_start(GTK_BOX(hbox),hbox2,FALSE,FALSE,0);
+ gtk_widget_set_usize( hbox2, 120, 160 );
+ gtk_widget_show(hbox2);
+
+ /* Buttons with notes length */
+ buttons = gtk_vbox_new(FALSE,3);
+ gtk_box_pack_start(GTK_BOX(hbox2),buttons,FALSE,FALSE,0);
+
+ label = gtk_label_new (_("Length"));
+ gtk_box_pack_start (GTK_BOX(buttons), label, FALSE, FALSE, 3);
+
+ note1 = gtk_radio_button_new_with_label (NULL, _("1"));
+ gtk_box_pack_end (GTK_BOX (buttons), note1, TRUE, FALSE, 2);
+ gtk_widget_show (note1);
+
+ note2 = gtk_radio_button_new_with_label (NULL, _("1/2"));
+ gtk_box_pack_end (GTK_BOX (buttons), note2, TRUE, FALSE, 2);
+ gtk_widget_show (note2);
+
+ note3 = gtk_radio_button_new_with_label (NULL, _("1/4"));
+ gtk_box_pack_end (GTK_BOX (buttons), note3, TRUE, FALSE, 2);
+ gtk_widget_show (note3);
+ gtk_widget_show(buttons);
+
+ note4 = gtk_radio_button_new_with_label (NULL, _("1/16"));
+ gtk_box_pack_end (GTK_BOX (buttons), note4, TRUE, FALSE, 2);
+ gtk_widget_show (note4);
+
+ note5 = gtk_radio_button_new_with_label (NULL, _("1/32"));
+ gtk_box_pack_end (GTK_BOX (buttons), note5, TRUE, FALSE, 2);
+ gtk_widget_show (note5);
+
+ gtk_widget_show (buttons);
+
+ /* Buttons with notes length */
+ buttons2 = gtk_vbox_new(FALSE,3);
+ gtk_box_pack_start(GTK_BOX(hbox2),buttons2,FALSE,FALSE,0);
+
+ label2 = gtk_label_new (_("Note"));
+ gtk_box_pack_start (GTK_BOX(buttons2), label2, FALSE, FALSE, 3);
+
+ button = gtk_button_new_with_label (_("C"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button);
+
+ button3 = gtk_button_new_with_label (_("D"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button3, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button3);
+ gtk_widget_show (button);
+
+ button5 = gtk_button_new_with_label (_("E"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button5, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button5);
+
+ button6 = gtk_button_new_with_label (_("F"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button6, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button6);
+
+ button8 = gtk_button_new_with_label (_("G"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button8, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button8);
+
+ button10 = gtk_button_new_with_label (_("A"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button10, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button10);
+
+ button12 = gtk_button_new_with_label (_("H"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button12, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button12);
+
+ gtk_widget_show (label2);
+
+ button2 = gtk_button_new_with_label (_("Cis"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button2, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button2);
+
+ button4 = gtk_button_new_with_label (_("Dis"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button4, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button4);
+
+ button7 = gtk_button_new_with_label (_("Fis"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button7, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button7);
+
+ button9 = gtk_button_new_with_label (_("Gis"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button9, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button9);
+
+ button11 = gtk_button_new_with_label (_("Ais"));
+ gtk_box_pack_start (GTK_BOX (buttons2), button11, TRUE, FALSE, 0);
+// gtk_signal_connect (GTK_OBJECT (button), "clicked",
+// GTK_SIGNAL_FUNC (HideCallDialog), (gpointer) inCallDialog.dialog);
+// GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
+// gtk_widget_grab_default (button);
+ gtk_widget_show (button11);
+
+ gtk_widget_show (buttons2);
+
+ /* Keyboard */
+ keyboard = gtk_fixed_new();
+ gtk_widget_set_usize( keyboard, 504, 160 );
+ gtk_box_pack_start(GTK_BOX(hbox),keyboard,FALSE,FALSE,0);
+
+ gtk_signal_connect(GTK_OBJECT (keyboard), "button_press_event",
+ GTK_SIGNAL_FUNC (KeyboardButtonPress), &hbox);
+ gtk_signal_connect(GTK_OBJECT (keyboard), "button_release_event",
+ GTK_SIGNAL_FUNC (KeyboardButtonRelease), &hbox);
+
+ gtk_widget_add_events(keyboard, GDK_FOCUS_CHANGE_MASK|
+ GDK_BUTTON_PRESS_MASK|GDK_BUTTON_RELEASE_MASK);
+
+ KeyboardCreateBlackPixmap(hbox, &pam[KIE_BLACK], "333333", "666666", "999999");
+ KeyboardCreateBlackPixmap(hbox, &pam[KIE_BLACKSEL], "000000", "333333", "666666");
+
+ for (i = 0; i < 6; i += 2)
+ {
+ KeyboardCreateWhitePixmap(hbox, &pam[KIE_WHITEL + i],
+ whitestarts[i / 2], "FFFFFF", "999999", "CCCCCC");
+ KeyboardCreateWhitePixmap(hbox, &pam[KIE_WHITELSEL + i],
+ whitestarts[i / 2], "CCCCCC", "666666", "999999");
+ }
+
+ for (i = 0; i < WHITE_COUNT - 1; i++)
+ {
+ PixmapAndMask * b = &pam[KIE_BLACK];
+ if (xwhi[i % 7] == 2) continue;
+ blacks[i] = gtk_pixmap_new( b->pixmap, b->mask );
+ gtk_fixed_put( GTK_FIXED(keyboard), blacks[i], 16 + 24 * i, 0 );
+ }
+
+ for (i = 0; i < WHITE_COUNT; i++)
+ {
+ int j = xwhi[i % 7];
+ whites[i] = gtk_pixmap_new( pam[j].pixmap, pam[j].mask );
+ gtk_fixed_put( GTK_FIXED(keyboard), whites[i], 24 * i, 0 );
+ }
+
+ gtk_widget_show(keyboard);
+}
+
+void GUI_ShowRingtonesWindow (void)
+{
+ gtk_widget_show_all(GUI_RingtonesWindow);
+}
--- /dev/null
+/*
+
+ X G N O K I I
+
+ A Linux/Unix GUI for Nokia mobile phones.
+
+ Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#ifndef XGNOKII_XRING_H
+#define XGNOKII_XRING_H
+
+#include <assert.h>
+
+enum {
+ KIE_BLACK, KIE_BLACKSEL,
+ KIE_WHITEL, KIE_WHITELSEL,
+ KIE_WHITEM, KIE_WHITEMSEL,
+ KIE_WHITER, KIE_WHITERSEL,
+ KIE_COUNT
+};
+
+#define WHITE_COUNT 21 /* how many keys on the keyboard */
+
+#define BLACK_PRESSED 64
+#define WHITE_PRESSED 128
+
+typedef struct
+{
+ GdkPixmap * pixmap;
+ GdkBitmap * mask;
+} PixmapAndMask;
+
+extern void GUI_ShowRingtonesWindow ();
+extern void GUI_CreateRingtonesWindow ();
+
+#endif