Siêu thị PDFTải ngay đi em, trời tối mất

Thư viện tri thức trực tuyến

Kho tài liệu với 50,000+ tài liệu học thuật

© 2023 Siêu thị PDF - Kho tài liệu học thuật hàng đầu Việt Nam

Open source messaging application development
PREMIUM
Số trang
393
Kích thước
18.6 MB
Định dạng
PDF
Lượt xem
1806

Open source messaging application development

Nội dung xem thử

Mô tả chi tiết

Open Source Messaging

Application Development:

Building and Extending Gaim

SEAN EGAN

Egan_467-3Front.fm Page i Monday, June 27, 2005 11:00 AM

Open Source Messaging Application Development: Building and Extending Gaim

Copyright © 2005 by Sean Egan

All rights reserved. No part of this work may be reproduced or transmitted in any form or by any means,

electronic or mechanical, including photocopying, recording, or by any information storage or retrieval

system, without the prior written permission of the copyright owner and the publisher.

ISBN (pbk): 1-59059-467-3

Printed and bound in the United States of America 9 8 7 6 5 4 3 2 1

Trademarked names may appear in this book. Rather than use a trademark symbol with every occurrence

of a trademarked name, we use the names only in an editorial fashion and to the benefit of the trademark

owner, with no intention of infringement of the trademark.

Lead Editor: Jason Gilmore

Technical Reviewer: Nathan Walp

Editorial Board: Steve Anglin, Dan Appleman, Ewan Buckingham, Gary Cornell, Tony Davis, Jason Gilmore,

Jonathan Hassell, Chris Mills, Dominic Shakeshaft, Jim Sumser

Associate Publisher: Grace Wong

Project Manager: Beth Christmas

Copy Edit Manager: Nicole LeClerc

Copy Editor: Candace English

Production Manager: Kari Brooks-Copony

Production Editor: Kelly Winquist

Compositor: Susan Glinert and Wordstop Technologies Pvt. Ltd., Chennai

Proofreader: Linda Seifert

Indexer: Broccoli Information Services

Artist: Kinetic Publishing Services, LLC

Cover Designer: Kurt Krames

Manufacturing Manager: Tom Debolski

Distributed to the book trade in the United States by Springer-Verlag New York, Inc., 233 Spring Street, 6th

Floor, New York, NY 10013, and outside the United States by Springer-Verlag GmbH & Co. KG,

Tiergartenstr. 17, 69112 Heidelberg, Germany.

In the United States: phone 1-800-SPRINGER, fax 201-348-4505, e-mail [email protected], or visit

http://www.springer-ny.com. Outside the United States: fax +49 6221 345229, e-mail [email protected],

or visit http://springer.de.

For information on translations, please contact Apress directly at 2560 Ninth Street, Suite 219, Berkeley, CA

94710. Phone 510-549-5930, fax 510-549-5939, e-mail [email protected], or visit http://www.apress.com.

The information in this book is distributed on an “as is” basis, without warranty. Although every

precaution has been taken in the preparation of this work, neither the author(s) nor Apress shall have any

liability to any person or entity with respect to any loss or damage caused or alleged to be caused directly

or indirectly by the information contained in this work.

The source code for this book is available to readers at http://www.apress.com in the Downloads section.

Egan_467-3Front.fm Page ii Monday, June 27, 2005 11:00 AM

For Dad

Egan_467-3Front.fm Page iii Monday, June 27, 2005 11:00 AM

Egan_467-3Front.fm Page iv Monday, June 27, 2005 11:00 AM

v

Contents at a Glance

About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xv

About the Technical Reviewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii

Acknowledgments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

CHAPTER 1 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

CHAPTER 2 The Open Source Development Process . . . . . . . . . . . . . . . . . . . . . . 23

CHAPTER 3 Development Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

CHAPTER 4 Programming Gaim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

CHAPTER 5 GTK+ Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

CHAPTER 6 Advanced GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

CHAPTER 7 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

CHAPTER 8 Protocol Plug-Ins. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

CHAPTER 9 Internationalization. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

CHAPTER 10 Portability. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

INDEX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

Egan_467-3Front.fm Page v Monday, June 27, 2005 11:00 AM

Egan_467-3Front.fm Page vi Monday, June 27, 2005 11:00 AM

vii

Contents

About the Author . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .xv

About the Technical Reviewer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xvii

Acknowledgments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xix

Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . xxi

■CHAPTER 1 Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

History of IM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1

History of Gaim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2

Setting Up Your Build Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

Cygwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

MinGW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

Library Dependencies. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

Getting Gaim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

Configuring Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

Compiling Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

Using Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Adding a New Account. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

Accounts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

Buddy List . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17

Preferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Conversations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19

Tools. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21

■CHAPTER 2 The Open Source Development Process . . . . . . . . . . . . . . . . . . 23

Open Source versus Free Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23

Why the Open Source Development Process Works . . . . . . . . . . . . . . . . . 24

Organization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

Motivations of Open Source Developers . . . . . . . . . . . . . . . . . . . . . . 27

How the Open Source Development Process Works . . . . . . . . . . . . . . . . . 29

Meritocracy . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29

Cathedral and the Bazaar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

Contents

Egan_467-3Front.fm Page vii Monday, June 27, 2005 11:00 AM

viii ■CONTENTS

Contributing to Open Source Development. . . . . . . . . . . . . . . . . . . . . . . . . 31

Getting Started . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Climbing the Ranks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

Managing Your Own Open Source Project . . . . . . . . . . . . . . . . . . . . . . . . . 34

Becoming a Maintainer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

Management Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36

■CHAPTER 3 Development Tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Editors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

Emacs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

vi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42

IDEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45

GCC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

How a Program Is Built. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

Invoking GCC. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49

make . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Makefile Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

Implicit Rules. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Multiple Directories . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53

Autotools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

Automake. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56

Autoconf. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

Other Required Files. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

autogen.sh. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60

Using the Build Environment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

Running Your Application Within GDB . . . . . . . . . . . . . . . . . . . . . . . . 61

Analyzing Core Dumps with GDB . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

Debugging Segfaults . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

Versioning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

Branches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

Using CVS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

ViewCVS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73

SourceForge.net. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Submitting a Tracker Item. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

Managing Tracker Items . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

Egan_467-3Front.fm Page viii Monday, June 27, 2005 11:00 AM

■CONTENTS ix

■CHAPTER 4 Programming Gaim. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

Compiling Your First Plug-In: helloworld.c. . . . . . . . . . . . . . . . . . . . . . 85

Anatomy of a Gaim Plug-in. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

GAIM_INIT_PLUGIN. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

GaimPluginInfo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

plugin_load() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

#include Statements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Object-Oriented Programming . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

Abstraction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95

Polymorphism . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Object-Oriented C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Objects . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

Inheritance. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99

Accessor and Mutator Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

Linked Lists . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

Hash Tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

Trees . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

The Gaim API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

Core/UI Split. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106

GaimAccount (account.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

GaimConnection (connection.h) . . . . . . . . . . . . . . . . . . . . . . 108

GaimConversation (conversation.h) . . . . . . . . . . . . . . . . . 109

GaimBuddyList (blist.h) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

■CHAPTER 5 GTK+ Basics . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

Overview of GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

Architecture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

Language Bindings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

Anatomy of a GTK+ Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

The gtk_init() Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

The Main Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

User Interface Principles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Elegance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

GNOME HIG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

Egan_467-3Front.fm Page ix Monday, June 27, 2005 11:00 AM

x ■CONTENTS

Creating Dialogs in GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Widget Packing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Container Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

Event Listeners. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

Callbacks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

A Sample GTK+ Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137

Gaim Signals . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

GTK+ Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

GtkLabel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

GtkImage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140

GtkProgressBar . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141

GtkEntry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143

GtkSpinButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

GtkButton. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147

GtkToggleButton. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

GtkCheckButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

GtkRadioButton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152

GtkTextView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

GtkTreeView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

GtkComboBox . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163

GtkToolbar. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164

GtkMenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

GtkDialog. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

GtkFileChooserDialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171

A Gaim Plug-in Example . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 172

Gaim Plug-in Boilerplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173

The Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

Using Gaim Signals. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

Scanning Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175

Hooking into Account Actions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

Creating the GUI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

The Entire Plug-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187

Potential Enhancements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

Egan_467-3Front.fm Page x Monday, June 27, 2005 11:00 AM

■CONTENTS xi

■CHAPTER 6 Advanced GTK+ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

A Sample Plug-In . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

GObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199

Object-Oriented Features of GObject . . . . . . . . . . . . . . . . . . . . . . . . 199

Using GObject . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

Creating a Composite Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

GdkPixbuf . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

Working with Image Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

GdkPixbufLoader. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

Animations. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221

Pango . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

PangoLayout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222

PangoAttribute . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223

GDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

The X Window System . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

GdkDrawable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

Drawing Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

Overriding GtkWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

Data Fields of GtkWidget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232

Overriding Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233

Receiving Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235

■CHAPTER 7 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

Networking . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

The OSI Seven-Layer Model . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238

Domain Name Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

Connecting to a Server. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

Accepting Connections from Clients. . . . . . . . . . . . . . . . . . . . . . . . . 248

Reading and Writing Data to a Socket . . . . . . . . . . . . . . . . . . . . . . . 252

Non-blocking I/O. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

select() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

fd_set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254

timeval . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254

Non-Blocking Sockets with select() . . . . . . . . . . . . . . . . . . . . . . 255

Integrating into GLib’s Main Loop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255

GIOChannel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

g_io_add_watch(). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256

Egan_467-3Front.fm Page xi Monday, June 27, 2005 11:00 AM

xii ■CONTENTS

A Sample Gaim Plug-in . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

The Boilerplate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257

plugin_load() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

incoming_cb() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259

create_response() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260

The Final Plug-In. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261

Possible Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

■CHAPTER 8 Protocol Plug-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

Protocol Design . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

Packet Framing. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

Packet Headers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269

Packet Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271

Protocol Implementation in C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

Binary Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

Text Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277

Learning Protocols . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280

Reverse Engineering. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280

Legal Ramifications of Reverse Engineering . . . . . . . . . . . . . . . . . . 281

Packet Sniffing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283

Reverse Engineering Techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

Interfacing with Gaim . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

server.c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288

GaimPluginProtocolInfo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289

Command Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

Program Flow of a prpl. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297

■CHAPTER 9 Internationalization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299

Internationalization Defined . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300

Text Encoding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

ASCII. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

Foreign Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302

iconv. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

Knowing What Encodings to Use . . . . . . . . . . . . . . . . . . . . . . . . . . . 305

Unicode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306

Code Points . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306

Encodings . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307

UTF-8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307

Egan_467-3Front.fm Page xii Monday, June 27, 2005 11:00 AM

■CONTENTS xiii

Translations with gettext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308

An Overview of gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

Setting Up gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310

Coding with gettext. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312

Translating with gettext . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

Using Translations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

gettext Summarized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

■CHAPTER 10 Portability. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

The C Programming Language. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319

History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320

K&R, ANSI, and C99 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321

libc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323

Tips on Writing Portable C Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324

POSIX. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325

Porting to Windows with MinGW . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

Cygwin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

Windows Compatibility Libraries. . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

GLib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327

Portable Macros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

Utility Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329

Memory Allocation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330

File Management . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

Plug-Ins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

GDK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333

X11 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333

Win32. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334

WIMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335

Summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335

■INDEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

Egan_467-3Front.fm Page xiii Monday, June 27, 2005 11:00 AM

Egan_467-3Front.fm Page xiv Monday, June 27, 2005 11:00 AM

Tải ngay đi em, còn do dự, trời tối mất!