17:39
[skypekit:skypekit.git] / skypekit_2.0.0.190_29281_CB30 / examples / cpp / tutorial / step4 / tutorial_4.cpp
1 /****************************************************************************
2
3 Getting Started With SkypeKit. Tutorial Application, Step 4.
4
5 In this example we will write a program to
6
7  1. Populate the contact list
8  2. Catch contact online status updates
9
10 **/
11
12 #ifdef _WIN32
13 #include "Windows.h"
14 #else
15 #include <unistd.h>
16 #endif
17
18 #include "skype-embedded_2.h"
19 #include "skype-tcp-transport.h"
20 #include "app_token.h"
21
22 using namespace Sid;
23
24 SEString inetAddr           = "127.0.0.1";
25 uint portNum                = 8963;
26
27 bool LoggedIn               = false;
28 bool LoggedOut              = false;
29
30 SEString MyAccountName;
31 SEString MyAccountPsw;
32
33 SETCPTransport* transport   = 0;
34
35
36 void debugOut(const char* out)
37 {
38     //printf("%s", out);
39 }
40
41 void Delay(int Ms)
42 {
43         #ifdef _WIN32
44                 Sleep(Ms);
45         #else
46                 sleep(Ms);
47         #endif
48 };
49
50 //---------------------------------------------------------------------------------------
51 // Subclassing Contact
52
53 class MyContact : public Contact
54 {
55 public:
56     typedef DRef<MyContact, Contact> Ref;
57     MyContact(unsigned int oid, SERootObject* root);
58     ~MyContact() {};
59
60     void OnChange(int prop);
61 };
62
63 MyContact::MyContact(unsigned int oid, SERootObject* root) : Contact(oid, root) {};
64
65 void MyContact::OnChange(int prop)
66 {
67    if (prop == Contact::P_AVAILABILITY)
68    {
69         SEString Name;
70                 SEString StatusAsText;
71                 Contact::AVAILABILITY Availability;
72                 GetPropDisplayname(Name);
73                 GetPropAvailability(Availability);
74
75                 switch (Availability)
76                 {
77                         case Contact::UNKNOWN : StatusAsText = "UNKNOWN"; break;
78                         case Contact::PENDINGAUTH : StatusAsText = "PENDINGAUTH"; break;
79                         case Contact::BLOCKED : StatusAsText = "BLOCKED"; break;
80                         case Contact::BLOCKED_SKYPEOUT : StatusAsText = "BLOCKED_SKYPEOUT"; break;
81                         case Contact::SKYPEOUT : StatusAsText = "SKYPEOUT"; break;
82                         case Contact::OFFLINE : StatusAsText = "OFFLINE"; break;
83                         case Contact::OFFLINE_BUT_VM_ABLE : StatusAsText = "OFFLINE_BUT_VM_ABLE"; break;
84                         case Contact::OFFLINE_BUT_CF_ABLE : StatusAsText = "OFFLINE_BUT_CF_ABLE"; break;
85                         case Contact::ONLINE : StatusAsText = "ONLINE"; break;
86                         case Contact::AWAY : StatusAsText = "AWAY"; break;
87                         case Contact::NOT_AVAILABLE : StatusAsText = "NOT_AVAILABLE"; break;
88                         case Contact::DO_NOT_DISTURB : StatusAsText = "DO_NOT_DISTURB"; break;
89                         case Contact::SKYPE_ME : StatusAsText = "SKYPE_ME"; break;
90                         case Contact::INVISIBLE : StatusAsText = "INVISIBLE"; break;
91                         case Contact::CONNECTING : StatusAsText = "CONNECTING"; break;
92                         case Contact::ONLINE_FROM_MOBILE : StatusAsText = "ONLINE_FROM_MOBILE"; break;
93                         case Contact::AWAY_FROM_MOBILE : StatusAsText = "AWAY_FROM_MOBILE"; break;
94                         case Contact::NOT_AVAILABLE_FROM_MOBILE : StatusAsText = "NOT_AVAILABLE_FROM_MOBILE"; break;
95                         case Contact::DO_NOT_DISTURB_FROM_MOBILE : StatusAsText = "DO_NOT_DISTURB_FROM_MOBILE"; break;
96                         case Contact::SKYPE_ME_FROM_MOBILE : StatusAsText = "SKYPE_ME_FROM_MOBILE"; break;
97                         default : StatusAsText = "UNKNOWN"; 
98                 };
99
100         printf("%s is now %s\n", (const char*)Name,(const char*)StatusAsText);
101    };
102 };
103
104 //---------------------------------------------------------------------------------------
105 // Subclassing Account
106
107 class MyAccount : public Account
108 {
109 public:
110     typedef DRef<MyAccount, Account> Ref;
111     MyAccount(unsigned int oid, SERootObject* root);
112     ~MyAccount() {};
113
114     void OnChange(int prop);
115 };
116
117 MyAccount::MyAccount(unsigned int oid, SERootObject* root) : Account(oid, root) {};
118
119 void MyAccount::OnChange(int prop)
120 {
121     if (prop == Account::P_STATUS)
122     {
123         Account::STATUS LoginStatus;
124         GetPropStatus(LoginStatus);
125         if (LoginStatus == Account::LOGGED_IN)        { LoggedIn  = true; };
126         if (LoginStatus == Account::LOGGED_OUT)       { LoggedOut = true; };
127     };
128 };
129
130 //---------------------------------------------------------------------------------------
131 // Subclassing Skype
132
133 class MySkype : public Skype
134 {
135 public:
136     MySkype(SETransport* transport) : Skype(transport) {}
137     ~MySkype() {}
138     Account* newAccount(int oid) {return new MyAccount(oid, this);}
139     Contact* newContact(int oid) {return new MyContact(oid, this);}
140 };
141
142 //---------------------------------------------------------------------------------------
143 // Main
144
145 MySkype* skype = 0;
146
147 int main(int argc, char * argv[])
148 {
149     printf("*****************************************************************\n");
150     printf(" SkypeKit Tutorial, Step 4. - Contacts and online status events.\n");
151     printf("*****************************************************************\n");
152
153     if (argc < 3)
154     {
155         printf("usage: tutorial_4 <skypename> <password>\n");
156         return 0;
157     };
158
159     MyAccountName = argv[1];
160     MyAccountPsw = argv[2];
161
162     printf("Creating transport ..\n");
163     transport = new SETCPTransport(inetAddr, portNum);
164     printf("Creating skype ..\n");
165     skype = new MySkype(transport);
166     skype->log = &(debugOut);
167
168     skype->init();
169     skype->start();
170
171     printf("Submitting application token..\n");
172     skype->SetApplicationToken(AppToken);
173
174     printf("Retrieving account ..\n");
175     MyAccount::Ref A;
176
177     if (skype->GetAccount(MyAccountName, A))
178     {
179         printf("Logging in..\n");
180         A->LoginWithPassword(MyAccountPsw, false, true);
181         while (!LoggedIn) {Delay(1);};
182         printf("Loggin complete.\n");
183
184         ContactGroup::Ref SkypeNamesContactGroup;
185         skype->GetHardwiredContactGroup(ContactGroup::SKYPE_BUDDIES, SkypeNamesContactGroup);
186
187         ContactRefs MyContactList;
188         SkypeNamesContactGroup->GetContacts(MyContactList);
189
190         int ContactCount = MyContactList.size();
191         for (int I = 0; I < ContactCount; I++)
192         {
193             SEString Name = MyContactList[I]->GetProp(Contact::P_DISPLAYNAME);
194             printf("%d. %s\n", I+1, (const char*)Name);
195         };
196
197         char Ch;
198         printf("Waiting for contact status change events..\n");
199         printf("Press ENTER to quit.\n");
200         Ch = getchar();
201
202         printf("Logging out..\n");
203         A->Logout(false);
204
205         while (!LoggedOut) {Delay(1);};
206         printf("Logout complete.\n");
207     }
208     else
209     {
210         printf("Account does not exist\n");
211     };
212
213     printf("Cleaning up.\n");
214     skype->stop();
215     skype->cleanup();
216     delete skype;
217     delete transport;
218     printf("Done.\n");
219     return 0;
220 };