17:39
[skypekit:skypekit.git] / skypekit_2.0.0.190_29281_CB30 / examples / cpp / tutorial / step9 / tutorial_9.cpp
1 /****************************************************************************
2
3 Getting Started With SkypeKit. Tutorial Application, Step 9.
4
5 This program will take two command-linearguments:
6  1. skypename
7  2. password
8
9  It will wait for incoming contact authorization request from remote party
10  and display a notification message on screen.
11
12 **/
13
14 #ifdef _WIN32
15 #include "Windows.h"
16 #else
17 #include <unistd.h>
18 #endif
19
20 #include "skype-embedded_2.h"
21 #include "skype-tcp-transport.h"
22 #include "app_token.h"
23
24 using namespace Sid;
25
26 SEString inetAddr           = "127.0.0.1";
27 uint portNum                = 8963;
28
29 bool LoggedIn               = false;
30 bool LoggedOut              = false;
31
32 SEString MyAccountName;
33 SEString MyAccountPsw;
34
35 SETCPTransport* transport   = 0;
36
37 void debugOut(const char* out)
38 {
39     //printf("%s", out);
40 }
41
42 void Delay(int Ms)
43 {
44         #ifdef _WIN32
45                 Sleep(Ms);
46         #else
47                 sleep(Ms);
48         #endif
49 };
50
51 class MyAccount : public Account
52 {
53 public:
54     typedef DRef<MyAccount, Account> Ref;
55     MyAccount(unsigned int oid, SERootObject* root);
56     ~MyAccount() {};
57
58     void OnChange(int prop);
59 };
60
61 MyAccount::MyAccount(unsigned int oid, SERootObject* root) : Account(oid, root) {};
62
63 void MyAccount::OnChange(int prop)
64 {
65     if (prop == Account::P_STATUS)
66     {
67         Account::STATUS LoginStatus;
68         GetPropStatus(LoginStatus);
69         if (LoginStatus == Account::LOGGED_IN)      { LoggedIn  = true; };
70         if (LoginStatus == Account::LOGGED_OUT)         { LoggedOut = true; };
71     };
72 };
73
74 class MyContactGroup : public ContactGroup
75 {
76 public:
77     typedef DRef<MyContactGroup, ContactGroup> Ref;
78     MyContactGroup(unsigned int oid, SERootObject* root);
79     ~MyContactGroup() {};
80         void OnChange(const ContactRef& contact);
81 };
82
83 MyContactGroup::MyContactGroup(unsigned int oid, SERootObject* root) : ContactGroup(oid, root) {};
84
85 void MyContactGroup::OnChange(const ContactRef& contact)
86 {
87         // This method will fire for all contact groups. As we are only interersted in
88         // one particular group - CONTACTS_WAITING_MY_AUTHORIZATION we will need to check
89         // the P_TYPE property.
90         ContactGroup::TYPE Type;
91         GetPropType(Type);
92         if (Type == ContactGroup::CONTACTS_WAITING_MY_AUTHORIZATION)
93         {
94                 SEString AuthRequestText;
95                 contact->GetPropReceivedAuthrequest(AuthRequestText);
96
97                 if (!AuthRequestText.isEmpty())
98                 {
99                         SEString ContactSkypeName;
100                         contact->GetPropSkypename(ContactSkypeName);
101                         printf("Auth. request from: %s - %s\n", (const char*)ContactSkypeName, (const char*)AuthRequestText);
102                         // Possible values: NONE, AUTHORIZED_BY_ME, BLOCKED_BY_ME
103                         if (contact->SetBuddyStatus(Contact::AUTHORIZED_BY_ME))
104                         {
105                                 printf("%s is now authorized\n", (const char*)ContactSkypeName);
106                         }
107                         else
108                         {
109                                 printf("Authorization failed.\n");
110                         };
111                 };
112         };
113 };
114
115
116 //---------------------------------------------------------------------------------------
117
118 class MySkype : public Skype
119 {
120 public:
121     MySkype(SETransport* transport) : Skype(transport) {}
122     ~MySkype() {}
123     Account* newAccount(int oid) {return new MyAccount(oid, this);}
124     ContactGroup* newContactGroup(int oid) {return new MyContactGroup(oid, this);}
125 };
126
127
128 //---------------------------------------------------------------------------------------
129 // Main
130
131 MySkype* skype = 0;
132
133 int main(int argc, char * argv[])
134 {
135     printf("*****************************************************************\n");
136     printf(" Getting Started With SkypeKit. Tutorial, Step 9.\n");
137     printf("*****************************************************************\n");
138
139     if (argc < 4)
140     {
141         printf("usage: tutorial_9 <skypename> <password> <remote_skypename>\n");
142         return 0;
143     };
144
145     MyAccountName = argv[1];
146     MyAccountPsw = argv[2];
147
148     printf("Creating transport ..\n");
149     transport = new SETCPTransport(inetAddr, portNum);
150     printf("Creating skype ..\n");
151     skype = new MySkype(transport);
152     skype->log = &(debugOut);
153
154     skype->init();
155     skype->start();
156
157     printf("Submitting application token..\n");
158     skype->SetApplicationToken(AppToken);
159
160     printf("Retrieving account ..\n");
161     MyAccount::Ref A;
162
163     if (skype->GetAccount(MyAccountName, A))
164     {
165         printf("Logging in..\n");
166         A->LoginWithPassword(MyAccountPsw, false, true);
167         while (!LoggedIn) {Delay(1);};
168         printf("Loggin complete.\n");
169
170         // Here we will get ourselves a MyContactGroup object, so that we will get
171         // OnChange events when an incoming auth. request occurs.
172         MyContactGroup::Ref WaitingForAuthList;
173         skype->GetHardwiredContactGroup(ContactGroup::CONTACTS_WAITING_MY_AUTHORIZATION , WaitingForAuthList);
174
175         // The following may look just like a decoration but in fact, you will -have- to
176         // read at least one property of the object (WaitingForAuthList) to start gettting
177         // OnChange events. Nrofcontacts property will do nicely but any property should do.
178         uint Waiters;
179         WaitingForAuthList->GetPropNrofcontacts(Waiters);
180         printf("Currently waiting for authorization : %d\n", Waiters);
181
182         // The rest of the interesting stuff will take place in MyContactGroup::OnChange
183
184         char Ch;
185         printf("Waiting for incoming auth requests..\n");
186         printf("Press ENTER to quit.\n");
187         Ch = getchar();
188
189         printf("Logging out..\n");
190         A->Logout(false);
191
192         while (!LoggedOut) {Delay(1);};
193         printf("Logout complete.\n");
194     }
195     else
196     {
197         printf("Account does not exist\n");
198     };
199
200     printf("Cleaning up.\n");
201     skype->stop();
202     skype->cleanup();
203     delete skype;
204     delete transport;
205     printf("Done.\n");
206     return 0;
207 };
208