On-line: Andrey, гостей 0. Всего: 1 [подробнее..]
АвторСообщение
постоянный участник




Пост N: 253
Зарегистрирован: 27.07.08
ссылка на сообщение  Отправлено: 16.03.21 21:55. Заголовок: Облачные сервисы (WebDAV, CalDAV &Co)


После некоторого разбирательства с прогой удалось организовать импорт из ICAL-файлов и экспорт в оные. Но тут шеф захотел, чтобы был прямой контакт с CalDav через интернет. Я знаю, что на питоне такое возможно. На дельфине и даже Xojo (RealBasic) тоже - через спецбиблиотеку. Но как реализовать подключение к облачному сервису в Harbour/Minigui?

Возможно ли это вообще?

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 171 , стр: 1 2 3 4 5 6 7 8 9 All [только новые]


постоянный участник


Пост N: 1619
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 17:59. Заголовок: Dr. Oldwarez пишет: ..


Dr. Oldwarez пишет:

 цитата:
Этак вот



Спасибо, прямо вот так взять процедуру и использовать не получится, но все же.
Позвольте дать несколько советов.

1) Вот так будет лучше
PROCEDURE SyncDlg(cTempDIR,cTempLW,cCALLOgin,cCALPWD,cCALName)
Если вы захотите использовать функцию еще где-нибудь, сделать это будет проще.

2) Используйте опции компилятора -w3 -es2
Это позволит вам избежать ошибок и код, возможно, работать будет быстрее.

Например мы получили Variable 'NN' is assigned but not used in function 'SYNCDLG(9)'
Действительно,
LOCAL nN:=1
и дальше
nN := 0
Значение nN, присвоенное при инициализации переменной не используется.

Вы можете в MinGUI добавить опции в батфайл для сборки
compile.bat myprogram /s -w3 /s -es2 %1 %2 %3 %4 %5 %6 %7 %8 %9
или прямо указать в коде

#pragma -w3
#pragma -es2

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1620
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 18:08. Заголовок: 3) По возможности ис..


3) По возможности используйте стандартные функции Harbour. Это поможет избежать ошибок, свойственных пользовательскому коду,
а также увеличит переносимость программ (кода) на другие платформы.

Ну и часто код выглядит лучше

LOCAL cXML:=cTempDIR+IIF(RIGHT(cTempLW,1)="\",'','\')+'listall_ics.xml'
==
LOCAL cXML:=cTempDIR+hb_DirSepAdd(cTempLW)+'listall_ics.xml'

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 273
Зарегистрирован: 27.07.08
ссылка на сообщение  Отправлено: 26.03.21 19:39. Заголовок: SergKis пишет: Для ..


SergKis пишет:

 цитата:
Для этого, вроде, все есть

c := DtoS(Date())
m := {}
FOR i := 1 TO 12 ; AAdd(m, left(cMonth(StoD( left(c,4)+strzero(i,2)+"01" )), 3))
NEXT
a := hb_ATokens("Mon, 15 Mar 2021 12:56:41 GMT"," ")
cDay := a[2]
cMes := a]3]
cGod := a[4]
cTim := a[5]
cMes := StrZero(AScan(m, cMes), 2)
cTim := StrTran(cTim, ":", "")
cDat := cGod+cMes+cDay+cTim



Вот что-то у меня совсем не то. aICS[ i ][2] - это и есть полный формат даты с днями недели и месяцами.
 
FOR i:=1 TO LEN(aICS)
IF DTIMETOS(aICS[ i ][2],1)>DTOS(dSyncDate)+'T'+STRTRAN(cSyncTime,":","")+'00Z'
AADD(aStrings,SUBSTR(aICS[ i ][1],RAT("/",aICS[ i ][1])+1))
ENDIF
NEXT i


И функция конвертации

FUNCTION DTIMETOS(cFull,nUTC) 
LOCAL c := DtoS(Date()),m := {},a:=ARRAY(7),cDat:='',cDay:='',cMonth:='',cYear:='',cTime:=''
FOR i := 1 TO 12
AAdd(m, left(cMonth(StoD( left(c,4)+strzero(i,2)+"01" )), 3))
NEXT

a := hb_ATokens(cFull," ")
IF LEN(a)>=5
cDay := a[2]
cMonth := a[3]
cYear := a[4]
cTime := a[5]
cMonth := StrZero(AScan(m, cMonth), 2)
cTime := StrTran(cTime, ":", "")
ENDIF
cDat := cYear+cMonth+cDay+'T'+cTime+'00Z'
RETURN CDat


При попытке обратиться к ней из IF выдаёт дикие ошибки обращения к массиву. Хотя значения в поле BROWSE выводит нормально. Это почему так?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 274
Зарегистрирован: 27.07.08
ссылка на сообщение  Отправлено: 26.03.21 19:41. Заголовок: Петр пишет: 3) По в..


Петр пишет:

 цитата:
3) По возможности используйте стандартные функции Harbour. Это поможет избежать ошибок, свойственных пользовательскому коду,
а также увеличит переносимость программ (кода) на другие платформы.

Ну и часто код выглядит лучше

LOCAL cXML:=cTempDIR+IIF(RIGHT(cTempLW,1)="\",'','\')+'listall_ics.xml'
==
LOCAL cXML:=cTempDIR+hb_DirSepAdd(cTempLW)+'listall_ics.xml'



Да, намного удобнее использовать готовые функции, а не изобретать велосипед. Но где к ним найти мануал?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1621
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 20:12. Заголовок: Dr. Oldwarez пишет: ..


Dr. Oldwarez пишет:

 цитата:
Да, намного удобнее использовать готовые функции, а не изобретать велосипед. Но где к ним найти мануал?



Например здесь

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1622
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 20:55. Заголовок: Dr. Oldwarez пишет: ..


Dr. Oldwarez пишет:

 цитата:
При попытке обратиться к ней из IF выдаёт дикие ошибки обращения к массиву. Хотя значения в поле BROWSE выводит нормально. Это почему так?


А что у вас в программе с настройками
set language to ??
или
hb_langSelect(??)

А заодно и set date to проверьте

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3647
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 26.03.21 20:55. Заголовок: Dr. Oldwarez пишет П..


Dr. Oldwarez пишет
 цитата:
При попытке обратиться к ней из IF выдаёт дикие ошибки обращения к массиву. Хотя значения в поле BROWSE выводит нормально. Это почему так?


 
FUNCTION DTIMETOS(cFull,nUTC)
LOCAL c := DtoS(Date()),m := {},a:=ARRAY(7),cDat:='',cDay:='',cMonth:='',cYear:='',cTime:=''
LOCAL i

FOR i := 1 TO 12
i перекрылось из процедуры выше с
FOR i:=1 TO LEN(aICS)


Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 317
Зарегистрирован: 05.11.05
ссылка на сообщение  Отправлено: 26.03.21 21:10. Заголовок: SergKis пишет: В Wi..


SergKis пишет:

 цитата:
В Windows 10 build 17063 и более поздних версиях теперь включен Curl



Я раньше использовал внешний Curl, потом в Минигуи перешел на внутренний, пока что проблем нет.
Есть ли у внешнего преимущества?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1623
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 21:15. Заголовок: rvu пишет: Я раньше..


rvu пишет:

 цитата:
Я раньше использовал внешний Curl, потом в Минигуи перешел на внутренний, пока что проблем нет.
Есть ли у внешнего преимущества?


Внутренний - это libcurl?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1624
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 21:35. Заголовок: Короче, curl написан..


Короче, curl написан с использованием функций libcurl

Парсер командной строки + функциональность libcurl

Понятно, что curl могут использовать не только программисты.
curl удобно использовать на этапе отладки.
С curl меньше шансов словить ошибку, не предусмотрев обработку результата выполнения библиотечных функций или неправильно заполнив какую-то структуру.
Вот и все.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1625
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 26.03.21 22:31. Заголовок: SergKis пишет: FUNC..


SergKis пишет:

 цитата:
FUNCTION DTIMETOS(cFull,nUTC)
LOCAL c := DtoS(Date()),m := {},a:=ARRAY(7),cDat:='',cDay:='',cMonth:='',cYear:='',cTime:=''
LOCAL i
FOR i := 1 TO 12
i перекрылось из процедуры выше с
FOR i:=1 TO LEN(aICS)



Кстати, вот вам наглядный пример почему нужно использовать -w3 -es2

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1627
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.21 00:12. Заголовок: Dr. Oldwarez пишет: ..


Dr. Oldwarez пишет:

 цитата:
IF DTIMETOS(aICS[ i ][2],1)>DTOS(dSyncDate)+'T'+STRTRAN(cSyncTime,":","")+'00Z'



Мне кажется - это не правильный подход.
В добавок к используемому еще со времен Clipper скалярному типу данных date, в Harbour добавлена поддержка типа timestamp (datetime).

tValue := t"2013-11-06;15:14:45"
tValue := hb_DateTime()

Вы можете создать поля баз данных этого типа, есть куча встроенных функций, можна применять разные операции, в т.ч. сравнения.

Поэтому правильнее будет написать функции конвертации ICS DateTime в Harbour TIMESTAMP (DateTime) и наоборот.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1628
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.21 00:18. Заголовок: Один из возможных ва..


Один из возможных вариантов реализации


 цитата:
// "Mon, 15 Mar 2021 12:56:41 GMT" 
FUNCTION DTimeToTS(cFull, cLang)
LOCAL m := GET_MONTHS(cLang)
LOCAL cMonth
LOCAL aDateTime

aDateTime := hb_ATokens(hb_defaultValue(cFull, "")," ")

IF LEN(aDateTime) >= 5
cMonth := StrZero(AScan(m, aDateTime[3]), 2)

RETURN hb_StrToTS(hb_strFormat("%s-%s-%s %s", aDateTime[4], cMonth, aDateTime[2], aDateTime[5]))
ENDIF

RETURN hb_StrToTS("")

STATIC FUNCTION GET_MONTHS(cL)
LOCAL cLang
LOCAL i, n, aMonths[12], dt := Date()

dt -= Day(dt) - 1

cLang := hb_langSelect(cL)
FOR i := 1 TO 12
n := Month( dt )
aMonths[ n ] := Left(CMonth(dt), 3)
dt += 31
dt -= Day(dt) - 1
NEXT
hb_langSelect(cLang)

RETURN aMonths




Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1629
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.21 00:28. Заголовок: Проверочный код (кон..


Проверочный код (консоль)



 цитата:
 
//C:\MiniGUI\SAMPLES\MySamples\DateTime\demo.prg

REQUEST HB_LANG_RU
REQUEST HB_CODEPAGE_RU1251
REQUEST HB_CODEPAGE_RU866

FUNCTION main()

hb_cdpSelect( "RU1251" )
hb_langSelect("RU")
hb_setTermCP( "RU866", "RU1251" )

?? CMonth(hb_DateTime())
?
? hb_DateTime()
? DTimeToTS("Mon, 15 Mar 2021 12:56:41 GMT", "en")
? hb_DateTime() > DTimeToTS("Mon, 15 Mar 2021 12:56:41 GMT", "en")

RETURN 0




Если вы используете harbour из поставки MiniGUI ваш compile.bat должен выглядеть так

 цитата:
call ..\..\..\batch\compile.bat demo /c %1 %2 %3 %4 %5 %6 %7 %8 %9



PS. почему я спрашивал про set language to .. догадаетесь сами.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1632
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.21 01:06. Заголовок: 4) Вызов внешних про..


4) Вызов внешних программ

RUN (cRun)

Вызов внешних программ без проверки возвращаемых ими кодов ошибок является неиссякаемым источником ошибок.
Тем более если такие программы работают с сетью.

Но команда RUN - это обертка встроенной __Run(), а эта функция совместима с Clipper и результатов не возвращает.
Значит нужно использовать hb_Run()

#define CURLE_OK 0

nResult := hb_Run(cRun)

IF nResult == CURLE_OK
// Все хорошо, начинаем обработку данных
ELSE
// Обработчик ошибок
END
Список кодов ошибок, которые может вернуть curl

P.S. Для своего проекта можно позаимствовать hbcurl.ch из contrib\hbcurl даже не используя hbcurl

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1633
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.21 01:20. Заголовок: 5) Использование hb..


5) Использование hb_StrFormat

 цитата:

 
#define _DIR_BIN_ (hb_DirBase() + "utils")
..
LOCAL cArgs
LOCAL cCurlOpt := "--no-progress-meter -k"
LOCAL cLogin := "illya@kleeblatt.com"
LOCAL cPwd := "**********"
LOCAL cCalDav := "https://webmail.kleeblatt.com"
LOCAL cHRef := "rpc.php/calendars/illya@kleeblatt.com/calendar~GhGVum1xWexaffEfhiVkNN7"
...
// Формируем строку вызова
cArgs := hb_StrFormat(;
'%s\curl %s -u%s:%s -X PROPFIND "%s%s"', _DIR_BIN_, cCurlOpt, cLogin, cPwd, cCalDav, cHRef)
? cArgs




Крайне удобно и позволяет переопределять строку аргументов on the fly.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3648
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.21 01:42. Заголовок: Петр пишет Один из в..


Петр пишет
 цитата:
Один из возможных вариантов реализации


TimeStamp возможный вариант , но он содержит миллисекунды за Timestamp.123, т.е.
нельзя делать hhb_DateTime() == DTimeToTS("Mon, 15 Mar 2021 12:56:41 GMT", "en")
На мой взгляд, с ics больше подходит строковый формат, только без всяких T и 00Z внутри,
если иметь ввиду индексы с участием строковых дат и событий календаря, то ключ получается
проще в работе, если учесть хранение в dbf данных в символьном виде (физически), то нет лишних
телодвижений rdd по преобразованию данных. Вид даты "2021031512541" больше подходит в данном
случае, а TimeStamp в типах =@T или производных от них. Но это мое понимание ситуации.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1635
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 27.03.21 01:54. Заголовок: SergKis пишет: нель..


SergKis пишет:

 цитата:
нельзя делать hhb_DateTime() == DTimeToTS("Mon, 15 Mar 2021 12:56:41 GMT", "en")


Это еще почему?

ts := hb_StrToTS("2021-03-15 12:56:41")
? ts == DTimeToTS("Mon, 15 Mar 2021 12:56:41 GMT", "en")

TimeStamp в harbour поддерживает ISO 8601 и совместим с большинством реализаций.
Операции с TimeStamp быстрее строковых операций.

Но вольному воля..

Спасибо: 1 
ПрофильЦитата Ответить
постоянный участник




Пост N: 3649
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 27.03.21 02:20. Заголовок: Петр пишет ? hb_dat..


Петр пишет [quote]`
? hb_datetime()
результат
2021-03-27 01:04:47.133


 цитата:
Операции с TimeStamp быстрее строковых операций


Разговор о решениях с isc. Составьте выражения ключей индекса и ключей для scope
- выбрать выполненное за год\месяц\квартал\неделя\день ...
- выбрать не выполненное за год\месяц\квартал\неделя\день ...
...
строковые решения будут проще. А так конечно, решать не нам, что и как делать

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 275
Зарегистрирован: 27.07.08
ссылка на сообщение  Отправлено: 27.03.21 10:52. Заголовок: SergKis пишет: FUN..


SergKis пишет:

 цитата:
FUNCTION DTIMETOS(cFull,nUTC)
LOCAL c := DtoS(Date()),m := {},a:=ARRAY(7),cDat:='',cDay:='',cMonth:='',cYear:='',cTime:=''
LOCAL i
FOR i := 1 TO 12
i перекрылось из процедуры выше с
FOR i:=1 TO LEN(aICS)



Вот спасибо!!!
Заработало!

Теперь надо встречное движение делать - из DBF в календарь. Это означает, генерить пакет ics-ов и забрасывать их в календарь уже хорошо знакомым CURLом. Выбирать все, чья автозаносимая дата создания позже даты последней синхронизации. Можно их в один ics запихнуть, или опять каждому событию - по своему ICSу, и потом уже циклом закидывать их в календарь.

Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 171 , стр: 1 2 3 4 5 6 7 8 9 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 252
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет